# Technical Documentation: udecode/plate

> ℹ️ **Provenance:** Multi-Tier Ingestion · [CodeWiki Reference](https://codewiki.google/github.com/udecode/plate)

### Overview (`README.md`)

<h1 align="center">
Plate
</h1>

<p>
<div align="center">
  <a href="https://www.npmjs.com/package/@platejs/core"><img src="https://img.shields.io/npm/dm/@platejs/core.svg" alt="Total Downloads"></a>
  <a target="_blank" href="https://github.com/udecode/plate/releases/latest"><img src="https://img.shields.io/github/v/release/udecode/plate" /></a>
  <a target="_blank" href="CONTRIBUTING.md"><img src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg" alt="PRs Welcome"></a>
  <a target="_blank" href="https://discord.gg/mAZRuBzGM3"><img src="https://img.shields.io/badge/chat-on%20discord-7289da.svg?sanitize=true" /></a>
  <a target="_blank" href="https://github.com/udecode/plate/blob/main/LICENSE"><img src="https://badgen.now.sh/badge/license/MIT" /></a>
</div>

[//]: # '  <a target="_blank" href="https://platejs.org/docs/playground" alt="Live Demo"><img src="https://img.shields.io/badge/Live%20Demo-blue" /></a>'
[//]: # 'Welcome to Plate, a rich-text editor framework designed for simplicity and efficiency. Plate consists of four main parts:'
[//]: #
[//]: # "1. **Core**: This is the heart of Plate. It's a special plugin system just for `slate-react`. We've made sure everything is neat and tidy, so it's easier for you to develop your project."
[//]: # '2. **Plugins**: We give you a big selection of plugin packages. They help make editor behaviors, hooks, serialization, and normalization better, among other things.'
[//]: # '3. **Primitives**: Besides the headless plugins, we also provide primitive hooks and components built on top of [Radix UI](https://www.radix-ui.com/). These are **unstyled** and accessible parts for making great design systems.'
[//]: # '4. **Components**: We know a good-looking start is important. So, we give you components created with Plate CLI and [shadcn/ui](https://ui.shadcn.com/). Use these as a starting point to create your own component library.'

## Templates

You can choose one of the following templates to get started:

| Option                                                                            | Plate | Plugins | AI  | Backend |
| --------------------------------------------------------------------------------- | ----- | ------- | --- | ------- |
| [Notion-like template](https://pro.platejs.org/docs/templates/potion)             | ✅    | ✅      | ✅  | ✅      |
| [Plate playground template](https://github.com/udecode/plate-playground-template) | ✅    | ✅      | ✅  |         |
| [Plate minimal template](https://github.com/udecode/plate-template)               | ✅    |         |     |         |

## Documentation

You can learn more about Plate by checking out our [documentation](https://platejs.org/docs).

## Contributing

To get started, check out our [contributing guide](CONTRIBUTING.md).

### Contributors

We'd love for you to join us! Whether it's through giving us a 🌟 star, making a 📥 pull request, or **sharing your plugins**, your help is always appreciated.

[](https://star-history.dera.page/#udecode/plate&Date)

Need more help? Join us on [Discord](https://discord.gg/mAZRuBzGM3). We're always here to guide you.

## 中文文档

您可以通过查看我们的[中文文档](tooling/cn/README.md)了解更多关于Plate的信息。如果您需要中文支持，欢迎加入我们的[Discord](https://discord.gg/mAZRuBzGM3)中文频道，我们的社区成员将很乐意用中文为您解答问题。

对于贡献者，我们也提供了[中文贡献指南](tooling/cn/CONTRIBUTING.md)，帮助您参与到Plate的开发中。

---

### Overview (`.changeset/README.md`)

# Changesets

Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works
with multi-package repos, or single-package repos to help you version and publish your code. You can
find the full documentation for it [in our repository](https://github.com/changesets/changesets)

We have a quick list of common questions to get you started engaging with this project in
[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md).

---

### Overview (`apps/www/README.md`)

# Documentation

This is the documentation for the Plate project.

## Usage

Anytime you make a change in the `registry` folder, run:

```bash
pnpm build:registry
```

## License

[MIT](./LICENSE)

---

### Overview (`benchmarks/editor/README.md`)

# Editor Evidence

This directory is an Evidence Kit lab for editor framework benchmark research.

It replaces the old standalone Next/Vite benchmark app. The default owner is
now evidence artifacts, not browser app scaffolding.

## Commands

```sh
npm run evidence:inspect
npm run research:list
npm run research:editor-frameworks:fetch
npm run test:evidence
npm run fuzz
npm run bench:evidence
npm run bench:rich-text:check
npm run bench:startup:check
npm run bench:package:gates
npm run bench:scope
npm run evidence:health
npm run evidence:refresh
npm run docs:perf
npm run docs:perf:search -- editor benchmark
npm run evidence:full
```

## Source Map

Primary target list:

- Slate v2
- Slate

Primary source config:

- `research/editor-frameworks-sources.json`

Primary benchmark registry:

- `research/benchmark-registry.json`

## Active Benchmark Matrix

`benchmarks/results/rich-text-editors-latest.json` is the broad benchmark
matrix. It imports active artifacts from `research/benchmark-registry.json`.
Old one-off benchmark JSON files do not count unless they are registered there.
The active scope is Slate v2 vs Slate only.

Measured Slate v2 families:

- React huge-document legacy compare
- React rerender breadth
- React huge-document overlays
- React huge-document browser trace
- React active typing breakdown
- Core normalization, query/ref observation, node transforms, text/selection,
  editor store, and refs/projection
- Core huge-document, normalization, observation, and history compares against
  Slate
- Clipboard large payload, collab readiness, and issue #6038 transaction
  execution rows

Local source targets:

- Slate v2
- Slate

Slate baseline rule:

- Use Slate chunk-on as the baseline. Do not emit chunk-off rows in active
  comparison output.

The first direct runtime comparison still lives in:

- `benchmarks/results/slate-v2-legacy-latest.json`

The comprehensive result lives in:

- `benchmarks/results/rich-text-editors-latest.json`

The health and next-action report lives in:

- `benchmarks/results/benchmark-health-latest.json`

## Rule

Do not restore the old app/template lab by default. Do not promote random
historical tmp JSON. Add a registry entry, target-owned adapter, fuzzer, corpus
case, benchmark row, or source-pass note when a comparison needs new evidence.

---

### Overview (`benchmarks/targets/README.md`)

# Benchmark Targets

This directory is the migration spine for Slate benchmark work.

The target registry answers one question: what benchmark decision are we
measuring, and how does an agent run or optimize it?

## Ownership

- Benchmark implementation lives beside the runtime/package code it measures.
- `benchmarks/targets/slate-v2.json` names active benchmark targets, cohorts,
  metrics, commands, correctness checks, artifacts, and source links.
- Autoresearch sessions optimize one target id at a time.
- Evidence Kit is a legacy import/report archive until generated reports move
  to this registry.

## Commands

```bash
pnpm bench:targets:list
pnpm bench:targets:check
pnpm bench:targets:report
pnpm bench:targets:report:check
pnpm bench:targets:dry-run -- react-active-typing-breakdown
pnpm bench:targets:run -- react-active-typing-breakdown
node tooling/scripts/bench-targets.mjs autoresearch-init react-active-typing-breakdown
```

`bench:targets:dry-run` is read-only. It checks the registry and prints the
Autoresearch setup plan for the target. Use `autoresearch-init` only when you
want to create or replace the real `.tmp/slate-v2/autoresearch.*` session files.
For operator workflows, invoke the `slate-ar*` skills instead of package
scripts.

Use `pnpm bench:targets:import-evidence-kit` only while migrating active rows
from `benchmarks/editor/research/benchmark-registry.json`. After the cutover,
edit target definitions here directly.

## Target Contract

Each target has:

- `id`: stable command-facing id
- `question`: decision the benchmark answers
- `owner`: runtime/package owner
- `family` and `kind`: grouping for reports
- `cwd` and `command`: repo-relative run location and command
- `metrics`: primary metric, direction, unit, and whether output prints
  `METRIC name=value`
- `correctness`: command that prevents speed wins from breaking editor behavior
- `artifacts`: result files produced by the target
- `docs`: supporting evidence links
- `migration`: temporary provenance while Evidence Kit is being retired

Benchmark output should move toward native `METRIC` and `ARTIFACT` lines. Until
then, Autoresearch can wrap timing with `metrics.printsMetric: false`.

## Generated Outputs

`pnpm bench:targets:report` writes:

- `benchmarks/targets/history/slate-v2-latest.json`
- `benchmarks/targets/reports/slate-v2.md`

These are the target-registry replacement for Evidence Kit's active
health/report surface. They summarize target status from registered artifacts.
They do not run expensive benchmarks.

`pnpm bench:targets:dry-run -- <target-id>` checks the registry, builds the
report model in memory, and asks Autoresearch for a setup plan for that target.
Use it before starting a real optimization loop.

---

### Overview (`docs/editor-behavior/README.md`)

# Editor Behavior Docs

This directory is the source of truth for editor-behavior standards and
coverage.

Use it to answer three different questions:

1. What is the decision model?
2. What behavior do we want?
3. What is actually covered right now?

## Start Here

- Read [markdown-standards.md](docs/editor-behavior/markdown-standards.md) first.
  It defines the authority methodology:
  - syntax specs first
  - choose references per concrete surface, not by broad category default
  - use candidate pools such as Typora, Obsidian, Google Docs, Notion,
    GitHub, and Milkdown as routing hints, not governing winners
- If you want to resume or operate this lane without re-reading everything,
  start with
  [commands/README.md](docs/editor-behavior/commands/README.md).

## File Guide

- [markdown-parity-matrix.md](docs/editor-behavior/markdown-parity-matrix.md)
  The family-level coverage gate.
  Use this to see:

  - which existing feature families are covered
  - what evidence exists
  - what is deferred
  - what still blocks a release

- [master-roadmap.md](docs/editor-behavior/master-roadmap.md)
  The canonical remaining implementation roadmap.
  Use this to see:

  - what is already closed
  - what still remains to implement
  - lane order and next-batch sequencing
  - which supporting plans own each remaining lane

- [editor-protocol-matrix.md](docs/editor-behavior/editor-protocol-matrix.md)
  The exhaustive scenario matrix.
  Use this to see:

  - the protocol schema for scenario-complete behavior coverage
  - row-level scenarios, authorities, and evidence mapping
  - scenario dimensions for full behavior coverage
  - which rows are tested, specified, partial, or deferred
  - which interaction classes are still deferred into the integration red suite

- [markdown-editing-spec.md](docs/editor-behavior/markdown-editing-spec.md)
  The normative behavior spec.
  Use this to see:

  - invariants
  - ownership rules
  - canonical behavior examples
  - locked policy calls

- [markdown-editing-reference-audit.md](docs/editor-behavior/markdown-editing-reference-audit.md)
  Reference evidence.
  Use this to see:

  - what the first Typora / Milkdown audit says
  - where that first audit still matters
  - where newer Obsidian research adds stronger product pressure
  - where Plate had to choose

- [editor-behavior-architecture.md](docs/research/systems/editor-behavior-architecture.md)
  Long-horizon architecture.
  Use this when the question is:
  - should behavior stay plugin-scattered?
  - what would a profile-driven model look like?
  - how would Plate support Typora / Obsidian / Notion / Docs-style profiles cleanly?

## Supporting Dirs

- execution notes live under [docs/plans](docs/plans)
  The main historical editor-behavior execution notes are:
  [2026-04-02-editor-behavior-major-execution.md](docs/plans/2026-04-02-editor-behavior-major-execution.md)
  and
  [2026-04-03-editor-protocol-matrix-completion.md](docs/plans/2026-04-03-editor-protocol-matrix-completion.md).
  Use them for batch history, not as the current gate source.
  Current gate truth belongs to
  [markdown-parity-matrix.md](docs/editor-behavior/markdown-parity-matrix.md).
  Current implementation-roadmap truth belongs to
  [master-roadmap.md](docs/editor-behavior/master-roadmap.md).
  This cleanup pass is tracked in
  [2026-04-03-editor-behavior-doc-structure.md](docs/plans/2026-04-03-editor-behavior-doc-structure.md)
- operator commands live under
  [commands](docs/editor-behavior/commands)
  Use this as the resume surface for reconsolidation, evidence refresh,
  re-interview, re-planning, and batch launch.

- [docs/research](docs/research)
  Compiled external-reference research.
  Use this for Typora-, Obsidian-, and Milkdown-derived source summaries,
  concepts, decisions, and system maps.

- `../raw`
  Private raw evidence layer.
  Use this for full third-party corpora when deeper verification is needed.

- [docs/solutions](docs/solutions)
  Reusable learnings, including the editor-behavior methodology docs that were
  moved out of this folder.

## Reading Order

### If you want the big picture

1. [markdown-standards.md](docs/editor-behavior/markdown-standards.md)
2. [editor-behavior-architecture.md](docs/research/systems/editor-behavior-architecture.md)
3. [markdown-parity-matrix.md](docs/editor-behavior/markdown-parity-matrix.md)
4. [master-roadmap.md](docs/editor-behavior/master-roadmap.md)

### If you want the current release gate

1. [markdown-parity-matrix.md](docs/editor-behavior/markdown-parity-matrix.md)
2. [commands/README.md](docs/editor-behavior/commands/README.md)
3. [2026-04-02-editor-behavior-major-execution.md](docs/plans/2026-04-02-editor-behavior-major-execution.md) only when you need the historical execution trail

### If you want to resume or maintain the lane

1. [commands/README.md](docs/editor-behavior/commands/README.md)
2. [master-roadmap.md](docs/editor-behavior/master-roadmap.md)
3. [markdown-parity-matrix.md](docs/editor-behavior/markdown-parity-matrix.md)
4. [2026-04-02-editor-behavior-major-execution.md](docs/plans/2026-04-02-editor-behavior-major-execution.md) when you need batch history

### If you want concrete behavior rules

1. [markdown-editing-spec.md](docs/editor-behavior/markdown-editing-spec.md)
2. [markdown-editing-reference-audit.md](docs/editor-behavior/markdown-editing-reference-audit.md)
3. [docs/research](docs/research) when you need the
   compiled external-reference layer behind the audit

### If you want exhaustive protocol coverage

1. [editor-protocol-matrix.md](docs/editor-behavior/editor-protocol-matrix.md)
2. [markdown-editing-spec.md](docs/editor-behavior/markdown-editing-spec.md)
3. [markdown-parity-matrix.md](docs/editor-behavior/markdown-parity-matrix.md)

## Practical Rule

- Use the spec to define behavior.
- Use the protocol matrix to enumerate exhaustive scenarios.
- Use the parity matrix to decide whether a family is covered enough.
- Use the audit when a rule needs external grounding.
- Use the architecture doc only when the question is structural, not behavioral.
- If two docs appear to say the same thing, the spec wins for law, the protocol
  matrix wins for exhaustive cases, and the parity matrix wins for ship gate.

---

### Overview (`docs/performance/README.md`)

# Performance Docs

This directory is the human-facing source of truth for Plate editor
performance work.

## Read Order

1. [editor-performance-master-plan.md](/Users/zbeyens/git/plate-2/docs/performance/editor-performance-master-plan.md)
   - the main program document
   - current state, key wins, remaining red lanes, and sequencing
2. [plate-vs-slate-benchmarks.md](/Users/zbeyens/git/plate-2/docs/performance/plate-vs-slate-benchmarks.md)
   - benchmark narrative and forensic history
   - use this when you need to understand why a cut mattered
3. [editor-performance-next-phase-consensus.md](/Users/zbeyens/git/plate-2/docs/performance/editor-performance-next-phase-consensus.md)
   - planning artifact for the earlier “what next” decision
   - useful for rationale, not for the latest numbers
4. [performance-benchmark-spec.md](/Users/zbeyens/git/plate-2/docs/performance/performance-benchmark-spec.md)
   - benchmark contract for the public Performance guide
   - defines scope, workloads, and claim boundaries
5. [2026-04-04-standalone-benchmark-gap-analysis.md](/Users/zbeyens/git/plate-2/docs/performance/2026-04-04-standalone-benchmark-gap-analysis.md)
   - why the standalone rich-markdown lab exposed a Plate mount gap
   - current diagnosis and next optimization targets
6. [2026-04-03-affinity-redesign-plan.md](/Users/zbeyens/git/plate-2/docs/performance/2026-04-03-affinity-redesign-plan.md)
   - plan for the hard-affinity code-mark redesign
7. [2026-04-03-remaining-basic-nodes-benchmark.md](/Users/zbeyens/git/plate-2/docs/performance/2026-04-03-remaining-basic-nodes-benchmark.md)
   - plan for the remaining `@platejs/basic-nodes` census extension

## Artifact Policy

- Durable markdown lives here.
- Raw benchmark JSON lives in [.tmp/](/Users/zbeyens/git/plate-2/.tmp/).
- Older docs may still mention `docs/plans/*.json` from before the raw
  artifact move. When that happens, prefer the matching file in `.tmp/`.
- Internal one-off planning/proof notes belong under `docs/plans/`, not
  here, unless they are directly useful to understanding the performance story.

## Release Snapshot

As of `2026-04-03`:

- plain core is good enough versus Slate
- insert-text perf is good enough
- `nodeId` is no longer the cliff
- the dedicated `nodeId` paste/import lane now exists, and it shows:
  - raw import is basically cheap
  - duplicate-id paste is the only remaining meaningful `withNodeId` hotspot
- code-affinity redesign landed and materially improved the worst core-plugin
  lane
- newly benchmarked remaining `basic-nodes` plugins split cleanly:
  - green enough: `KbdPlugin`, `SubscriptPlugin`, `SuperscriptPlugin`
  - still red: `HighlightPlugin`, `StrikethroughPlugin`

## What Is Left After Release

If we ship now, the meaningful remaining performance work is:

1. `HighlightPlugin`
   - currently still well behind Slate on the activated lane
2. `StrikethroughPlugin`
   - same story; cheap mark path still too expensive
3. Table selection
   - still a separate real hotspot, not solved by core editor work
4. Performance-doc cleanup
   - some historical JSON artifact links still need cleanup/consolidation

## What Is Not Worth Chasing Right Now

- more cheap-mark surgery on bold/italic/underline
- insert-text perf
- more init-time `nodeId` surgery without a new duplicate-paste result
- chunking rhetoric without a new workload
- more code-affinity tuning unless behavior bugs appear

---

### Overview (`docs/research/README.md`)

# Agent Research Layer

This is the compiled research layer for Plate.

It exists to give future agents a stable, low-token, persistent reference
surface that sits between raw evidence and day-to-day task execution.

This is not a human PKM system. It is not an Obsidian workflow. It is not a
generic RAG bucket.

The raw evidence layer lives outside this repo in `../raw` relative to the
Plate repo root. That private repo is assumed to be cloned locally when agents
need to verify or deepen compiled summaries.

## Core idea

Most agent work still behaves like raw RAG:

- read the repo
- search scattered docs
- search issues, plans, and learnings
- stitch the answer together again from scratch

That works, but it wastes tokens and keeps rediscovering the same decisions,
the same caveats, and the same contradictions.

The better model is a compiled research layer:

- raw evidence stays in `../raw`
- compiled summaries, decisions, concepts, and system maps live here
- agents read this layer first
- agents drop to `../raw` only when they need verification, conflict
  resolution, or deeper evidence

The valuable artifact is not one answer in one chat. It is the maintained
markdown layer that makes the next agent faster and less likely to repeat old
mistakes.

## Layers

### 1. Raw evidence

Private, source-heavy, and often copyright-sensitive material.

Expected location:

- `../raw`

Examples:

- captured third-party editor docs
- screenshots
- extracted page text
- local corpora
- transcripts
- external-source inventories

This layer is the evidence base. It is not the default answer surface.

### Raw acquisition policy

Prefer the strongest stable acquisition method:

1. official git repo clone
2. official export or local cache
3. page capture or scrape only when no better source exists

If an official git repo exists, use that as the canonical raw source instead of
inventing a scrape.

Examples:

- Milkdown: official repo cloned under `../raw/milkdown/repo`
- Obsidian: official help and developer-docs repos cloned under `../raw/obsidian`
- Typora: local cached corpus copied into `../raw/typora`

### Raw snapshot metadata

Every raw source family should record enough metadata that future agents can
trust what they are reading.

Record at least:

- canonical source URL or repo URL
- local raw path
- snapshot date
- current revision when available:
  - git commit hash for repos
  - fetched timestamp for caches or exports
- lightweight counts when useful

### Raw sync policy

Do not refresh every raw source on every task. That is wasteful and noisy.

Refresh raw sources when:

- the area is active in the current task
- drift matters to the decision
- the source has likely changed since the last meaningful ingest

When a raw source is refreshed:

- update its raw README or metadata
- append `../raw/log.md`
- refresh affected compiled pages if the new evidence changes them

### 2. Compiled research

This directory, `docs/research`, is the agent-facing compiled layer.

It contains:

- source summaries
- decisions
- concepts
- systems
- entities
- open questions
- index and log files

This layer should be:

- concise
- metadata-first
- link-heavy
- easy to grep
- safe to keep in the public repo

### 3. Agent contract

Agents should treat this directory as the default read layer for repo
knowledge.

The rule is simple:

1. read `docs/research/index.md`
2. read the relevant compiled pages
3. only then drop to `../raw` or broader repo search

## Design rules

### Stable paths beat cute structure

Keep the layout boring and guessable.

Current top-level structure:

- `index.md`
- `log.md`
- `schema.md`
- `commands/`
- `sources/`
- `decisions/`
- `concepts/`
- `systems/`
- `entities/`
- `open-questions/`

Do not split the research layer into parallel goal-specific silos like:

- `editor-behavior/`
- `architecture/`
- `plate-v2/`
- `slate-v2/`

That looks tidy for a week and then turns into duplicate pages and drifting
taxonomy.

Use one research layer, many domains, one page-type system.

`commands/` is the one intentional support surface that is not a knowledge-type
bucket. It exists for repeatable operational workflows, not for domain pages.

### One concept per file

Do not build giant mixed essays.

Good:

- one file for one source summary
- one file for one decision
- one file for one concept
- one file for one system map
- one file for one entity

Bad:

- giant pages that mix multiple concerns and force future agents to dig through
  noise

### Organize by knowledge type, not by temporary project goal

This research layer should be DRY at the page-type level.

Use:

- `sources/` for compiled source summaries
- `entities/` for concrete named things
- `concepts/` for reusable abstractions and vocabulary
- `systems/` for larger maps and architecture surfaces
- `decisions/` for explicit conclusions
- `open-questions/` for unresolved ambiguity

Do not duplicate the same thing across multiple goal folders.

Examples:

- one page for `Typora`
- one page for `Slate`
- one page for `directional-affinity`
- one page for `inline-void-atom`
- one page for `editor-architecture-landscape`
- one page for `footnote-refs-are-inline-void-atoms`

That page can serve many goals:

- editor-behavior work
- Plate v2 architecture work
- Slate v2 comparison work
- plugin-system analysis

The page type stays stable even when the project focus changes.

### Claims point outward

This research layer is a normalized interpretation layer, not a vibe layer.

Durable claims should point to evidence in:

- `../raw`
- repo files
- source-of-truth docs
- plans
- learnings

### Compiled pages stay derived

Do not copy raw third-party docs into this repo.

This research layer should contain:

- paraphrased summaries
- normalized decisions
- compact cross-source synthesis
- Plate-specific conclusions

This research layer should not contain:

- screenshots from vendor docs
- raw captured pages
- one-to-one source-card layers
- long source-shaped summaries
- quote-heavy mirrors of external docs

Rule of thumb:

- one source file -> one summary card = raw layer
- many source files -> one synthesized page = research layer

### Promote durable knowledge only

This research layer is not where every exploratory note goes.

Only promote content here when it is:

- reusable
- likely to matter again
- stable enough to deserve a home
- clearer as a maintained page than as one-off chat or scratch analysis

Leave temporary exploration in `docs/analysis` or `docs/plans`.

### Coverage gaps are expected unless agents maintain them proactively

This research layer will fail if agents only update it reactively from the narrow task in
front of them.

Failure modes:

- a task touches only one source, but other relevant raw evidence in `../raw`
  never gets ingested
- a raw source exists, but no compiled source page was ever written
- a compiled page exists, but the relevant decision or concept page was never
  updated
- the agent answers from the visible local slice and misses a gap somewhere
  else in the corpus

So the maintenance model cannot be "update whatever file the current task
happened to mention." That is how holes accumulate.

## Page types

### `commands/`

Operational command specs for repeatable agent workflows.

Use this for:

- full research passes
- maintenance passes
- gap-detection workflows
- ingest workflows

Do not use it to store domain knowledge itself.

### `schema.md`

The minimal metadata contract for page types in this layer.

Keep it small and stable.

### `index.md`

The entrypoint catalog.

This is what an agent should read first.

It should answer:

- what exists
- where it lives
- what each page is for

### `log.md`

Append-only history of meaningful wiki operations.

Use it for:

- new source ingests
- important restructures
- lint passes
- major corrections

Do not turn it into a second index.

### `sources/`

Compiled summaries of raw evidence.

Each source summary should say:

- what the source is
- what it added
- what it confirmed
- what it contradicted
- what compiled pages it should affect

This is where source-specific work belongs. If a page still mostly smells like
"what this source said", it probably belongs in `sources/`.

### `decisions/`

Canonical repo-relevant choices.

These pages should say:

- the question
- the chosen answer
- the reason
- competing options
- source refs
- blast radius

If a page answers "what won?", it belongs in `decisions/`.

### `concepts/`

Shared vocabulary and abstractions.

These pages should say:

- what the term means
- what it is not
- where it is used

If a page answers "what does this idea mean across the repo?", it belongs in
`concepts/`.

### `systems/`

Architecture or authority maps.

These pages should say:

- boundaries
- ownership
- important internal links
- how to navigate the area

If a page answers "how does this whole area fit together?", it belongs in
`systems/`.

### `entities/`

Concrete named things.

Examples:

- editors
- reference products
- Plate packages
- plugins

If a page is about one concrete named thing, it belongs in `entities/`.

### `open-questions/`

Known ambiguity that should not be silently “resolved” by agent confidence.

Use this to preserve real uncertainty.

If a page answers "we still do not know", it belongs in `open-questions/`.

## Relationship To Other Docs

This repo should use three different layers for three different jobs.

### `docs/analysis`

Scratch and exploratory thinking.

Use it for:

- workbench comparisons
- candidate lists
- ranking drafts
- architecture exploration
- temporary synthesis that is not stable yet

This is where something like
[editor-architecture-candidates.md](docs/analysis/editor-architecture-candidates.md)
starts.

### `docs/research`

Compiled reusable knowledge.

Use it for:

- source summaries worth keeping
- reusable concept pages
- architecture maps worth reusing
- entity pages that future agents will need
- explicit decisions

This is the research brain.

### `docs/editor-behavior`

Normative law and ship gate.

Use it for:

- authority model
- behavior law
- exhaustive protocol rows
- release gating

This is the law layer, not the research archive.

### Rule Of Thumb

- `docs/analysis` = exploratory
- `docs/research` = compiled reusable knowledge
- `docs/editor-behavior` = normative spec

Do not make one directory do all three jobs.

## Migration Rules

When migrating existing docs into the research layer:

1. do not move a file just because it exists
2. first ask what job the file is doing:
   - scratch exploration
   - compiled knowledge
   - normative law
3. only move it into `docs/research` if it is durable compiled knowledge

### Good migration examples

- a source-heavy comparison doc becomes:
  - one `systems/...` page
  - several `entities/...` pages
  - maybe a few `decisions/...` pages
- repeated terminology explanations become `concepts/...`
- repeated product or repo summaries become `entities/...`

### Bad migration examples

- dumping `docs/analysis/*` wholesale into `docs/research`
- copying `docs/editor-behavior/*` into `docs/research` just to have a second copy
- making one giant "Slate v2 + Plate v2 + plugins + references" page

### Specific guidance for architecture work

Something like
[editor-architecture-candidates.md](docs/analysis/editor-architecture-candidates.md)
should not be copied as one giant research page.

Its durable parts should decompose into pages like:

- `systems/editor-architecture-landscape.md`
- `entities/prosemirror.md`
- `entities/lexical.md`
- `entities/slate.md`
- `entities/tiptap.md`
- later, if needed, `decisions/...` pages for explicit Plate choices

## Core operations

### Ingest

When new evidence arrives:

1. read the raw source
2. classify what it affects
3. write or update a source summary
4. update any impacted decision, concept, system, or entity pages
5. update `index.md`
6. append `log.md`

Ingest alone is not enough. It only handles known sources that were already
noticed.

### Query

When answering a task:

1. start from `index.md`
2. read the relevant compiled pages
3. answer from the compiled research layer first
4. verify against raw evidence when needed

### Lint

Periodically check for:

- stale claims
- duplicated concepts
- orphan pages
- dead terminology
- contradictions
- overgrown pages that should be split
- open questions that now have answers

Lint should also detect coverage gaps, not just stale wording.

## Autonomous Maintenance

This research layer should eventually be maintained by a dedicated autonomous skill or
workflow, not only by incidental task work.

Its job is to proactively improve both layers:

- the private raw evidence layer in `../raw`
- the compiled layer in `docs/research`

### Why this is needed

If the user asks a question about a goal area and the relevant evidence was
never ingested or compiled, the agent may miss the answer entirely.

That means the system must support:

- gap detection
- proactive ingest
- proactive compilation
- targeted refresh

without waiting for a human to notice every missing page manually.

### Recommended skill shape

The right future skill is something like:

- `research-maintainer`
- or `research-gap-filler`

Its mission is not just to summarize.
Its mission is to keep the reference system complete enough that future agents
do not fall through obvious holes.

### Inputs

The skill should accept a goal, area, or question such as:

- `editor behavior references`
- `plate v2 architecture`
- `slate v2 risks`
- `plugin model`

### Loop

Given a goal, the skill should:

1. infer the likely entities, systems, concepts, and decisions involved
2. scan `docs/research` for existing compiled coverage
3. scan `../raw` for relevant raw evidence
4. classify gaps:
   - raw missing
   - raw exists but compiled summary missing
   - compiled summary exists but decision/concept/system pages missing
   - stale compiled pages
   - contradictions between compiled pages
   - weakly sourced claims
5. fill the highest-value gaps it can safely fill
6. record what it changed in `log.md`
7. leave explicit `open-questions/...` pages where the gap cannot be filled yet

### Gap classes

Use these gap classes explicitly:

- **Raw gap**: no relevant evidence exists in `../raw`
- **Compile gap**: raw evidence exists, but `docs/research/sources/...` is missing
- **Synthesis gap**: source summaries exist, but no concept/system/decision page
  captures the reusable conclusion
- **Freshness gap**: compiled page exists, but newer evidence likely changed it
- **Contradiction gap**: two compiled pages disagree or point in different
  directions
- **Structure gap**: pages exist, but they are duplicated, orphaned, or split
  at the wrong boundaries

### Safe autofill rules

The skill should be aggressive about structure and conservative about claims.

Safe actions:

- create missing source summary pages from existing raw evidence
- add missing backlinks and `index.md` entries
- split giant mixed pages into clearer page types
- create entity or concept stubs when the source support is obvious
- open explicit question pages when evidence is still thin

Unsafe actions that need stronger evidence:

- inventing decisions without source support
- claiming coverage where only one weak source exists
- silently resolving contradictions
- creating fake completeness from repo-local vibes

### Output

Each run should leave:

- updated research pages
- updated `index.md`
- appended `log.md`
- explicit open questions for unresolved gaps

And, when useful, a concise gap report saying:

- what was missing
- what was filled
- what still needs raw evidence

### Trigger points

This maintenance skill should be used:

- before major research or migration tasks
- after finishing major research or migration tasks
- periodically as a research health pass
- whenever an agent notices it is answering from thin or incomplete coverage

### Rule of thumb

If the current task depends on a domain that feels bigger than the currently
visible pages, do not trust the visible pages alone.

Run a gap-detection pass first.

## Retrieval order

The default retrieval order is:

1. `docs/research`
2. primary raw evidence in `../raw`
3. broader repo search
4. external sources if still needed

If an agent searches the whole repo before checking `docs/research`, this layer is
failing its job.

## Operational Surface

The commands in `commands/` are the executable mental model for applying this
research layer in practice.

Start with:

- [commands/full-pipeline.md](docs/research/commands/full-pipeline.md)
- [commands/maintain.md](docs/research/commands/maintain.md)

That is the heavyweight command for improving the research layer from a goal or
domain instead of answering only from the currently visible slice.

Use [schema.md](docs/research/schema.md) to keep page
metadata consistent while the layer is still small.

## Initial scope

Start with one narrow evidence corpus from `../raw`, prove the ingest and
retrieval workflow, then expand to additional sources only after the first path
is stable.

## Agent rules

- never edit `../raw` while compiling conclusions unless the task is explicitly
  about curating raw evidence
- never add a durable claim here without evidence
- never flatten contradictions into fake certainty
- never treat compiled summaries as stronger than primary sources
- never let a reusable analysis die in chat if it belongs in this research layer

---

### Overview (`packages/ai/README.md`)

# Plate ai

Visit https://platejs.org/docs/ai to view the documentation.

## License

[MIT](../../LICENSE)

---

### Overview (`packages/basic-nodes/README.md`)

# Plate basic elements plugin

This package implements the basic elements in a single plugin:

- block quote
- code block
- heading
- paragraph

## Documentation

Check out
[Basic Elements](https://platejs.org/docs/basic-blocks).

## License

[MIT](../../LICENSE)

---

### Overview (`packages/basic-styles/README.md`)

# Plate basic styles

Visit https://platejs.org/docs/text-align to view the documentation.

## License

[MIT](../../LICENSE)

---

### Overview (`packages/callout/README.md`)

# Plate callout plugins

This package implements the callout block plugins for Plate.

## License

[MIT](../../LICENSE)

---

### Overview (`packages/code-block/README.md`)

# Plate code block plugin

This package implements the code block plugin for Plate.

## Documentation

Check out
[Basic Elements](https://platejs.org/docs/basic-blocks).

## License

[MIT](../../LICENSE)

---

### Overview (`packages/code-drawing/README.md`)

# Plate code-drawing plugin

This package implements the code-drawing plugin for Plate, supporting PlantUml, Graphviz, Flowchart, and Mermaid diagrams.

## Documentation

Check out [Code Drawing](https://platejs.org/docs/code-drawing).

## License

[MIT](../../LICENSE)

---

### Overview (`packages/combobox/README.md`)

# Plate combobox

This package implements the combobox for Plate.

## Documentation

Check out [Playground](https://platejs.org/docs/playground) and
[Combobox](https://platejs.org/docs/combobox).

## License

[MIT](../../LICENSE)

---

### Overview (`packages/comment/README.md`)

# Plate comments plugin

This package implements the comments plugin for Plate.

## Documentation

Check out [comments](https://platejs.org/docs/comment).

## License

[MIT](../../LICENSE)

---

### Overview (`packages/core/README.md`)

# Plate Core

This package provides the foundational structure of the Plate editor framework.

## Documentation

Visit https://platejs.org/docs/api/core to view the documentation.

## License

[MIT](./LICENSE)

---

### Overview (`packages/csv/README.md`)

# Plate CSV serializer plugin

This package implements the CSV serializer for Plate.

## Documentation

Check out [Playground](https://platejs.org/docs/playground).

## License

[MIT](../../LICENSE)

---

### Overview (`packages/cursor/README.md`)

# Plate Cursor Overlay

This package implements a cursor overlay for Plate.

## Documentation

Check out
[Cursor Overlay](https://platejs.org/docs/components/cursor-overlay).

## License

[MIT](../../LICENSE)

---

### Overview (`packages/date/README.md`)

# Plate date plugin

This package implements the date plugin for Plate.

## Documentation

Check out [date](https://platejs.org/docs/date).

## License

[MIT](../../LICENSE)

---

### Overview (`packages/diff/README.md`)

# Compute a diff of two Slate documents

## License

[See LICENSE](./LICENSE)

---

### Overview (`packages/dnd/README.md`)

# Plate Drag & Drop

Visit https://platejs.org/docs/dnd to view the documentation.

## License

[MIT](../../LICENSE)

---

### Overview (`packages/docx/README.md`)

# Plate Docx serializer plugin

This package implements the docx deserializer for Plate.

## Documentation

[comment]: <> (Check out [Serializing HTML]&#40;https://platejs.org/docs/html&#41;.)

## License

[MIT](../../LICENSE)

---

### Overview (`packages/emoji/README.md`)

# Plate emoji plugin

This package implements the emoji plugin for Plate.

## Documentation

Check out [Emoji](https://platejs.org/docs/emoji).

## License

[MIT](../../LICENSE)

---

### Overview (`packages/excalidraw/README.md`)

# Plate excalidraw plugin

This package implements the excalidraw plugin for Plate.

## Documentation

Check out
[Excalidraw](https://platejs.org/docs/excalidraw).

## License

[MIT](../../LICENSE)

---

### Overview (`packages/find-replace/README.md`)

# Plate find and replace plugin

This package implements the find and replace plugin for Plate.

## Documentation

Check out [Find & Replace](https://platejs.org/docs/find-replace).

## License

[MIT](../../LICENSE)

---

### Overview (`packages/floating/README.md`)

# Plate floating UI

This package implements the floating UI for Plate.

## Documentation

See Link, Mention.

## License

[MIT](../../LICENSE)

---

### Overview (`packages/footnote/README.md`)

# @platejs/footnote

Footnote plugins for Plate.

This package adds dedicated footnote reference and footnote definition nodes,
plus transforms and queries for inserting, resolving, navigating, and repairing
footnotes.

## Features

- Parse GFM footnote references and definitions into Plate nodes
- Serialize footnote nodes back to markdown footnotes
- Insert a reference and matching definition with one transform
- Allocate the next free numeric identifier automatically
- Create a missing definition for an unresolved reference
- Detect and repair later duplicate definitions
- Navigate between references and definitions

## Installation

```bash
npm install @platejs/footnote @platejs/markdown remark-gfm
```

## Usage

```tsx
import {
  FootnoteDefinitionPlugin,
  FootnoteReferencePlugin,
} from '@platejs/footnote/react';
import { MarkdownPlugin } from '@platejs/markdown';
import { createPlateEditor } from 'platejs/react';
import remarkGfm from 'remark-gfm';

const editor = createPlateEditor({
  plugins: [
    FootnoteReferencePlugin,
    FootnoteDefinitionPlugin,
    MarkdownPlugin.configure({
      options: {
        remarkPlugins: [remarkGfm],
      },
    }),
  ],
});
```

## Package Surface

Queries:

- `api.footnote.nextId`
- `api.footnote.definition`
- `api.footnote.definitions`
- `api.footnote.definitionText`
- `api.footnote.duplicateDefinitions`
- `api.footnote.duplicateIdentifiers`
- `api.footnote.hasDuplicateDefinitions`
- `api.footnote.isDuplicateDefinition`
- `api.footnote.isResolved`
- `api.footnote.references`

Transforms:

- `tf.insert.footnote`
- `tf.footnote.createDefinition`
- `tf.footnote.focusDefinition`
- `tf.footnote.focusReference`
- `tf.footnote.normalizeDuplicateDefinition`

## Documentation

- Footnote docs: https://platejs.org/docs/footnote
- Markdown docs: https://platejs.org/docs/markdown

## License

[MIT](../../LICENSE)

---

### Overview (`packages/indent/README.md`)

# Plate block indentation plugin

This package implements block indentation support for Plate.

## Documentation

Check out [Indentation](https://platejs.org/docs/indent).

## License

[MIT](../../LICENSE)

---

### Overview (`packages/juice/README.md`)

# Plate juice plugin

This package implements the juice plugin for Plate.

Given inserted HTML, [juice](https://www.npmjs.com/package/juice) will inline the CSS properties into the style attribute.

## Documentation

Check out
[Serializing HTML](https://platejs.org/docs/html).

## License

[MIT](../../LICENSE)

---

### Overview (`packages/link/README.md`)

# Plate link plugin

This package implements the link plugin for Plate.

## Documentation

Check out [Link](https://platejs.org/docs/link).

## License

[MIT](../../LICENSE)

---

### Overview (`packages/list-classic/README.md`)

# Plate list plugin

This package implements the list plugin for Plate.

## Documentation

Check out [List](https://platejs.org/docs/list-classic).

## License

[MIT](../../LICENSE)

---

### Overview (`packages/list/README.md`)

# Plate indent list plugin

This package implements the indent list plugin for Plate.
It's a mix of indent and list plugins, also called as a "flat list"
because the list structure has no children.

## Documentation

Check out [List](https://platejs.org/docs/list).

## License

[MIT](../../LICENSE)

---

### Overview (`packages/markdown/README.md`)

# Plate MD serializer plugin

This package implements the Markdown serializer for Plate.

## Documentation

Check out
[Serializing Markdown](https://platejs.org/docs/markdown).

## License

[MIT](./LICENSE)

---

### Overview (`packages/math/README.md`)

# Plate math plugin

This package implements the math plugin for Plate.

## Documentation

Check out [math](https://platejs.org/docs/math).

## License

[MIT](../../LICENSE)

---

### Overview (`packages/media/README.md`)

# Plate media plugins

This package implements the media plugins for Plate. It allows inserting
embeddable media such as images, YouTube or Vimeo videos and tweets into your
editor.

Includes:

- caption
- resizable
- media
- image
- iframe

## Documentation

- Check out [Media](https://platejs.org/docs/media).

## License

[MIT](../../LICENSE)

---

### Overview (`packages/mention/README.md`)

# Plate mention plugin

This package implements the mention plugin for Plate. It allows
autocompletion from user input.

## Documentation

Check out [Mention](https://platejs.org/docs/mention).

## License

[MIT](../../LICENSE)

---

### Overview (`packages/playwright/README.md`)

# Interact with a Plate editor from inside a Playwright test

## License

[See LICENSE](./LICENSE)

---

### Overview (`packages/selection/README.md`)

# Plate plugin for block selection

Plugin that allows you to select blocks in the drag area using the mouse or touch.

## Documentation

Check out
[Block Selection](https://platejs.org/docs/block-selection).

## License

[MIT](../../LICENSE)

---

### Overview (`packages/slash-command/README.md`)

# Plate slash commands plugin

This package implements the slash commands plugin for Plate.

## License

[MIT](../../LICENSE)

---

### Overview (`packages/slate/README.md`)

# Slate extension

## Documentation

Visit https://platejs.org/docs/api/slate to view the documentation.

## License

[MIT](../../LICENSE)

---

### Overview (`packages/suggestion/README.md`)

# Plate plugin for suggestion

## License

[MIT](../../LICENSE)

---

### Overview (`packages/tabbable/README.md`)

# Plate tabbable plugin

This package programmatically corrects the tab order for tabbable elements inside the editor

## Documentation

Check out
[Tabbable](https://platejs.org/docs/tabbable).

## License

[MIT](../../LICENSE)

---

### Overview (`packages/table/README.md`)

# Plate table plugin

This package implements the table plugin for Plate.

## Documentation

Check out [Table](https://platejs.org/docs/table).

## License

[MIT](../../LICENSE)

---

### Overview (`packages/tag/README.md`)

# Plate tag plugin

This package implements the tag plugin for Plate.

## Documentation

Check out [Tag](https://platejs.org/docs/tag).

## License

[MIT](../../LICENSE)

---

### Overview (`packages/test-utils/README.md`)

# Plate test utilities

This package implements the test utilities for Plate.

## License

[MIT](../../LICENSE)

---

### Overview (`packages/toc/README.md`)

# Table of Contents plugin

This package implements the table of contents plugin for Plate.

## Documentation

Check out
[Table of Contents](https://platejs.org/docs/toc).

## License

[MIT](../../LICENSE)

---

### Overview (`packages/toggle/README.md`)

# Plate toggle plugin

This package implements the toggle plugin for Plate.
It's similar to the indent list plugin, in that it relies on the indent of siblings.

## Documentation

Check out [Toggle](https://platejs.org/docs/toggle).

## Ideas to improve this plugin

1. Adding an option `initialValue` of open `toggleIds` and a callback `onChange`, for instance to store the state of open toggles in local storage and remember the state upon browser refresh.
2. Adding an option `defaultOpen`. Currently, toggles are closed on initial rendering.
3. Adding an option to specify how to get the indent value of elements, right now we are relying on this being the default `KEY_ELEMENT` from the `indent` plugin
4. An option to specify how to get the id of elements, right now we are using the default id attribute from the `node-id` plugin.
5. Adding a placeholder below the toggle, like Notion does, when the toggle is expanded without any elements below.
6. Make toggle button more accessible
7. When indenting an element right of a closed toggle, it becomes hidden. This makes sense, but a nicer UI would be to open the toggle in that case, like Notion does.

## License

[MIT](../../LICENSE)

---

### Overview (`packages/utils/README.md`)

# Plate utils

## Documentation

Visit https://platejs.org/docs/api/utils to view the documentation.

## License

[MIT](../../LICENSE)

---

### Overview (`packages/yjs/README.md`)

# Plate Yjs plugin

`@platejs/yjs` binds Plate editors to a shared Yjs document. It ships provider wrappers for IndexedDB, Hocuspocus, and WebRTC, and accepts custom providers that implement the same `UnifiedProvider` interface.

Read the main docs at [platejs.org/docs/yjs](https://platejs.org/docs/yjs).

## Installation

Install the plugin.

```bash
npm install @platejs/yjs
```

Install network provider packages as needed:

```bash
npm install @hocuspocus/provider
```

```bash
npm install y-webrtc
```

## Usage

Configure `YjsPlugin` with a `providers` array. Every configured provider receives the same plugin-owned `Y.Doc` and `Awareness` instance.

```tsx
import { YjsPlugin } from '@platejs/yjs/react';
import { createPlateEditor } from 'platejs/react';

const editor = createPlateEditor({
  plugins: [
    YjsPlugin.configure({
      options: {
        providers: [
          {
            type: 'indexeddb',
            options: {
              docName: 'document-1',
            },
          },
          {
            type: 'hocuspocus',
            options: {
              name: 'document-1',
              url: 'wss://collab.example.com',
            },
          },
          {
            type: 'webrtc',
            options: {
              roomName: 'document-1',
            },
          },
        ],
      },
    }),
  ],
  skipInitialization: true,
});
```

Call `init` after the editor mounts, and call `destroy` when it unmounts:

```tsx
await editor.getApi(YjsPlugin).yjs.init({
  id: 'document-1',
  value: initialValue,
});

editor.getApi(YjsPlugin).yjs.destroy();
```

## Providers

| Type | Package | Purpose | Options |
| --- | --- | --- | --- |
| `indexeddb` | `y-indexeddb` | Browser-local document persistence | `{ docName: string }` |
| `hocuspocus` | `@hocuspocus/provider` | WebSocket server collaboration | `HocuspocusProviderConfiguration` |
| `webrtc` | `y-webrtc` | Peer-to-peer collaboration | `{ roomName: string; signaling?: string[]; password?: string; maxConns?: number; peerOpts?: object }` |

Use the same document identifier across providers that should share one document. For example, pair `docName: 'document-1'` with `name: 'document-1'` or `roomName: 'document-1'`.

IndexedDB only persists Yjs updates locally. It does not transport awareness, cursors, or remote users; combine it with Hocuspocus or WebRTC for multi-user collaboration.

## Shared Documents

Pass `ydoc` when another part of your app owns the document:

```tsx
import * as Y from 'yjs';

const ydoc = new Y.Doc();

YjsPlugin.configure({
  options: {
    ydoc,
    providers: [
      {
        type: 'indexeddb',
        options: {
          docName: 'document-1',
        },
      },
    ],
  },
});
```

Use `sharedType` when the editor content lives inside a nested `Y.XmlText`:

```tsx
const parentDoc = new Y.Doc();
const editors = parentDoc.getMap('editors');
const mainContent = new Y.XmlText();

editors.set('main', mainContent);

YjsPlugin.configure({
  options: {
    sharedType: mainContent,
    ydoc: parentDoc,
    providers: [
      {
        type: 'indexeddb',
        options: {
          docName: 'document-1',
        },
      },
    ],
  },
});
```

## Custom Providers

Use a pre-instantiated provider directly when you need behavior outside the built-in wrappers:

```tsx
import type { UnifiedProvider } from '@platejs/yjs';

const provider: UnifiedProvider = new MyProvider({ awareness, doc: ydoc });

YjsPlugin.configure({
  options: {
    providers: [provider],
  },
});
```

Register reusable provider classes with `registerProviderType`:

```tsx
import { registerProviderType } from '@platejs/yjs';

registerProviderType('custom', CustomProviderWrapper);

YjsPlugin.configure({
  options: {
    providers: [
      {
        type: 'custom',
        options: {
          roomName: 'document-1',
        },
      },
    ],
  },
});
```

## License

[MIT](../../LICENSE)

---

### Overview (`templates/plate-playground-template/README.md`)

# Playground Template

A Next.js template with [Plate](https://platejs.org/) AI, plugins and components.

## Features

- Next.js 16
- [Plate](https://platejs.org/) editor
- [shadcn/ui](https://ui.shadcn.com/)
- [MCP](https://platejs.org/docs/components/mcp)

## Requirements

- Node.js 20+
- bun

## Installation

Choose one of these methods:

### 1. Using CLI (Recommended)

```bash
npx shadcn@latest add @plate/editor-ai
```

### 2. Using Template

[Use this template](https://github.com/udecode/plate-playground-template/generate), then install dependencies:

```bash
bun install
```

## Development

Copy the example env file:

```bash
cp .env.example .env.local
```

Configure `.env.local`:

- `UPLOADTHING_TOKEN` – UploadThing API key ([get one here](https://uploadthing.com/dashboard))

Enter your own [AI Gateway key](https://vercel.com/ai-gateway) in the editor settings to use AI. The example API routes use the caller's key.

Uploads work in local development. Before enabling production uploads, replace the development check in `src/lib/uploadthing.ts` with your application's session and permission checks. Add per-user upload limits.

If your application uses a shared server AI credential, authorize each request and enforce per-user usage limits before calling the provider. Keep server credentials out of client code.

Start the development server:

```bash
bun dev
```

Visit http://localhost:3000/editor to see the editor in action.

---

### Overview (`templates/plate-template/README.md`)

# Playground Template

A minimal template for building rich-text editors with [Plate](https://platejs.org/) and Next.js.

## Features

- Next.js 16
- [Plate](https://platejs.org/) editor
- [shadcn/ui](https://ui.shadcn.com/)
- [MCP](https://platejs.org/docs/components/mcp)

## Requirements

- Node.js 20+
- bun

## Installation

Choose one of these methods:

### 1. Using CLI (Recommended)

```bash
npx shadcn@latest add @plate/editor-basic
```

### 2. Using Template

[Use this template](https://github.com/udecode/plate-template/generate), then install dependencies:

```bash
bun install
```

## Development

```bash
bun dev
```

Visit http://localhost:3000/editor to see the editor in action.

## Upgrade

Using the CLI, you can upgrade to `editor-ai` by running:

```bash
npx shadcn@latest add @plate/editor-ai -o
```

---

### Overview (`tooling/cn/README.md`)

<h1 align="center">
Plate
</h1>

<p>
<div align="center">
  <a href="https://www.npmjs.com/package/@platejs/core"><img src="https://img.shields.io/npm/dm/@platejs/core.svg" alt="总下载量"></a>
  <a target="_blank" href="https://github.com/udecode/plate/releases/latest"><img src="https://img.shields.io/github/v/release/udecode/plate" /></a>
  <a target="_blank" href="tooling/CONTRIBUTING.md"><img src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg" alt="欢迎PR"></a>
  <a target="_blank" href="https://discord.gg/mAZRuBzGM3"><img src="https://img.shields.io/badge/chat-on%20discord-7289da.svg?sanitize=true" /></a>
  <a target="_blank" href="https://github.com/udecode/plate/blob/main/LICENSE"><img src="https://badgen.now.sh/badge/license/MIT" /></a>
</div>



[//]: # '  <a target="_blank" href="https://platejs.org/docs/playground" alt="在线演示"><img src="https://img.shields.io/badge/Live%20Demo-blue" /></a>'
[//]: # '欢迎使用Plate，一个为简洁和高效设计的富文本编辑器框架。Plate由四个主要部分组成：'
[//]: #
[//]: # '1. **核心**：这是Plate的心脏。它是专为`slate-react`设计的特殊插件系统。我们确保一切整洁有序，使您的项目开发更加轻松。'
[//]: # '2. **插件**：我们提供了丰富的插件包选择。它们有助于改进编辑器行为、钩子、序列化和规范化等功能。'
[//]: # '3. **原语**：除了无头插件外，我们还提供基于[Radix UI](https://www.radix-ui.com/)构建的原语钩子和组件。这些是**无样式**且可访问的部件，用于创建出色的设计系统。'
[//]: # '4. **组件**：我们知道一个好看的起点很重要。因此，我们提供使用Plate CLI和[shadcn/ui](https://ui.shadcn.com/)创建的组件。将这些作为起点来创建您自己的组件库。'

## 模板

您可以选择以下模板之一开始使用：

| 选项                                                                  | Plate | 插件 | AI  | 后端 |
| --------------------------------------------------------------------- | ----- | ---- | --- | ---- |
| [类Notion模板](https://pro.platejs.org/docs/templates/potion)         | ✅    | ✅   | ✅  | ✅   |
| [Plate演示模板](https://github.com/udecode/plate-playground-template) | ✅    | ✅   | ✅  |      |
| [Plate最小模板](https://github.com/udecode/plate-template)            | ✅    |      |     |      |

## 文档

您可以通过查看我们的[文档](https://platejs.org/cn/docs?locale=cn)了解更多关于Plate的信息。

## 贡献

要开始贡献，请查看我们的[贡献指南](./CONTRIBUTING.md)。

### 贡献者

我们希望您能加入我们！无论是给我们一个🌟星标，提交一个📥拉取请求，还是**分享您的插件**，您的帮助总是值得称赞的。

[](https://star-history.dera.page/#udecode/plate&Date)

需要更多帮助？加入我们的[Discord](https://discord.gg/mAZRuBzGM3)。我们随时为您提供指导。(可以在中文频道使用中文进行提问)

---

### Overview (`.agents/skills/autogoal/README.md`)

# Autogoal

Autogoal asks Codex to write a goal-backed plan ending with autoreview.

## Install

```sh
npx skills add udecode/dotai --skill autogoal
```

## Use

Use autogoal for non-trivial work with an auditable finish line:

- debugging loops
- migrations
- benchmarks
- architecture plans
- pass-gated reviews
- multi-step issue work

Skip it for one-off answers, typo fixes, or tiny edits where the final response
can carry the evidence.

## Flow

1. Define the outcome, completion threshold, verification surface, constraints,
   boundaries, and blocked condition.
2. Create or continue the active Codex goal with a short objective handle.
3. Create a plan from a built-in or project template and put the full contract
   there.
4. First checkpoint: copy every explicit prompt requirement into the plan as
   checkable rows before implementation.
5. Work in slices and record evidence as you go.
6. Run autoreview, then fix or record accepted findings.
7. Run the completion check.
8. Mark the goal complete only when the outcome is true and the plan passes.

## Helpers

```sh
node .agents/skills/autogoal/scripts/create-goal-scratchpad.mjs \
  --template task \
  --with browser \
  --title "short title"
```

```sh
node .agents/skills/autogoal/scripts/check-complete.mjs docs/plans/<plan>.md
```

```sh
node .agents/skills/autogoal/scripts/init-templates.mjs
```

## Templates

Autogoal ships generic templates in `skills/autogoal/assets/templates`.
Installed skills expose them under `.agents/skills/autogoal/assets/templates`.

Project repos can keep their own templates in `docs/plans/templates`; the helper
prefers project templates before built-in templates.

---

### Overview (`.agents/skills/react-useeffect/README.md`)

# React useEffect Best Practices

A comprehensive guide teaching when to use `useEffect` in React, and more importantly, when NOT to use it. This skill is based on official React documentation and provides practical alternatives to common useEffect anti-patterns.

## Purpose

Effects are an **escape hatch** from React's reactive paradigm. They let you synchronize with external systems like browser APIs, third-party widgets, or network requests. However, many developers overuse Effects for tasks that React handles better through other means.

This skill helps you:
- Identify when you truly need an Effect vs. when you don't
- Recognize common anti-patterns and their fixes
- Apply better alternatives like `useMemo`, `key` prop, and event handlers
- Write Effects that are clean, maintainable, and free from race conditions

## When to Use This Skill

Use this skill when you're:
- Writing or reviewing `useEffect` code
- Using `useState` to store derived values
- Implementing data fetching or subscriptions
- Synchronizing state between components
- Facing bugs with stale data or race conditions
- Wondering if your Effect is necessary

**Trigger phrases:**
- "Should I use useEffect for this?"
- "How do I fix this useEffect?"
- "My Effect is causing too many re-renders"
- "Data fetching with useEffect"
- "Reset state when props change"
- "Derived state from props"

## How It Works

This skill provides guidance through three key resources:

1. **Quick Reference Table** - Fast lookup for common scenarios with DO/DON'T patterns
2. **Decision Tree** - Visual flowchart to determine the right approach
3. **Detailed Anti-Patterns** - 9 common mistakes with explanations and fixes
4. **Better Alternatives** - 8 proven patterns to replace unnecessary Effects

The skill teaches you to ask the right questions:
- Is there an external system involved?
- Am I responding to a user event or component appearance?
- Can this value be calculated during render?
- Do I need to reset state when a prop changes?

## Key Features

### 1. Quick Reference Guide

Visual table showing the DO/DON'T for common scenarios:
- Derived state from props/state
- Expensive calculations
- Resetting state on prop change
- User event responses
- Notifying parent components
- Data fetching

### 2. Decision Tree

Clear flowchart that guides you from "Need to respond to something?" to the correct solution:
- User interaction → Event handler
- Component appeared → Effect (for external sync/analytics)
- Derived value needed → Calculate during render (+ useMemo if expensive)
- Reset state on prop change → Key prop

### 3. Anti-Pattern Recognition

Detailed examples of 9 common mistakes:
1. Redundant state for derived values
2. Filtering/transforming data in Effect
3. Resetting state on prop change
4. Event-specific logic in Effect
5. Chains of Effects
6. Notifying parent via Effect
7. Passing data up to parent
8. Fetching without cleanup (race conditions)
9. App initialization in Effect

Each anti-pattern includes:
- Bad example with explanation
- Good example with fix
- Why the anti-pattern is problematic

### 4. Better Alternatives

8 proven patterns to replace unnecessary Effects:
1. Calculate during render for derived state
2. `useMemo` for expensive calculations
3. `key` prop to reset state
4. Store ID instead of object for stable references
5. Event handlers for user actions
6. `useSyncExternalStore` for external stores
7. Lifting state up for shared state
8. Custom hooks for data fetching with cleanup

## Usage Examples

### Example 1: Derived State

**Bad - Unnecessary Effect:**
```tsx
function Form() {
  const [firstName, setFirstName] = useState('Taylor');
  const [lastName, setLastName] = useState('Swift');
  const [fullName, setFullName] = useState('');

  useEffect(() => {
    setFullName(firstName + ' ' + lastName);
  }, [firstName, lastName]);
}
```

**Good - Calculate during render:**
```tsx
function Form() {
  const [firstName, setFirstName] = useState('Taylor');
  const [lastName, setLastName] = useState('Swift');
  const fullName = firstName + ' ' + lastName; // Just compute it
}
```

### Example 2: Resetting State

**Bad - Effect to reset:**
```tsx
function ProfilePage({ userId }) {
  const [comment, setComment] = useState('');

  useEffect(() => {
    setComment('');
  }, [userId]);
}
```

**Good - Key prop:**
```tsx
function ProfilePage({ userId }) {
  return <Profile userId={userId} key={userId} />;
}

function Profile({ userId }) {
  const [comment, setComment] = useState(''); // Resets automatically
}
```

### Example 3: Data Fetching with Cleanup

**Bad - Race condition:**
```tsx
function SearchResults({ query }) {
  const [results, setResults] = useState([]);

  useEffect(() => {
    fetchResults(query).then(json => {
      setResults(json); // "hello" response may arrive after "hell"
    });
  }, [query]);
}
```

**Good - Cleanup flag:**
```tsx
function SearchResults({ query }) {
  const [results, setResults] = useState([]);

  useEffect(() => {
    let ignore = false;

    fetchResults(query).then(json => {
      if (!ignore) setResults(json);
    });

    return () => { ignore = true; };
  }, [query]);
}
```

### Example 4: Event Handler Instead of Effect

**Bad - Effect watching state:**
```tsx
function ProductPage({ product, addToCart }) {
  useEffect(() => {
    if (product.isInCart) {
      showNotification(`Added ${product.name}!`);
    }
  }, [product]);

  function handleBuyClick() {
    addToCart(product);
  }
}
```

**Good - Handle in event:**
```tsx
function ProductPage({ product, addToCart }) {
  function handleBuyClick() {
    addToCart(product);
    showNotification(`Added ${product.name}!`);
  }
}
```

## When You DO Need Effects

Effects are appropriate for:

- **Synchronizing with external systems** - Browser APIs, third-party widgets, non-React code
- **Subscriptions** - WebSocket connections, global event listeners (prefer `useSyncExternalStore`)
- **Analytics/logging** - Code that needs to run because the component displayed
- **Data fetching** - With proper cleanup (or use your framework's built-in mechanism)

## When You DON'T Need Effects

Avoid Effects for:

1. **Transforming data for rendering** - Calculate at the top level instead
2. **Handling user events** - Use event handlers where you know exactly what happened
3. **Deriving state** - Just compute it: `const fullName = firstName + ' ' + lastName`
4. **Chaining state updates** - Calculate all next state in the event handler
5. **Notifying parent components** - Call the callback in the same event handler
6. **Resetting state** - Use the `key` prop to create a fresh component instance

## Best Practices

### 1. Start Without an Effect

Before adding an Effect, ask: "Is there an external system involved?" If no, you probably don't need an Effect.

### 2. Prefer Derived State

If you can calculate a value from props or state, don't store it in state with an Effect updating it.

### 3. Use the Right Tool

- Expensive calculation → `useMemo`
- User interaction → Event handler
- Reset on prop change → `key` prop
- External subscription → `useSyncExternalStore`
- Shared state → Lift state up

### 4. Always Clean Up

If your Effect subscribes, fetches, or sets timers, return a cleanup function to prevent memory leaks and race conditions.

### 5. Avoid Effect Chains

Multiple Effects triggering each other causes unnecessary re-renders and makes code hard to follow. Calculate everything in one place (usually an event handler).

### 6. Test in Strict Mode

React 18+ Strict Mode mounts components twice in development to expose missing cleanup. If your Effect breaks, you need cleanup.

### 7. Consider Framework Solutions

For data fetching, prefer your framework's built-in solution (Next.js, Remix) or libraries (React Query, SWR) over manual Effects.

## Reference Files

This skill includes three detailed reference documents:

1. **SKILL.md** - Quick reference table and decision tree
2. **anti-patterns.md** - 9 common mistakes with detailed explanations
3. **alternatives.md** - 8 better alternatives with code examples

## Common Pitfalls

### Multiple Re-renders

**Symptom:** Component re-renders many times in quick succession.

**Cause:** Effect that sets state based on state it depends on, creating a loop.

**Fix:** Calculate the final value in an event handler or during render.

### Stale Data

**Symptom:** UI shows outdated values briefly before updating.

**Cause:** Using Effect to update derived state causes an extra render pass.

**Fix:** Calculate derived values during render instead of in state.

### Race Conditions

**Symptom:** Fast typing shows results for old queries after new ones.

**Cause:** Missing cleanup in data fetching Effect.

**Fix:** Use cleanup flag (`ignore` variable) or AbortController.

### Runs Twice in Development

**Symptom:** Effect runs twice on component mount in development.

**Cause:** React 18 Strict Mode intentionally mounts components twice to expose bugs.

**Fix:** Add proper cleanup. If it's app initialization that shouldn't run twice, use a module-level guard.

## Resources

This skill is based on:
- [React Official Docs: You Might Not Need an Effect](https://react.dev/learn/you-might-not-need-an-effect)
- [React Official Docs: Synchronizing with Effects](https://react.dev/learn/synchronizing-with-effects)
- [React Official Docs: Lifecycle of Reactive Effects](https://react.dev/learn/lifecycle-of-reactive-effects)

## Summary

The golden rule: **Effects are an escape hatch from React.** If you're not synchronizing with an external system, you probably don't need an Effect.

Before writing `useEffect`, ask yourself:
1. Is this responding to a user interaction? → Use event handler
2. Is this a value I can calculate from props/state? → Calculate during render
3. Is this resetting state when a prop changes? → Use key prop
4. Is this synchronizing with an external system? → Use Effect with cleanup

Follow these patterns, and your React code will be more maintainable, performant, and bug-free.

---

### Overview (`.agents/skills/vercel-react-best-practices/README.md`)

# React Best Practices

A structured repository for creating and maintaining React Best Practices optimized for agents and LLMs.

## Structure

- `rules/` - Individual rule files (one per rule)
  - `_sections.md` - Section metadata (titles, impacts, descriptions)
  - `_template.md` - Template for creating new rules
  - `area-description.md` - Individual rule files
- `src/` - Build scripts and utilities
- `metadata.json` - Document metadata (version, organization, abstract)
- __`AGENTS.md`__ - Compiled output (generated)
- __`test-cases.json`__ - Test cases for LLM evaluation (generated)

## Getting Started

1. Install dependencies:
   ```bash
   pnpm install
   ```

2. Build AGENTS.md from rules:
   ```bash
   pnpm build
   ```

3. Validate rule files:
   ```bash
   pnpm validate
   ```

4. Extract test cases:
   ```bash
   pnpm extract-tests
   ```

## Creating a New Rule

1. Copy `rules/_template.md` to `rules/area-description.md`
2. Choose the appropriate area prefix:
   - `async-` for Eliminating Waterfalls (Section 1)
   - `bundle-` for Bundle Size Optimization (Section 2)
   - `server-` for Server-Side Performance (Section 3)
   - `client-` for Client-Side Data Fetching (Section 4)
   - `rerender-` for Re-render Optimization (Section 5)
   - `rendering-` for Rendering Performance (Section 6)
   - `js-` for JavaScript Performance (Section 7)
   - `advanced-` for Advanced Patterns (Section 8)
3. Fill in the frontmatter and content
4. Ensure you have clear examples with explanations
5. Run `pnpm build` to regenerate AGENTS.md and test-cases.json

## Rule File Structure

Each rule file should follow this structure:

```markdown
---
title: Rule Title Here
impact: MEDIUM
impactDescription: Optional description
tags: tag1, tag2, tag3
---

## Rule Title Here

Brief explanation of the rule and why it matters.

**Incorrect (description of what's wrong):**

```typescript
// Bad code example
```

**Correct (description of what's right):**

```typescript
// Good code example
```

Optional explanatory text after examples.

Reference: [Link](https://example.com)

## File Naming Convention

- Files starting with `_` are special (excluded from build)
- Rule files: `area-description.md` (e.g., `async-parallel.md`)
- Section is automatically inferred from filename prefix
- Rules are sorted alphabetically by title within each section
- IDs (e.g., 1.1, 1.2) are auto-generated during build

## Impact Levels

- `CRITICAL` - Highest priority, major performance gains
- `HIGH` - Significant performance improvements
- `MEDIUM-HIGH` - Moderate-high gains
- `MEDIUM` - Moderate performance improvements
- `LOW-MEDIUM` - Low-medium gains
- `LOW` - Incremental improvements

## Scripts

- `pnpm build` - Compile rules into AGENTS.md
- `pnpm validate` - Validate all rule files
- `pnpm extract-tests` - Extract test cases for LLM evaluation
- `pnpm dev` - Build and validate

## Contributing

When adding or modifying rules:

1. Use the correct filename prefix for your section
2. Follow the `_template.md` structure
3. Include clear bad/good examples with explanations
4. Add appropriate tags
5. Run `pnpm build` to regenerate AGENTS.md and test-cases.json
6. Rules are automatically sorted by title - no need to manage numbers!

## Acknowledgments

Originally created by [@shuding](https://x.com/shuding) at [Vercel](https://vercel.com).

---

### Overview (`docs/editor-behavior/commands/README.md`)

# Editor Behavior Commands

This is the operator surface for resuming and maintaining
[docs/editor-behavior](docs/editor-behavior).

Use it when you do **not** want to rediscover the workflow from scattered plans,
spec docs, and `.omx` artifacts.

This pack has two lanes:

- doc-governance:
  maintain standards, spec, protocol, parity, audit, and evidence truth
- implementation/runtime:
  choose, launch, and close real code/test/product batches from the roadmap

## Canonical Artifacts

- law stack:
  - [markdown-standards.md](docs/editor-behavior/markdown-standards.md)
  - [markdown-editing-spec.md](docs/editor-behavior/markdown-editing-spec.md)
  - [editor-protocol-matrix.md](docs/editor-behavior/editor-protocol-matrix.md)
  - [markdown-parity-matrix.md](docs/editor-behavior/markdown-parity-matrix.md)
  - [markdown-editing-reference-audit.md](docs/editor-behavior/markdown-editing-reference-audit.md)
- active execution notes:
  - [2026-04-02-editor-behavior-major-execution.md](docs/plans/2026-04-02-editor-behavior-major-execution.md)
  - [2026-04-03-editor-protocol-matrix-completion.md](docs/plans/2026-04-03-editor-protocol-matrix-completion.md)
- canonical remaining implementation roadmap:
  - [master-roadmap.md](docs/editor-behavior/master-roadmap.md)
- active supporting implementation plans:
  - [2026-04-10-math-delimiter-trigger-implementation-plan.md](docs/plans/2026-04-10-math-delimiter-trigger-implementation-plan.md)
  - [2026-04-10-autoformat-runtime-alignment-and-extension-plan.md](docs/plans/2026-04-10-autoformat-runtime-alignment-and-extension-plan.md)
  - [2026-04-09-date-media-expansion-consensus-plan.md](docs/plans/2026-04-09-date-media-expansion-consensus-plan.md)
- historical OMX artifacts:
  - [prd-editor-behavior-major.md](.omx/plans/prd-editor-behavior-major.md)
  - [test-spec-editor-behavior-major.md](.omx/plans/test-spec-editor-behavior-major.md)
  - [deep-interview-editor-behavior-major.md](.omx/specs/deep-interview-editor-behavior-major.md)

## Command Set

### Doc-Governance Lane

- [reconsolidate-law-stack.md](docs/editor-behavior/commands/reconsolidate-law-stack.md)
  Re-sync the standards/spec/protocol/parity/audit stack when truth drifted,
  including after runtime work changed behavior.
- [refresh-evidence-ledger.md](docs/editor-behavior/commands/refresh-evidence-ledger.md)
  Refresh the evidence layer from research when doc truth or runtime planning is
  blocked on weak authority.
- [reinterview-open-authority-gaps.md](docs/editor-behavior/commands/reinterview-open-authority-gaps.md)
  Re-open authority questions when the law stack cannot answer them and either
  doc maintenance or implementation planning is blocked by that ambiguity.

### Implementation / Runtime Lane

- [replan-next-batch.md](docs/editor-behavior/commands/replan-next-batch.md)
  Turn current truth plus the roadmap into one concrete next runtime batch.
- [launch-next-ralph-batch.md](docs/editor-behavior/commands/launch-next-ralph-batch.md)
  Execute the active approved runtime lane, not just the old major plan.

## Fast Routing

### If You Are In A Doc-Governance Problem

- If the docs disagree with each other, or a runtime batch changed behavior
  without the law stack catching up, start with
  [reconsolidate-law-stack.md](docs/editor-behavior/commands/reconsolidate-law-stack.md).
- If the audit or research feels stale, or an implementation lane is blocked on
  weak evidence, start with
  [refresh-evidence-ledger.md](docs/editor-behavior/commands/refresh-evidence-ledger.md).
- If the lane cannot answer “what should win here?”, “what next?”, or “what
  should move up/down in priority?”, run
  [reinterview-open-authority-gaps.md](docs/editor-behavior/commands/reinterview-open-authority-gaps.md)
  before planning.

### If You Are In An Implementation / Runtime Problem

- After authority is clear and you need the next executable runtime slice, run
  [replan-next-batch.md](docs/editor-behavior/commands/replan-next-batch.md).
- If the gate is already closed but you still need the remaining backlog order
  or a narrower next slice, run
  [replan-next-batch.md](docs/editor-behavior/commands/replan-next-batch.md).
- When the next runtime batch is approved and concrete, run
  [launch-next-ralph-batch.md](docs/editor-behavior/commands/launch-next-ralph-batch.md).
- If runtime work exposes law drift, evidence debt, or unresolved authority,
  bounce back to the doc-governance lane instead of forcing more code work.

---

### Overview (`docs/research/commands/README.md`)

# Research Commands

This directory contains command specs for operating the research layer.

Primary reusable entrypoint:

- [$research-wiki](.agents/skills/research-wiki/SKILL.md)

These pages are not knowledge pages like `sources/` or `concepts/`.
They are operational docs that describe repeatable agent workflows.

Use them to define:

- full ingest-and-compile passes
- maintenance passes
- per-corpus completion rules for `full` mode
- official-source discovery checks before declaring corpus gaps
- local-raw exhaustiveness rules before declaring `evidence gap`

Current commands:

- [full-pipeline.md](docs/research/commands/full-pipeline.md)
  The full-mode sub-workflow used by `research-wiki`.
- [maintain.md](docs/research/commands/maintain.md)
  The maintain-mode sub-workflow used by `research-wiki`.

---

### Overview (`docs/research/concepts/README.md`)

# Concepts

This directory contains shared vocabulary and abstractions.

Each concept page should define one term cleanly and link to the systems,
decisions, entities, and sources that rely on it.

Current editor-architecture additions include:

- [overlay-lane-separation.md](docs/research/concepts/overlay-lane-separation.md)
- [durable-anchor-vs-live-handle.md](docs/research/concepts/durable-anchor-vs-live-handle.md)
- [runtime-identity-vs-tree-address.md](docs/research/concepts/runtime-identity-vs-tree-address.md)
- [source-scoped-overlay-invalidation.md](docs/research/concepts/source-scoped-overlay-invalidation.md)

---

### Overview (`docs/research/decisions/README.md`)

# Decisions

This directory contains normalized choices and policy calls.

Each decision page should answer:

- what question was decided
- what answer won
- why it won
- what it overruled
- what sources support it

---

### Overview (`docs/research/entities/README.md`)

# Entities

This directory contains concrete named things.

Examples:

- editors like Typora or Obsidian
- reference products like Google Docs
- internal packages or plugins

---

### Overview (`docs/research/open-questions/README.md`)

# Open Questions

This directory contains unresolved ambiguity that should stay explicit.

Use it when the evidence is mixed, thin, or incomplete.

Do not silently resolve those gaps in summary pages.

---

### Overview (`docs/research/sources/README.md`)

# Sources

This directory contains compiled research summaries of raw evidence.

Each page here should summarize one raw source or one tightly related source
group from `../raw`.

Do not store raw captures here.

---

### Overview (`docs/research/systems/README.md`)

# Systems

This directory contains system maps and authority maps.

Use it for larger structures:

- editor-behavior authority models
- package or subsystem maps
- cross-editor comparison surfaces

Current editor-architecture pages include:

- [editor-architecture-landscape.md](docs/research/systems/editor-architecture-landscape.md)
- [slate-v2-overlay-architecture.md](docs/research/systems/slate-v2-overlay-architecture.md)

---

### Overview (`docs/slate-v2-draft/archive/README.md`)

---
date: 2026-04-07
topic: slate-v2-archive-readme
---

# Slate v2 Archive

> Archive only. Historical reference doc. For current queue and roadmap truth, see [master-roadmap.md](/Users/zbeyens/git/plate-2/docs/slate-v2/master-roadmap.md).

This folder keeps retired historical docs from the old `docs/slate-v2` root
stack. These files are for archaeology, not the current replacement verdict.

Read these first instead:

- [../overview.md](/Users/zbeyens/git/plate-2/docs/slate-v2/overview.md)
- [../master-roadmap.md](/Users/zbeyens/git/plate-2/docs/slate-v2/master-roadmap.md)
- [../architecture-contract.md](/Users/zbeyens/git/plate-2/docs/slate-v2/references/architecture-contract.md)
- [../release-readiness-decision.md](/Users/zbeyens/git/plate-2/docs/slate-v2/release-readiness-decision.md)
- [../replacement-family-ledger.md](/Users/zbeyens/git/plate-2/docs/slate-v2/replacement-family-ledger.md)
- [../full-replacement-blockers.md](/Users/zbeyens/git/plate-2/docs/slate-v2/archive/full-replacement-blockers.md)
- [../replacement-gates-scoreboard.md](/Users/zbeyens/git/plate-2/docs/slate-v2/replacement-gates-scoreboard.md)

Archive contents:

- historical benchmark and hardening writeups
- historical migration and compatibility writeups
- frozen roadmap and phase-plan artifacts
- older synthesis and status docs

---

### Overview (`docs/slate-v2-draft/ledgers/README.md`)

---
date: 2026-04-13
topic: slate-v2-exact-ledgers-index
---

# Slate v2 Exact Ledgers

Exact 1:1 legacy-file ledgers that complement the human control ledger in
[release-file-review-ledger.md](/Users/zbeyens/git/plate-2/docs/slate-v2/release-file-review-ledger.md).

Rule:

- these ledgers are the archaeology layer
- they must stay exact per legacy file
- they do not dictate one-current-file-per-legacy-file recovery
- code proof should live in the smallest current behavior-domain owner file
- dead harness files should close as `explicit-skip` or `mapped-mixed`, not
  fake-recovered source cosplay

- [legacy-slate-test-files.md](/Users/zbeyens/git/plate-2/docs/slate-v2/ledgers/legacy-slate-test-files.md)
- [legacy-slate-react-test-files.md](/Users/zbeyens/git/plate-2/docs/slate-v2/ledgers/legacy-slate-react-test-files.md)
- [legacy-slate-history-test-files.md](/Users/zbeyens/git/plate-2/docs/slate-v2/ledgers/legacy-slate-history-test-files.md)
- [legacy-playwright-example-tests.md](/Users/zbeyens/git/plate-2/docs/slate-v2/ledgers/legacy-playwright-example-tests.md)

Status key:

- `mapped-mirrored`: current proof already carries the legacy file value
- `mapped-recovered`: current proof recovered the legacy file value on a new owner
- `mapped-mixed`: one legacy file splits into mirrored, recovered, and/or
  explicit-skip subclaims
- `same-path-current`: the same relative current test file still exists in `slate-v2`
- `explicit-skip`: intentionally outside the live contract
- `needs-triage`: no honest exact mapping exists yet

---

### Overview (`docs/slate-v2/ledgers/README.md`)

---
date: 2026-04-16
topic: slate-v2-ledgers-readme
status: active
---

# Ledgers

Use this folder for package, API, test, and example inventories during the
fresh-branch migration.

Status words:

- `recovered`
- `extended`
- `mixed`
- `open`
- `post RC`
- `cut`

Current live ledgers:

- [fork-issue-dossier.md](/Users/zbeyens/git/plate-2/docs/slate-v2/ledgers/fork-issue-dossier.md)
- [example-parity-matrix.md](/Users/zbeyens/git/plate-2/docs/slate-v2/ledgers/example-parity-matrix.md)
- [legacy-playwright-example-tests.md](/Users/zbeyens/git/plate-2/docs/slate-v2/ledgers/legacy-playwright-example-tests.md)
- [legacy-slate-history-test-files.md](/Users/zbeyens/git/plate-2/docs/slate-v2/ledgers/legacy-slate-history-test-files.md)
- [legacy-slate-react-test-files.md](/Users/zbeyens/git/plate-2/docs/slate-v2/ledgers/legacy-slate-react-test-files.md)
- [legacy-slate-test-files.md](/Users/zbeyens/git/plate-2/docs/slate-v2/ledgers/legacy-slate-test-files.md)
- [slate-legacy-draft-contract-corpus.md](/Users/zbeyens/git/plate-2/docs/slate-v2/ledgers/slate-legacy-draft-contract-corpus.md)
- [slate-history-legacy-draft-contract-corpus.md](/Users/zbeyens/git/plate-2/docs/slate-v2/ledgers/slate-history-legacy-draft-contract-corpus.md)
- [slate-hyperscript-legacy-draft-contract-corpus.md](/Users/zbeyens/git/plate-2/docs/slate-v2/ledgers/slate-hyperscript-legacy-draft-contract-corpus.md)
- [slate-dom-legacy-draft-contract-corpus.md](/Users/zbeyens/git/plate-2/docs/slate-v2/ledgers/slate-dom-legacy-draft-contract-corpus.md)
- [slate-react-legacy-draft-contract-corpus.md](/Users/zbeyens/git/plate-2/docs/slate-v2/ledgers/slate-react-legacy-draft-contract-corpus.md)
- [slate-editor-api.md](/Users/zbeyens/git/plate-2/docs/slate-v2/ledgers/slate-editor-api.md)
- [slate-history-api.md](/Users/zbeyens/git/plate-2/docs/slate-v2/ledgers/slate-history-api.md)
- [slate-interfaces-api.md](/Users/zbeyens/git/plate-2/docs/slate-v2/ledgers/slate-interfaces-api.md)
- [slate-react-api.md](/Users/zbeyens/git/plate-2/docs/slate-v2/ledgers/slate-react-api.md)
- [slate-transforms-api.md](/Users/zbeyens/git/plate-2/docs/slate-v2/ledgers/slate-transforms-api.md)

Current tranche-3 owner docs:

- [2026-04-19-slate-absolute-api-replan.md](/Users/zbeyens/git/plate-2/docs/plans/2026-04-19-slate-absolute-api-replan.md)
- [fresh-branch-migration-plan.md](/Users/zbeyens/git/plate-2/docs/slate-v2/fresh-branch-migration-plan.md)

Current tranche-3 landed waves:

- [2026-04-18-slate-v2-slate-accessor-batch-wave-plan.md](/Users/zbeyens/git/plate-2/docs/plans/2026-04-18-slate-v2-slate-accessor-batch-wave-plan.md)
- restored direct proof owners now live in `.tmp/slate-v2`:
  - `packages/slate/test/query-contract.ts`
  - `packages/slate/test/legacy-editor-nodes-fixtures.ts`
  - `packages/slate/test/legacy-interfaces-fixtures.ts`

Historical tranche-3 planning docs:

- the parity-first tranche docs below are historical context now
- [2026-04-18-slate-v2-slate-query-first-wave-plan.md](/Users/zbeyens/git/plate-2/docs/plans/2026-04-18-slate-v2-slate-query-first-wave-plan.md)
- [2026-04-18-slate-v2-slate-accessor-batch-wave-plan.md](/Users/zbeyens/git/plate-2/docs/plans/2026-04-18-slate-v2-slate-accessor-batch-wave-plan.md)
- [2026-04-18-slate-v2-slate-interfaces-transforms-wave-plan.md](/Users/zbeyens/git/plate-2/docs/plans/2026-04-18-slate-v2-slate-interfaces-transforms-wave-plan.md)

---

### Overview (`docs/sync/shadcn/README.md`)

# Sync Shadcn

This directory tracks Plate's sync point against upstream `shadcn-ui/ui`
docs in `../shadcn/apps/v4`.

- `status.json` records the current upstream commit baseline.
- `decisions.md` records durable keep/fork/exclude policy for Plate docs.
- `runs/` stores range-specific audits, inventories, patches, and plans.

Use `.agents/skills/sync-shadcn/SKILL.md` before pulling newer upstream
shadcn docs changes into `apps/www`.

The baseline only moves after every upstream change in a range is accounted for
as adopted, smart-merged, intentionally forked, or explicitly excluded.

---

### Overview (`packages/udecode/cmdk/README.md`)

# cmdk

Fork of [cmdk](https://github.com/pacocoursey/cmdk) with control actions.

- `useCommandActions` hook to control the command menu.

## License

[MIT](../../LICENSE)

---

### Overview (`packages/udecode/cn/README.md`)

# `cn` utils

React & Tailwind utils used by Plate UI.

## Documentation

Visit https://platejs.org/docs/api/cn to view the documentation.

## License

[MIT](../../LICENSE)

---

### Overview (`packages/udecode/depset/README.md`)

# depset

A command-line tool to synchronize package dependencies in your `package.json` to their latest versions, a specific target version, or versions matching a pattern.

## Invocation

Run `depset` using your preferred package manager:

- **npx:**
  ```bash
  npx depset@latest [args...]
  ```
- **pnpm:**
  ```bash
  pnpm dlx depset@latest [args...]
  ```
- **yarn:**
  ```bash
  yarn dlx depset@latest [args...]
  ```
- **bun:**
  ```bash
  bunx depset@latest [args...]
  ```

## Usage

```bash
depset [package-specifier] [target-version] [options]
```

## Arguments

- **`[package-specifier]`** (Optional)\
  The package name or pattern to target. If omitted (and `--yes` is not used), you will be prompted.

  - **Exact Name:** e.g., `lodash`, `@babel/core`
  - **Scope:** e.g., `@myorg` (targets packages like `@myorg/component-a`, `@myorg/utils`)
  - **Prefix:** e.g., `eslint-*` (targets packages like `eslint-plugin-react`, `eslint-config-next`)

- **`[target-version]`** (Optional)\
  The maximum version to synchronize to (e.g., "1", "1.2", "1.2.3"). If omitted (and neither `--latest` nor `--yes` are used), you will be prompted. If `--latest` is used, this is ignored.

## Options

```txt
Usage: depset [options] [package-specifier] [target-version]

Synchronize package dependencies to their latest or a specific version.

Arguments:
  package-specifier   Package name or pattern (e.g., "@scope/foo*", "my-package", "@myorg").
                      Prompts if not provided (unless -y is used).
  target-version      Target version (e.g., "1.2.3"). Prompts if not provided (unless -L or -y is used).
                      Defaults to latest if left blank in prompt or if -L is used.

Options:
  -L, --latest        Use the latest version, skip version prompt. (default: false)
  -i, --install       Automatically run install after updating package.json. (default: false)
  -y, --yes           Skip all confirmation prompts. (default: false)
  -c, --cwd <path>    Set the current working directory. (default: current directory)
  -s, --silent        Silence all output except for errors. (default: false)
  -v, --version       Display the version number.
  -h, --help          Display help for command.
```

## Examples

1.  **Sync `lodash` to its latest version (prompts for version if not specified with `--latest`):**

    ```bash
    npx depset@latest lodash
    ```

2.  **Sync all packages in the `@babel` scope to their absolute latest versions, and install, skipping all prompts:**

    ```bash
    npx depset@latest @babel --latest --install --yes
    ```

3.  **Sync packages starting with `eslint-` up to version `8.50.0`:**

    ```bash
    npx depset@latest "eslint-*" 8.50.0
    ```

    _(You will be prompted to confirm changes and installation unless `-y` is used)_

4.  **Run interactively, prompting for all inputs:**
    ```bash
    npx depset@latest
    ```

---

### Overview (`packages/udecode/react-hotkeys/README.md`)

# Udecode react-hotkeys-hook fork

This is a fork of the original [react-hotkeys-hook@5.0.0-1](https://github.com/JohannesKlauss/react-hotkeys-hook) and [the following changes](https://github.com/JohannesKlauss/react-hotkeys-hook/compare/v5.0.0-1...zeorin:react-hotkeys-hook:70411dc8a33aeebceb98f48d126693d3360ad4e5).

## Documentation

Visit https://platejs.org/docs/api/react-utils to view the documentation.

## License

[MIT](../../LICENSE)

---

### Overview (`packages/udecode/react-utils/README.md`)

# Udecode React utils

React utils used by the many packages of the Udecode ecosystem.

## Documentation

Visit https://platejs.org/docs/api/react-utils to view the documentation.

## License

[MIT](../../LICENSE)

---

### Overview (`packages/udecode/utils/README.md`)

# Udecode Utils

Utils used by the many packages of the Udecode ecosystem.

## License

[MIT](../../LICENSE)

---

### Overview (`tooling/templates/plate-playground-template/README.md`)

# Playground Template

A Next.js template with [Plate](https://platejs.org/) AI, plugins and components.

## Features

- Next.js 16
- [Plate](https://platejs.org/) editor
- [shadcn/ui](https://ui.shadcn.com/)
- [MCP](https://platejs.org/docs/components/mcp)

## Requirements

- Node.js 20+
- bun

## Installation

Choose one of these methods:

### 1. Using CLI (Recommended)

```bash
npx shadcn@latest add @plate/editor-ai
```

### 2. Using Template

[Use this template](https://github.com/udecode/plate-playground-template/generate), then install dependencies:

```bash
bun install
```

## Development

Copy the example env file:

```bash
cp .env.example .env.local
```

Configure `.env.local`:

- `UPLOADTHING_TOKEN` – UploadThing API key ([get one here](https://uploadthing.com/dashboard))

Enter your own [AI Gateway key](https://vercel.com/ai-gateway) in the editor settings to use AI. The example API routes use the caller's key.

Uploads work in local development. Before enabling production uploads, replace the development check in `src/lib/uploadthing.ts` with your application's session and permission checks. Add per-user upload limits.

If your application uses a shared server AI credential, authorize each request and enforce per-user usage limits before calling the provider. Keep server credentials out of client code.

Start the development server:

```bash
bun dev
```

Visit http://localhost:3000/editor to see the editor in action.

---

### Overview (`docs/research/sources/editor-architecture/README.md`)

# Editor Architecture Sources

This directory holds compiled summaries for the editor-architecture comparison
lane.

Current scope:

- decorations / annotations / widget architecture
- React 19.2 perf architecture
- read/update lifecycle architecture across Lexical, ProseMirror, and Tiptap
- node/text/mark/render DX across ProseMirror, Lexical, and Tiptap

If future editor-architecture work moves into other surfaces, add separate
cluster pages instead of bloating a single mixed summary.

Current evidence is grounded in normalized raw families under `../raw`, official
local repo clones under `../`, plus the local plan docs that already captured
the Slate v2 decorations / annotations research.

## Raw Corpus Availability

As of 2026-04-23, the Lexical, ProseMirror, Tiptap, and Tiptap Docs raw source
families are normalized under `../raw`.

Current raw evidence:

- `../raw/lexical/repo`: official Lexical repo clone.
- `../raw/prosemirror/repo`: official ProseMirror umbrella repo clone.
- `../raw/prosemirror/packages/*`: official ProseMirror package clones for
  architecture evidence.
- `../raw/tiptap/repo`: official Tiptap repo clone.
- `../raw/tiptap/docs`: official Tiptap Docs repo clone.

Disposition:

- strongest evidence found: normalized official raw clones under `../raw`
- raw gap: closed for the current read/update architecture pass
- compile gap: closed for read/update architecture; broader product areas such
  as tables, comments/suggestions, and AI tooling need separate passes if they
  become active

Current pages:

- [decorations-annotations-overlay-corpus.md](docs/research/sources/editor-architecture/decorations-annotations-overlay-corpus.md)
- [prosemirror-mapped-overlays-and-bookmarks.md](docs/research/sources/editor-architecture/prosemirror-mapped-overlays-and-bookmarks.md)
- [lexical-mark-store-and-decorator-split.md](docs/research/sources/editor-architecture/lexical-mark-store-and-decorator-split.md)
- [react-19-2-external-store-and-background-ui.md](docs/research/sources/editor-architecture/react-19-2-external-store-and-background-ui.md)
- [tiptap-comments-suggestions-and-node-range.md](docs/research/sources/editor-architecture/tiptap-comments-suggestions-and-node-range.md)
- [slate-v2-local-proof-substrate.md](docs/research/sources/editor-architecture/slate-v2-local-proof-substrate.md)
- [layout-measurement-and-ime-lanes.md](docs/research/sources/editor-architecture/layout-measurement-and-ime-lanes.md)
- [lightweight-editable-surface-lower-bound.md](docs/research/sources/editor-architecture/lightweight-editable-surface-lower-bound.md)
- [service-channels-and-live-stores.md](docs/research/sources/editor-architecture/service-channels-and-live-stores.md)
- [read-update-runtime-corpus-ledger.md](docs/research/sources/editor-architecture/read-update-runtime-corpus-ledger.md)
- [lexical-read-update-extension-runtime.md](docs/research/sources/editor-architecture/lexical-read-update-extension-runtime.md)
- [prosemirror-transaction-view-dom-runtime.md](docs/research/sources/editor-architecture/prosemirror-transaction-view-dom-runtime.md)
- [tiptap-extension-command-react-dx.md](docs/research/sources/editor-architecture/tiptap-extension-command-react-dx.md)
- [node-text-mark-render-dx-corpus-ledger.md](docs/research/sources/editor-architecture/node-text-mark-render-dx-corpus-ledger.md)
- [scroll-selection-visibility-runtime.md](docs/research/sources/editor-architecture/scroll-selection-visibility-runtime.md)
- [pretext-pagination-page-virtualization.md](docs/research/sources/editor-architecture/pretext-pagination-page-virtualization.md)

This directory should not turn into a dump of one-off notes.

Split it further only when the lane needs deeper per-corpus source pages.

---

### Overview (`docs/research/sources/lexical/README.md`)

# Lexical Sources

This directory contains compiled research summaries derived from the official
Lexical monorepo at `/Users/zbeyens/git/lexical` plus the live docs entrypoints
on `https://lexical.dev`.

Current pages:

- [markdown-package-and-shortcuts-doc-patterns.md](docs/research/sources/lexical/markdown-package-and-shortcuts-doc-patterns.md)

This layer is source-oriented. It is not yet the final decision layer.

---

### Overview (`docs/research/sources/milkdown/README.md`)

# Milkdown Sources

This directory contains compiled research summaries derived from the upstream
Milkdown raw clone in `../raw/milkdown/repo` and the raw entrypoint in
`../raw/milkdown`.

Current pages:

- [corpus-overview.md](docs/research/sources/milkdown/corpus-overview.md)
- [editor-behavior-priority-map.md](docs/research/sources/milkdown/editor-behavior-priority-map.md)
- [behavior-test-lanes.md](docs/research/sources/milkdown/behavior-test-lanes.md)
- [docs-and-package-surface-map.md](docs/research/sources/milkdown/docs-and-package-surface-map.md)
- [latex-trigger-surface.md](docs/research/sources/milkdown/latex-trigger-surface.md)
- [input-autoformat-lanes.md](docs/research/sources/milkdown/input-autoformat-lanes.md)

This layer is source-oriented. It is not yet the final concept/decision layer.

---

### Overview (`docs/research/sources/obsidian/README.md`)

# Obsidian Sources

This directory contains compiled research summaries derived from:

- `../raw/obsidian/help`
- `../raw/obsidian/developer`

Current pages:

- [corpus-overview.md](docs/research/sources/obsidian/corpus-overview.md)
- [editor-behavior-priority-map.md](docs/research/sources/obsidian/editor-behavior-priority-map.md)
- [editing-modes-and-markdown-surface.md](docs/research/sources/obsidian/editing-modes-and-markdown-surface.md)
- [math-delimiters-and-pair-settings.md](docs/research/sources/obsidian/math-delimiters-and-pair-settings.md)
- [linking-navigation-and-search.md](docs/research/sources/obsidian/linking-navigation-and-search.md)
- [developer-editor-extension-surface.md](docs/research/sources/obsidian/developer-editor-extension-surface.md)
- [footnotes-and-block-links.md](docs/research/sources/obsidian/footnotes-and-block-links.md)

---

### Overview (`docs/research/sources/prosemirror/README.md`)

# ProseMirror Sources

This directory contains compiled research summaries derived from the official
ProseMirror docs entrypoints on `https://prosemirror.net` plus the local repo at
`/Users/zbeyens/git/prosemirror`.

Current pages:

- [guide-reference-and-example-doc-patterns.md](docs/research/sources/prosemirror/guide-reference-and-example-doc-patterns.md)

This layer is source-oriented. It is not yet the final decision layer.

---

### Overview (`docs/research/sources/slate/README.md`)

# Slate Sources

This directory contains compiled research summaries derived from the official
Slate repo and docs at `/Users/zbeyens/git/slate` and `https://docs.slatejs.org`.

Current pages:

- [walkthrough-concepts-and-api-doc-patterns.md](docs/research/sources/slate/walkthrough-concepts-and-api-doc-patterns.md)

This layer is source-oriented. It is not yet the final decision layer.

---

### Overview (`docs/research/sources/tiptap/README.md`)

# Tiptap Sources

This directory contains compiled research summaries derived from the normalized
Tiptap raw source family under `../raw/tiptap`.

Raw entrypoints:

- docs: `../raw/tiptap/docs`
- source/packages: `../raw/tiptap/repo`
- catalog: `../raw/tiptap/catalog.md`

Current pages:

- [input-rules-and-extension-doc-patterns.md](docs/research/sources/tiptap/input-rules-and-extension-doc-patterns.md)

This layer is source-oriented. It is not yet the final decision layer.

---

### Overview (`docs/research/sources/typora/README.md`)

# Typora Sources

This directory will hold compiled summaries derived from `../raw/typora`.

It should contain:

- summary pages for important Typora docs or release-note evidence
- compact behavior extracts
- links to impacted decision, concept, and system pages

Do not store raw captured Typora docs here.

Current pages:

- [corpus-overview.md](docs/research/sources/typora/corpus-overview.md)
- [editor-behavior-priority-map.md](docs/research/sources/typora/editor-behavior-priority-map.md)
- [markdown-native-editing-foundations.md](docs/research/sources/typora/markdown-native-editing-foundations.md)
- [clipboard-and-delete-behavior.md](docs/research/sources/typora/clipboard-and-delete-behavior.md)
- [links-images-and-html-behavior.md](docs/research/sources/typora/links-images-and-html-behavior.md)
- [media-authoring-and-path-policy.md](docs/research/sources/typora/media-authoring-and-path-policy.md)
- [navigation-search-outline-and-toc.md](docs/research/sources/typora/navigation-search-outline-and-toc.md)
- [code-math-table-and-task-surfaces.md](docs/research/sources/typora/code-math-table-and-task-surfaces.md)
- [math-delimiter-triggers.md](docs/research/sources/typora/math-delimiter-triggers.md)
- [markdown-shorthand-and-inline-autoformat.md](docs/research/sources/typora/markdown-shorthand-and-inline-autoformat.md)

One-to-one source-card material now lives in:

- `../raw/typora/page-cards/`
- `../raw/typora/catalog.md`

---

### Overview (`templates/plate-playground-template/.agents/skills/react-useeffect/README.md`)

# React useEffect Best Practices

A comprehensive guide teaching when to use `useEffect` in React, and more importantly, when NOT to use it. This skill is based on official React documentation and provides practical alternatives to common useEffect anti-patterns.

## Purpose

Effects are an **escape hatch** from React's reactive paradigm. They let you synchronize with external systems like browser APIs, third-party widgets, or network requests. However, many developers overuse Effects for tasks that React handles better through other means.

This skill helps you:
- Identify when you truly need an Effect vs. when you don't
- Recognize common anti-patterns and their fixes
- Apply better alternatives like `useMemo`, `key` prop, and event handlers
- Write Effects that are clean, maintainable, and free from race conditions

## When to Use This Skill

Use this skill when you're:
- Writing or reviewing `useEffect` code
- Using `useState` to store derived values
- Implementing data fetching or subscriptions
- Synchronizing state between components
- Facing bugs with stale data or race conditions
- Wondering if your Effect is necessary

**Trigger phrases:**
- "Should I use useEffect for this?"
- "How do I fix this useEffect?"
- "My Effect is causing too many re-renders"
- "Data fetching with useEffect"
- "Reset state when props change"
- "Derived state from props"

## How It Works

This skill provides guidance through three key resources:

1. **Quick Reference Table** - Fast lookup for common scenarios with DO/DON'T patterns
2. **Decision Tree** - Visual flowchart to determine the right approach
3. **Detailed Anti-Patterns** - 9 common mistakes with explanations and fixes
4. **Better Alternatives** - 8 proven patterns to replace unnecessary Effects

The skill teaches you to ask the right questions:
- Is there an external system involved?
- Am I responding to a user event or component appearance?
- Can this value be calculated during render?
- Do I need to reset state when a prop changes?

## Key Features

### 1. Quick Reference Guide

Visual table showing the DO/DON'T for common scenarios:
- Derived state from props/state
- Expensive calculations
- Resetting state on prop change
- User event responses
- Notifying parent components
- Data fetching

### 2. Decision Tree

Clear flowchart that guides you from "Need to respond to something?" to the correct solution:
- User interaction → Event handler
- Component appeared → Effect (for external sync/analytics)
- Derived value needed → Calculate during render (+ useMemo if expensive)
- Reset state on prop change → Key prop

### 3. Anti-Pattern Recognition

Detailed examples of 9 common mistakes:
1. Redundant state for derived values
2. Filtering/transforming data in Effect
3. Resetting state on prop change
4. Event-specific logic in Effect
5. Chains of Effects
6. Notifying parent via Effect
7. Passing data up to parent
8. Fetching without cleanup (race conditions)
9. App initialization in Effect

Each anti-pattern includes:
- Bad example with explanation
- Good example with fix
- Why the anti-pattern is problematic

### 4. Better Alternatives

8 proven patterns to replace unnecessary Effects:
1. Calculate during render for derived state
2. `useMemo` for expensive calculations
3. `key` prop to reset state
4. Store ID instead of object for stable references
5. Event handlers for user actions
6. `useSyncExternalStore` for external stores
7. Lifting state up for shared state
8. Custom hooks for data fetching with cleanup

## Usage Examples

### Example 1: Derived State

**Bad - Unnecessary Effect:**
```tsx
function Form() {
  const [firstName, setFirstName] = useState('Taylor');
  const [lastName, setLastName] = useState('Swift');
  const [fullName, setFullName] = useState('');

  useEffect(() => {
    setFullName(firstName + ' ' + lastName);
  }, [firstName, lastName]);
}
```

**Good - Calculate during render:**
```tsx
function Form() {
  const [firstName, setFirstName] = useState('Taylor');
  const [lastName, setLastName] = useState('Swift');
  const fullName = firstName + ' ' + lastName; // Just compute it
}
```

### Example 2: Resetting State

**Bad - Effect to reset:**
```tsx
function ProfilePage({ userId }) {
  const [comment, setComment] = useState('');

  useEffect(() => {
    setComment('');
  }, [userId]);
}
```

**Good - Key prop:**
```tsx
function ProfilePage({ userId }) {
  return <Profile userId={userId} key={userId} />;
}

function Profile({ userId }) {
  const [comment, setComment] = useState(''); // Resets automatically
}
```

### Example 3: Data Fetching with Cleanup

**Bad - Race condition:**
```tsx
function SearchResults({ query }) {
  const [results, setResults] = useState([]);

  useEffect(() => {
    fetchResults(query).then(json => {
      setResults(json); // "hello" response may arrive after "hell"
    });
  }, [query]);
}
```

**Good - Cleanup flag:**
```tsx
function SearchResults({ query }) {
  const [results, setResults] = useState([]);

  useEffect(() => {
    let ignore = false;

    fetchResults(query).then(json => {
      if (!ignore) setResults(json);
    });

    return () => { ignore = true; };
  }, [query]);
}
```

### Example 4: Event Handler Instead of Effect

**Bad - Effect watching state:**
```tsx
function ProductPage({ product, addToCart }) {
  useEffect(() => {
    if (product.isInCart) {
      showNotification(`Added ${product.name}!`);
    }
  }, [product]);

  function handleBuyClick() {
    addToCart(product);
  }
}
```

**Good - Handle in event:**
```tsx
function ProductPage({ product, addToCart }) {
  function handleBuyClick() {
    addToCart(product);
    showNotification(`Added ${product.name}!`);
  }
}
```

## When You DO Need Effects

Effects are appropriate for:

- **Synchronizing with external systems** - Browser APIs, third-party widgets, non-React code
- **Subscriptions** - WebSocket connections, global event listeners (prefer `useSyncExternalStore`)
- **Analytics/logging** - Code that needs to run because the component displayed
- **Data fetching** - With proper cleanup (or use your framework's built-in mechanism)

## When You DON'T Need Effects

Avoid Effects for:

1. **Transforming data for rendering** - Calculate at the top level instead
2. **Handling user events** - Use event handlers where you know exactly what happened
3. **Deriving state** - Just compute it: `const fullName = firstName + ' ' + lastName`
4. **Chaining state updates** - Calculate all next state in the event handler
5. **Notifying parent components** - Call the callback in the same event handler
6. **Resetting state** - Use the `key` prop to create a fresh component instance

## Best Practices

### 1. Start Without an Effect

Before adding an Effect, ask: "Is there an external system involved?" If no, you probably don't need an Effect.

### 2. Prefer Derived State

If you can calculate a value from props or state, don't store it in state with an Effect updating it.

### 3. Use the Right Tool

- Expensive calculation → `useMemo`
- User interaction → Event handler
- Reset on prop change → `key` prop
- External subscription → `useSyncExternalStore`
- Shared state → Lift state up

### 4. Always Clean Up

If your Effect subscribes, fetches, or sets timers, return a cleanup function to prevent memory leaks and race conditions.

### 5. Avoid Effect Chains

Multiple Effects triggering each other causes unnecessary re-renders and makes code hard to follow. Calculate everything in one place (usually an event handler).

### 6. Test in Strict Mode

React 18+ Strict Mode mounts components twice in development to expose missing cleanup. If your Effect breaks, you need cleanup.

### 7. Consider Framework Solutions

For data fetching, prefer your framework's built-in solution (Next.js, Remix) or libraries (React Query, SWR) over manual Effects.

## Reference Files

This skill includes three detailed reference documents:

1. **SKILL.md** - Quick reference table and decision tree
2. **anti-patterns.md** - 9 common mistakes with detailed explanations
3. **alternatives.md** - 8 better alternatives with code examples

## Common Pitfalls

### Multiple Re-renders

**Symptom:** Component re-renders many times in quick succession.

**Cause:** Effect that sets state based on state it depends on, creating a loop.

**Fix:** Calculate the final value in an event handler or during render.

### Stale Data

**Symptom:** UI shows outdated values briefly before updating.

**Cause:** Using Effect to update derived state causes an extra render pass.

**Fix:** Calculate derived values during render instead of in state.

### Race Conditions

**Symptom:** Fast typing shows results for old queries after new ones.

**Cause:** Missing cleanup in data fetching Effect.

**Fix:** Use cleanup flag (`ignore` variable) or AbortController.

### Runs Twice in Development

**Symptom:** Effect runs twice on component mount in development.

**Cause:** React 18 Strict Mode intentionally mounts components twice to expose bugs.

**Fix:** Add proper cleanup. If it's app initialization that shouldn't run twice, use a module-level guard.

## Resources

This skill is based on:
- [React Official Docs: You Might Not Need an Effect](https://react.dev/learn/you-might-not-need-an-effect)
- [React Official Docs: Synchronizing with Effects](https://react.dev/learn/synchronizing-with-effects)
- [React Official Docs: Lifecycle of Reactive Effects](https://react.dev/learn/lifecycle-of-reactive-effects)

## Summary

The golden rule: **Effects are an escape hatch from React.** If you're not synchronizing with an external system, you probably don't need an Effect.

Before writing `useEffect`, ask yourself:
1. Is this responding to a user interaction? → Use event handler
2. Is this a value I can calculate from props/state? → Calculate during render
3. Is this resetting state when a prop changes? → Use key prop
4. Is this synchronizing with an external system? → Use Effect with cleanup

Follow these patterns, and your React code will be more maintainable, performant, and bug-free.

---

### Overview (`templates/plate-playground-template/.agents/skills/vercel-react-best-practices/README.md`)

# React Best Practices

A structured repository for creating and maintaining React Best Practices optimized for agents and LLMs.

## Structure

- `rules/` - Individual rule files (one per rule)
  - `_sections.md` - Section metadata (titles, impacts, descriptions)
  - `_template.md` - Template for creating new rules
  - `area-description.md` - Individual rule files
- `src/` - Build scripts and utilities
- `metadata.json` - Document metadata (version, organization, abstract)
- __`AGENTS.md`__ - Compiled output (generated)
- __`test-cases.json`__ - Test cases for LLM evaluation (generated)

## Getting Started

1. Install dependencies:
   ```bash
   pnpm install
   ```

2. Build AGENTS.md from rules:
   ```bash
   pnpm build
   ```

3. Validate rule files:
   ```bash
   pnpm validate
   ```

4. Extract test cases:
   ```bash
   pnpm extract-tests
   ```

## Creating a New Rule

1. Copy `rules/_template.md` to `rules/area-description.md`
2. Choose the appropriate area prefix:
   - `async-` for Eliminating Waterfalls (Section 1)
   - `bundle-` for Bundle Size Optimization (Section 2)
   - `server-` for Server-Side Performance (Section 3)
   - `client-` for Client-Side Data Fetching (Section 4)
   - `rerender-` for Re-render Optimization (Section 5)
   - `rendering-` for Rendering Performance (Section 6)
   - `js-` for JavaScript Performance (Section 7)
   - `advanced-` for Advanced Patterns (Section 8)
3. Fill in the frontmatter and content
4. Ensure you have clear examples with explanations
5. Run `pnpm build` to regenerate AGENTS.md and test-cases.json

## Rule File Structure

Each rule file should follow this structure:

```markdown
---
title: Rule Title Here
impact: MEDIUM
impactDescription: Optional description
tags: tag1, tag2, tag3
---

## Rule Title Here

Brief explanation of the rule and why it matters.

**Incorrect (description of what's wrong):**

```typescript
// Bad code example
```

**Correct (description of what's right):**

```typescript
// Good code example
```

Optional explanatory text after examples.

Reference: [Link](https://example.com)

## File Naming Convention

- Files starting with `_` are special (excluded from build)
- Rule files: `area-description.md` (e.g., `async-parallel.md`)
- Section is automatically inferred from filename prefix
- Rules are sorted alphabetically by title within each section
- IDs (e.g., 1.1, 1.2) are auto-generated during build

## Impact Levels

- `CRITICAL` - Highest priority, major performance gains
- `HIGH` - Significant performance improvements
- `MEDIUM-HIGH` - Moderate-high gains
- `MEDIUM` - Moderate performance improvements
- `LOW-MEDIUM` - Low-medium gains
- `LOW` - Incremental improvements

## Scripts

- `pnpm build` - Compile rules into AGENTS.md
- `pnpm validate` - Validate all rule files
- `pnpm extract-tests` - Extract test cases for LLM evaluation
- `pnpm dev` - Build and validate

## Contributing

When adding or modifying rules:

1. Use the correct filename prefix for your section
2. Follow the `_template.md` structure
3. Include clear bad/good examples with explanations
4. Add appropriate tags
5. Run `pnpm build` to regenerate AGENTS.md and test-cases.json
6. Rules are automatically sorted by title - no need to manage numbers!

## Acknowledgments

Originally created by [@shuding](https://x.com/shuding) at [Vercel](https://vercel.com).

---

### Overview (`templates/plate-template/.agents/skills/react-useeffect/README.md`)

# React useEffect Best Practices

A comprehensive guide teaching when to use `useEffect` in React, and more importantly, when NOT to use it. This skill is based on official React documentation and provides practical alternatives to common useEffect anti-patterns.

## Purpose

Effects are an **escape hatch** from React's reactive paradigm. They let you synchronize with external systems like browser APIs, third-party widgets, or network requests. However, many developers overuse Effects for tasks that React handles better through other means.

This skill helps you:
- Identify when you truly need an Effect vs. when you don't
- Recognize common anti-patterns and their fixes
- Apply better alternatives like `useMemo`, `key` prop, and event handlers
- Write Effects that are clean, maintainable, and free from race conditions

## When to Use This Skill

Use this skill when you're:
- Writing or reviewing `useEffect` code
- Using `useState` to store derived values
- Implementing data fetching or subscriptions
- Synchronizing state between components
- Facing bugs with stale data or race conditions
- Wondering if your Effect is necessary

**Trigger phrases:**
- "Should I use useEffect for this?"
- "How do I fix this useEffect?"
- "My Effect is causing too many re-renders"
- "Data fetching with useEffect"
- "Reset state when props change"
- "Derived state from props"

## How It Works

This skill provides guidance through three key resources:

1. **Quick Reference Table** - Fast lookup for common scenarios with DO/DON'T patterns
2. **Decision Tree** - Visual flowchart to determine the right approach
3. **Detailed Anti-Patterns** - 9 common mistakes with explanations and fixes
4. **Better Alternatives** - 8 proven patterns to replace unnecessary Effects

The skill teaches you to ask the right questions:
- Is there an external system involved?
- Am I responding to a user event or component appearance?
- Can this value be calculated during render?
- Do I need to reset state when a prop changes?

## Key Features

### 1. Quick Reference Guide

Visual table showing the DO/DON'T for common scenarios:
- Derived state from props/state
- Expensive calculations
- Resetting state on prop change
- User event responses
- Notifying parent components
- Data fetching

### 2. Decision Tree

Clear flowchart that guides you from "Need to respond to something?" to the correct solution:
- User interaction → Event handler
- Component appeared → Effect (for external sync/analytics)
- Derived value needed → Calculate during render (+ useMemo if expensive)
- Reset state on prop change → Key prop

### 3. Anti-Pattern Recognition

Detailed examples of 9 common mistakes:
1. Redundant state for derived values
2. Filtering/transforming data in Effect
3. Resetting state on prop change
4. Event-specific logic in Effect
5. Chains of Effects
6. Notifying parent via Effect
7. Passing data up to parent
8. Fetching without cleanup (race conditions)
9. App initialization in Effect

Each anti-pattern includes:
- Bad example with explanation
- Good example with fix
- Why the anti-pattern is problematic

### 4. Better Alternatives

8 proven patterns to replace unnecessary Effects:
1. Calculate during render for derived state
2. `useMemo` for expensive calculations
3. `key` prop to reset state
4. Store ID instead of object for stable references
5. Event handlers for user actions
6. `useSyncExternalStore` for external stores
7. Lifting state up for shared state
8. Custom hooks for data fetching with cleanup

## Usage Examples

### Example 1: Derived State

**Bad - Unnecessary Effect:**
```tsx
function Form() {
  const [firstName, setFirstName] = useState('Taylor');
  const [lastName, setLastName] = useState('Swift');
  const [fullName, setFullName] = useState('');

  useEffect(() => {
    setFullName(firstName + ' ' + lastName);
  }, [firstName, lastName]);
}
```

**Good - Calculate during render:**
```tsx
function Form() {
  const [firstName, setFirstName] = useState('Taylor');
  const [lastName, setLastName] = useState('Swift');
  const fullName = firstName + ' ' + lastName; // Just compute it
}
```

### Example 2: Resetting State

**Bad - Effect to reset:**
```tsx
function ProfilePage({ userId }) {
  const [comment, setComment] = useState('');

  useEffect(() => {
    setComment('');
  }, [userId]);
}
```

**Good - Key prop:**
```tsx
function ProfilePage({ userId }) {
  return <Profile userId={userId} key={userId} />;
}

function Profile({ userId }) {
  const [comment, setComment] = useState(''); // Resets automatically
}
```

### Example 3: Data Fetching with Cleanup

**Bad - Race condition:**
```tsx
function SearchResults({ query }) {
  const [results, setResults] = useState([]);

  useEffect(() => {
    fetchResults(query).then(json => {
      setResults(json); // "hello" response may arrive after "hell"
    });
  }, [query]);
}
```

**Good - Cleanup flag:**
```tsx
function SearchResults({ query }) {
  const [results, setResults] = useState([]);

  useEffect(() => {
    let ignore = false;

    fetchResults(query).then(json => {
      if (!ignore) setResults(json);
    });

    return () => { ignore = true; };
  }, [query]);
}
```

### Example 4: Event Handler Instead of Effect

**Bad - Effect watching state:**
```tsx
function ProductPage({ product, addToCart }) {
  useEffect(() => {
    if (product.isInCart) {
      showNotification(`Added ${product.name}!`);
    }
  }, [product]);

  function handleBuyClick() {
    addToCart(product);
  }
}
```

**Good - Handle in event:**
```tsx
function ProductPage({ product, addToCart }) {
  function handleBuyClick() {
    addToCart(product);
    showNotification(`Added ${product.name}!`);
  }
}
```

## When You DO Need Effects

Effects are appropriate for:

- **Synchronizing with external systems** - Browser APIs, third-party widgets, non-React code
- **Subscriptions** - WebSocket connections, global event listeners (prefer `useSyncExternalStore`)
- **Analytics/logging** - Code that needs to run because the component displayed
- **Data fetching** - With proper cleanup (or use your framework's built-in mechanism)

## When You DON'T Need Effects

Avoid Effects for:

1. **Transforming data for rendering** - Calculate at the top level instead
2. **Handling user events** - Use event handlers where you know exactly what happened
3. **Deriving state** - Just compute it: `const fullName = firstName + ' ' + lastName`
4. **Chaining state updates** - Calculate all next state in the event handler
5. **Notifying parent components** - Call the callback in the same event handler
6. **Resetting state** - Use the `key` prop to create a fresh component instance

## Best Practices

### 1. Start Without an Effect

Before adding an Effect, ask: "Is there an external system involved?" If no, you probably don't need an Effect.

### 2. Prefer Derived State

If you can calculate a value from props or state, don't store it in state with an Effect updating it.

### 3. Use the Right Tool

- Expensive calculation → `useMemo`
- User interaction → Event handler
- Reset on prop change → `key` prop
- External subscription → `useSyncExternalStore`
- Shared state → Lift state up

### 4. Always Clean Up

If your Effect subscribes, fetches, or sets timers, return a cleanup function to prevent memory leaks and race conditions.

### 5. Avoid Effect Chains

Multiple Effects triggering each other causes unnecessary re-renders and makes code hard to follow. Calculate everything in one place (usually an event handler).

### 6. Test in Strict Mode

React 18+ Strict Mode mounts components twice in development to expose missing cleanup. If your Effect breaks, you need cleanup.

### 7. Consider Framework Solutions

For data fetching, prefer your framework's built-in solution (Next.js, Remix) or libraries (React Query, SWR) over manual Effects.

## Reference Files

This skill includes three detailed reference documents:

1. **SKILL.md** - Quick reference table and decision tree
2. **anti-patterns.md** - 9 common mistakes with detailed explanations
3. **alternatives.md** - 8 better alternatives with code examples

## Common Pitfalls

### Multiple Re-renders

**Symptom:** Component re-renders many times in quick succession.

**Cause:** Effect that sets state based on state it depends on, creating a loop.

**Fix:** Calculate the final value in an event handler or during render.

### Stale Data

**Symptom:** UI shows outdated values briefly before updating.

**Cause:** Using Effect to update derived state causes an extra render pass.

**Fix:** Calculate derived values during render instead of in state.

### Race Conditions

**Symptom:** Fast typing shows results for old queries after new ones.

**Cause:** Missing cleanup in data fetching Effect.

**Fix:** Use cleanup flag (`ignore` variable) or AbortController.

### Runs Twice in Development

**Symptom:** Effect runs twice on component mount in development.

**Cause:** React 18 Strict Mode intentionally mounts components twice to expose bugs.

**Fix:** Add proper cleanup. If it's app initialization that shouldn't run twice, use a module-level guard.

## Resources

This skill is based on:
- [React Official Docs: You Might Not Need an Effect](https://react.dev/learn/you-might-not-need-an-effect)
- [React Official Docs: Synchronizing with Effects](https://react.dev/learn/synchronizing-with-effects)
- [React Official Docs: Lifecycle of Reactive Effects](https://react.dev/learn/lifecycle-of-reactive-effects)

## Summary

The golden rule: **Effects are an escape hatch from React.** If you're not synchronizing with an external system, you probably don't need an Effect.

Before writing `useEffect`, ask yourself:
1. Is this responding to a user interaction? → Use event handler
2. Is this a value I can calculate from props/state? → Calculate during render
3. Is this resetting state when a prop changes? → Use key prop
4. Is this synchronizing with an external system? → Use Effect with cleanup

Follow these patterns, and your React code will be more maintainable, performant, and bug-free.

---

### Overview (`templates/plate-template/.agents/skills/vercel-react-best-practices/README.md`)

# React Best Practices

A structured repository for creating and maintaining React Best Practices optimized for agents and LLMs.

## Structure

- `rules/` - Individual rule files (one per rule)
  - `_sections.md` - Section metadata (titles, impacts, descriptions)
  - `_template.md` - Template for creating new rules
  - `area-description.md` - Individual rule files
- `src/` - Build scripts and utilities
- `metadata.json` - Document metadata (version, organization, abstract)
- __`AGENTS.md`__ - Compiled output (generated)
- __`test-cases.json`__ - Test cases for LLM evaluation (generated)

## Getting Started

1. Install dependencies:
   ```bash
   pnpm install
   ```

2. Build AGENTS.md from rules:
   ```bash
   pnpm build
   ```

3. Validate rule files:
   ```bash
   pnpm validate
   ```

4. Extract test cases:
   ```bash
   pnpm extract-tests
   ```

## Creating a New Rule

1. Copy `rules/_template.md` to `rules/area-description.md`
2. Choose the appropriate area prefix:
   - `async-` for Eliminating Waterfalls (Section 1)
   - `bundle-` for Bundle Size Optimization (Section 2)
   - `server-` for Server-Side Performance (Section 3)
   - `client-` for Client-Side Data Fetching (Section 4)
   - `rerender-` for Re-render Optimization (Section 5)
   - `rendering-` for Rendering Performance (Section 6)
   - `js-` for JavaScript Performance (Section 7)
   - `advanced-` for Advanced Patterns (Section 8)
3. Fill in the frontmatter and content
4. Ensure you have clear examples with explanations
5. Run `pnpm build` to regenerate AGENTS.md and test-cases.json

## Rule File Structure

Each rule file should follow this structure:

```markdown
---
title: Rule Title Here
impact: MEDIUM
impactDescription: Optional description
tags: tag1, tag2, tag3
---

## Rule Title Here

Brief explanation of the rule and why it matters.

**Incorrect (description of what's wrong):**

```typescript
// Bad code example
```

**Correct (description of what's right):**

```typescript
// Good code example
```

Optional explanatory text after examples.

Reference: [Link](https://example.com)

## File Naming Convention

- Files starting with `_` are special (excluded from build)
- Rule files: `area-description.md` (e.g., `async-parallel.md`)
- Section is automatically inferred from filename prefix
- Rules are sorted alphabetically by title within each section
- IDs (e.g., 1.1, 1.2) are auto-generated during build

## Impact Levels

- `CRITICAL` - Highest priority, major performance gains
- `HIGH` - Significant performance improvements
- `MEDIUM-HIGH` - Moderate-high gains
- `MEDIUM` - Moderate performance improvements
- `LOW-MEDIUM` - Low-medium gains
- `LOW` - Incremental improvements

## Scripts

- `pnpm build` - Compile rules into AGENTS.md
- `pnpm validate` - Validate all rule files
- `pnpm extract-tests` - Extract test cases for LLM evaluation
- `pnpm dev` - Build and validate

## Contributing

When adding or modifying rules:

1. Use the correct filename prefix for your section
2. Follow the `_template.md` structure
3. Include clear bad/good examples with explanations
4. Add appropriate tags
5. Run `pnpm build` to regenerate AGENTS.md and test-cases.json
6. Rules are automatically sorted by title - no need to manage numbers!

## Acknowledgments

Originally created by [@shuding](https://x.com/shuding) at [Vercel](https://vercel.com).

---

### Overview (`apps/www/src/__tests__/package-integration/__deferred__/README.md`)

# Deferred Integration Red Suite

This folder is for future-contract integration tests that are intentionally red.

Use it when:

- the protocol doc names an interaction class we still do not implement
- the expected future behavior is clear enough to write down now
- mixing the red spec into the normal green suite would be stupid

Do not use it for:

- vague ideas
- duplicate green tests
- package-local unit seams

Rules:

- keep specs under domain folders like `clipboard`, `ime`, `mouse-selection`,
  and `platform-shortcuts`
- use `*.deferred.spec.ts[x]`
- reference the future protocol lane or spec ID in the title or file
- keep the assertions public-interface focused
- do not import app-registry fluff if a smaller seam exists

Normal `pnpm test` and `pnpm test:slow` ignore this folder.

Run it explicitly with:

```bash
pnpm test:deferred
```

That command expects the suite to stay red. If everything suddenly passes, the
runner fails so the specs get promoted instead of rotting here.

---

### Overview (`apps/www/src/registry/changelog/entries/README.md`)

# Registry changelog entries

This directory is the source for Plate UI registry changelog entries.

One file equals one changelog event. Generated public JSON lives one directory
up in `apps/www/src/registry/changelog/*.json`; do not edit that JSON by hand.

## Create an Entry

```bash
node tooling/scripts/generate-ui-changelog-entries.mjs \
  --new 2026-06-15-fix-editor-wrapping \
  --summary "Fix editor wrapping" \
  --items editor,editor-static \
  --kind fix
```

Then regenerate and verify:

```bash
node tooling/scripts/generate-ui-changelog-entries.mjs --write
node tooling/scripts/generate-ui-changelog-entries.mjs --check
```

## Shape

```mdx
---
id: 2026-06-15-fix-editor-wrapping
date: 2026-06-15
status: draft
kind: fix
summary: "Fix editor wrapping"
change: {"type":"source","date":"2026-06-15","commits":[]}
release: {"status":"unresolved"}
diagnostics: []
---

- **`editor`**, **`editor-static`**: Fix preserved-space wrapping in editable and static editors.
```

Keep prose user-facing. Do not include implementation notes, test notes, or
internal architecture rationale.

---

### Docs Index (`content/docs/index.mdx`)

---
title: Introduction
description: Build rich-text editors with Plate, Plate UI, AI, MCP, and shadcn/ui.
---

Plate is a React framework for building rich-text editors. It gives you a headless editor runtime, composable plugins, and optional Plate UI components that you copy into your app. Start with Plate UI for a complete editor, or use the packages directly when you need a headless setup.

## Choose a Path

<Cards>
  <Card
    href="/docs/installation/plate-ui"
    title="Install Plate UI"
    description="Use the shadcn CLI to add the editor UI, kits, and starter components."
  />
  <Card
    href="/docs/installation"
    title="Pick an install guide"
    description="Choose Next.js, React, RSC, Node.js, or manual setup."
  />
  <Card
    href="/docs/plugin"
    title="Learn plugins"
    description="Understand the headless plugin model before customizing behavior."
  />
  <Card
    href="/editors"
    title="Start from a template"
    description="Copy a complete editor configuration and adapt it in your app."
  />
</Cards>

## What Plate Owns

| Layer | What it owns | Start here |
| --- | --- | --- |
| `platejs` | Core editor runtime, React bindings, and editor APIs. | [Installation](/docs/installation) |
| `@platejs/*` packages | Headless plugins for nodes, marks, serialization, collaboration, AI, and editor behavior. | [Plugin guide](/docs/plugin) |
| Plate UI registry | App-local UI components, kits, editor templates, and API routes installed through the shadcn CLI. | [Plate UI](/docs/installation/plate-ui) |
| Your app | The copied component code, styling, routing, data model, and product-specific editor behavior. | [Plugin Components](/docs/plugin-components) |

## Why Plate UI?

Plate UI follows the shadcn/ui model: you copy the code, own it, and keep editing it in your app.

- **Open code:** The UI layer is app-local code, not a sealed component package.
- **Composition:** Components use predictable React and shadcn/ui conventions.
- **CLI distribution:** Add kits, templates, components, API routes, and docs through the shadcn CLI.
- **AI-ready:** Open component code and consistent registry metadata give agents real context.
- **MCP-ready:** The [MCP setup](/docs/installation/mcp) lets AI tools inspect and apply Plate registry items.

Done. You can install the full UI path, drop down to headless packages, or start from an editor template.

## FAQ

<Accordions>
  <Accordion title="Which frameworks are Plate compatible with?">
    Plate works in React environments. Use the [Next.js guide](/docs/installation/next) for server-rendered apps, the [React guide](/docs/installation/react) for Vite and client-side apps, [RSC](/docs/installation/rsc) for server components, and [Node.js](/docs/installation/node) for backend-only processing.
  </Accordion>

  <Accordion title="What's the difference between Plate and Plate UI?">
    **Plate** is the headless editor framework: runtime, plugins, transforms, APIs, and React bindings. **Plate UI** is the copied UI layer: components, kits, editor templates, and API routes installed into your app.
  </Accordion>

  <Accordion title="Can I use Plate / Plate UI in my project?">
    Yes. Plate and Plate UI are free for personal and commercial projects. Attribution is not required.
  </Accordion>

  <Accordion title="Is Plate UI a replacement for shadcn/ui?">
    No. Plate UI uses [shadcn/ui](https://ui.shadcn.com/) conventions for editor-specific UI. Use shadcn/ui for the rest of your application.
  </Accordion>

  <Accordion title="How do I manage updates with an Open Code approach?">
    Package behavior updates through `platejs` and `@platejs/*` dependencies. Copied UI code is yours, so update it by comparing the Plate registry source with your local files or by using the [MCP setup](/docs/installation/mcp).
  </Accordion>

  <Accordion title="Why copy/paste components instead of using an npm package?">
    The copied component layer lets you change markup, styles, toolbar behavior, and product details without waiting for a package API to expose every option.
  </Accordion>

  <Accordion title="Will Plate UI be published as an npm package?">
    No. Plate UI is distributed as registry code through the shadcn CLI so the UI layer stays owned by your app.
  </Accordion>
</Accordions>

## Credits

- [shadcn/ui](https://ui.shadcn.com/) - For UI inspiration, documentation, and the CLI.
- [Radix UI](https://radix-ui.com) - For the unstyled, accessible primitives.
- [Vercel](https://vercel.com) - For hosting.
- [Shu Ding](https://shud.in) - Typography style adapted from [Nextra](https://nextra.site).
- [cmdk](https://cmdk.paco.me) - For the `<Command />` component.

---

### Research Index (`docs/research/index.md`)

# Research Index

This is the entrypoint for the compiled agent research layer.

## Top Level

- [README.md](docs/research/README.md)
  Source of truth for the research pattern, operating rules, and layer boundaries.
- [log.md](docs/research/log.md)
  Append-only operational history for research ingests and restructures.
- [schema.md](docs/research/schema.md)
  Minimal metadata contract for the research page types.

## Directories

- [commands/README.md](docs/research/commands/README.md)
  Operational command specs for running the research workflows.
- [sources/README.md](docs/research/sources/README.md)
  Compiled summaries of raw evidence.
- [decisions/README.md](docs/research/decisions/README.md)
  Canonical repo-relevant choices and policy calls.
- [concepts/README.md](docs/research/concepts/README.md)
  Shared vocabulary and abstractions.
- [systems/README.md](docs/research/systems/README.md)
  Architecture and authority maps.
- [editor-behavior-architecture.md](docs/research/systems/editor-behavior-architecture.md)
  Long-horizon architecture for profile-driven editor behavior.
- [systems/editor-architecture-landscape.md](docs/research/systems/editor-architecture-landscape.md)
  Compiled comparison map for the editor architecture candidate lane behind the
  Slate v2 overlay rewrite.
- [systems/slate-v2-overlay-architecture.md](docs/research/systems/slate-v2-overlay-architecture.md)
  Stable research-layer architecture map for the Slate v2 overlay system.
- [entities/README.md](docs/research/entities/README.md)
  Concrete named things like editors, packages, and plugins.
- [entities/typora.md](docs/research/entities/typora.md)
  Seed entity page for the first editor-reference corpus.
- [open-questions/README.md](docs/research/open-questions/README.md)
  Known ambiguity that should not be flattened into fake certainty.

## First Targets

- operational baseline:
  [commands/full-pipeline.md](docs/research/commands/full-pipeline.md)
- upkeep baseline:
  [commands/maintain.md](docs/research/commands/maintain.md)
- Typora compiled source pages derived from `../raw/typora`, starting in
  [sources/typora/README.md](docs/research/sources/typora/README.md)
- first compiled Typora source pages:
  [corpus-overview.md](docs/research/sources/typora/corpus-overview.md)
  and
  [editor-behavior-priority-map.md](docs/research/sources/typora/editor-behavior-priority-map.md)
- first Typora source-cluster syntheses:
  [markdown-native-editing-foundations.md](docs/research/sources/typora/markdown-native-editing-foundations.md),
  [clipboard-and-delete-behavior.md](docs/research/sources/typora/clipboard-and-delete-behavior.md),
  [links-images-and-html-behavior.md](docs/research/sources/typora/links-images-and-html-behavior.md),
  [media-authoring-and-path-policy.md](docs/research/sources/typora/media-authoring-and-path-policy.md),
  [navigation-search-outline-and-toc.md](docs/research/sources/typora/navigation-search-outline-and-toc.md),
  and
  [code-math-table-and-task-surfaces.md](docs/research/sources/typora/code-math-table-and-task-surfaces.md)
  plus
  [math-delimiter-triggers.md](docs/research/sources/typora/math-delimiter-triggers.md)
  plus
  [markdown-shorthand-and-inline-autoformat.md](docs/research/sources/typora/markdown-shorthand-and-inline-autoformat.md)
- Typora system map:
  [typora-behavior-map.md](docs/research/systems/typora-behavior-map.md)
- first Typora-derived concepts and decisions now exist under:
  [concepts/](docs/research/concepts/README.md),
  [decisions/](docs/research/decisions/README.md),
  and
  [open-questions/](docs/research/open-questions/README.md)
- newer date/media expansion follow-up now also includes:
  - [media-authoring-follows-the-image-path-policy-family.md](docs/research/decisions/media-authoring-follows-the-image-path-policy-family.md)
  - [date-mdx-payload-contract.md](docs/research/open-questions/date-mdx-payload-contract.md)
  - [math-delimiter-trigger-authority.md](docs/research/open-questions/math-delimiter-trigger-authority.md)
- editor architecture lane now also includes:
  - [sources/editor-architecture/README.md](docs/research/sources/editor-architecture/README.md)
  - [decorations-annotations-overlay-corpus.md](docs/research/sources/editor-architecture/decorations-annotations-overlay-corpus.md)
  - narrower source clusters for:
    ProseMirror,
    Lexical,
    Tiptap,
    local Slate v2 proof,
    layout/measurement/IME,
    lightweight editable surfaces,
    and service/store models
  - [systems/editor-architecture-landscape.md](docs/research/systems/editor-architecture-landscape.md)
  - [systems/slate-v2-perfect-plan-steal-reject-defer-map.md](docs/research/systems/slate-v2-perfect-plan-steal-reject-defer-map.md)
  - [systems/slate-v2-overlay-architecture.md](docs/research/systems/slate-v2-overlay-architecture.md)
  - [slate-v2-overlay-architecture-cuts.md](docs/research/decisions/slate-v2-overlay-architecture-cuts.md)
  - [slate-v2-overlay-superiority-vs-legacy-and-field.md](docs/research/decisions/slate-v2-overlay-superiority-vs-legacy-and-field.md)
  - [react-19-2-external-store-and-background-ui.md](docs/research/sources/editor-architecture/react-19-2-external-store-and-background-ui.md)
  - [tanstack-virtual-and-github-large-surface-virtualization.md](docs/research/sources/editor-architecture/tanstack-virtual-and-github-large-surface-virtualization.md)
  - [pretext-pagination-page-virtualization.md](docs/research/sources/editor-architecture/pretext-pagination-page-virtualization.md)
  - [slate-v2-react-19-2-perf-architecture-vs-field.md](docs/research/decisions/slate-v2-react-19-2-perf-architecture-vs-field.md)
  - [source-scoped-overlay-invalidation.md](docs/research/concepts/source-scoped-overlay-invalidation.md)
  - [slate-v2-source-scoped-overlay-invalidation.md](docs/research/decisions/slate-v2-source-scoped-overlay-invalidation.md)
  - [slate-v2-collaborative-annotation-channels.md](docs/research/decisions/slate-v2-collaborative-annotation-channels.md)
  - [slate-v2-data-model-first-react-perfect-runtime.md](docs/research/decisions/slate-v2-data-model-first-react-perfect-runtime.md)
  - [read-update-runtime-corpus-ledger.md](docs/research/sources/editor-architecture/read-update-runtime-corpus-ledger.md)
  - [lexical-read-update-extension-runtime.md](docs/research/sources/editor-architecture/lexical-read-update-extension-runtime.md)
  - [prosemirror-transaction-view-dom-runtime.md](docs/research/sources/editor-architecture/prosemirror-transaction-view-dom-runtime.md)
  - [tiptap-extension-command-react-dx.md](docs/research/sources/editor-architecture/tiptap-extension-command-react-dx.md)
  - [slate-v2-read-update-runtime-architecture.md](docs/research/decisions/slate-v2-read-update-runtime-architecture.md)
  - [slate-v2-perfect-plan-should-steal-read-update-transaction-discipline-and-extension-dx.md](docs/research/decisions/slate-v2-perfect-plan-should-steal-read-update-transaction-discipline-and-extension-dx.md)
  - [slate-v2-state-tx-public-api-and-extension-namespaces.md](docs/research/decisions/slate-v2-state-tx-public-api-and-extension-namespaces.md)
  - [slate-v2-post-closure-architecture-review.md](docs/research/decisions/slate-v2-post-closure-architecture-review.md)
  - [slate-v2-architecture-verdict-after-human-stress-sweep.md](docs/research/decisions/slate-v2-architecture-verdict-after-human-stress-sweep.md)
  - [node-text-mark-render-dx-corpus-ledger.md](docs/research/sources/editor-architecture/node-text-mark-render-dx-corpus-ledger.md)
  - [scroll-selection-visibility-runtime.md](docs/research/sources/editor-architecture/scroll-selection-visibility-runtime.md)
  - [editor-node-text-mark-dx-landscape.md](docs/research/systems/editor-node-text-mark-dx-landscape.md)
  - [editor-node-dx-should-use-runtime-owned-shells-and-spec-first-renderers.md](docs/research/decisions/editor-node-dx-should-use-runtime-owned-shells-and-spec-first-renderers.md)
  - concept pages for:
    [overlay-lane-separation](docs/research/concepts/overlay-lane-separation.md),
    [durable-anchor-vs-live-handle](docs/research/concepts/durable-anchor-vs-live-handle.md),
    [runtime-identity-vs-tree-address](docs/research/concepts/runtime-identity-vs-tree-address.md),
    and
    [source-scoped-overlay-invalidation](docs/research/concepts/source-scoped-overlay-invalidation.md)
  - entity pages for:
    [ProseMirror](docs/research/entities/prosemirror.md),
    [Lexical](docs/research/entities/lexical.md),
    [Tiptap](docs/research/entities/tiptap.md),
    [Premirror](docs/research/entities/premirror.md),
    [Pretext](docs/research/entities/pretext.md),
    [Slate](docs/research/entities/slate.md),
    [edix](docs/research/entities/edix.md),
    [use-editable](docs/research/entities/use-editable.md),
    [rich-textarea](docs/research/entities/rich-textarea.md),
    [VS Code](docs/research/entities/vscode.md),
    [TanStack DB](docs/research/entities/tanstack-db.md),
    and
    [EditContext](docs/research/entities/editcontext.md)
- Milkdown compiled source pages derived from `../raw/milkdown`, starting in
  [sources/milkdown/README.md](docs/research/sources/milkdown/README.md)
- Obsidian compiled source pages derived from `../raw/obsidian`, starting in
  [sources/obsidian/README.md](docs/research/sources/obsidian/README.md)
- Obsidian now also has:
  - [footnotes-and-block-links.md](docs/research/sources/obsidian/footnotes-and-block-links.md)
  - [math-delimiters-and-pair-settings.md](docs/research/sources/obsidian/math-delimiters-and-pair-settings.md)
  - [obsidian-authority-scope.md](docs/research/open-questions/obsidian-authority-scope.md)
- Milkdown now also has:
  - [latex-trigger-surface.md](docs/research/sources/milkdown/latex-trigger-surface.md)
  - [input-autoformat-lanes.md](docs/research/sources/milkdown/input-autoformat-lanes.md)
- autoformat follow-up now also includes:
  - [autoformat-families-are-profile-adjacent-input-assist-surfaces.md](docs/research/decisions/autoformat-families-are-profile-adjacent-input-assist-surfaces.md)
  - [link-automd-belongs-to-the-link-interaction-lane.md](docs/research/decisions/link-automd-belongs-to-the-link-interaction-lane.md)
  - [current-kit-autoformat-normalization-split.md](docs/research/decisions/current-kit-autoformat-normalization-split.md)
  - [text-substitution-autoformat-authority.md](docs/research/open-questions/text-substitution-autoformat-authority.md)
- input-rule docs IA follow-up now also includes:
  - [sources/tiptap/input-rules-and-extension-doc-patterns.md](docs/research/sources/tiptap/input-rules-and-extension-doc-patterns.md)
  - [sources/prosemirror/guide-reference-and-example-doc-patterns.md](docs/research/sources/prosemirror/guide-reference-and-example-doc-patterns.md)
  - [sources/lexical/markdown-package-and-shortcuts-doc-patterns.md](docs/research/sources/lexical/markdown-package-and-shortcuts-doc-patterns.md)
  - [sources/slate/walkthrough-concepts-and-api-doc-patterns.md](docs/research/sources/slate/walkthrough-concepts-and-api-doc-patterns.md)
  - [systems/plugin-input-rule-doc-pattern-landscape.md](docs/research/systems/plugin-input-rule-doc-pattern-landscape.md)
  - [decisions/plugin-input-rules-guide-should-lead-with-runtime-first-then-feature-owners-then-api-reference.md](docs/research/decisions/plugin-input-rules-guide-should-lead-with-runtime-first-then-feature-owners-then-api-reference.md)
- one-to-one Typora source-card layer now lives in:
  `../raw/typora/page-cards/` and `../raw/typora/catalog.md`
- cross-links from Typora pages into existing
  [docs/editor-behavior](docs/editor-behavior)
  source-of-truth docs

---

### Slate Browser Overview (`docs/slate-browser/overview.md`)

---
date: 2026-04-03
topic: slate-browser-testing-framework-overview
---

# Slate Browser Testing Framework Overview

> Specialist testing/proof doc. For current queue and roadmap truth, see [master-roadmap.md](/Users/zbeyens/git/plate-2/docs/slate-v2/master-roadmap.md).

## Purpose

This doc defines the specialist testing/proof lane for editor work and the
future testing-framework direction it draws from
[editor-architecture-candidates.md](/Users/zbeyens/git/plate-2/docs/analysis/editor-architecture-candidates.md).

This is not a “pick one runner and call it done” doc.

Strong take:

- the best editor testing framework is **layered**
- one runner to rule them all is a trap
- speed, fidelity, and coverage want different tools

`slate-browser` is a good name for this doc area because the main unsolved gap
is browser-facing editor behavior, not pure core semantics. This repo keeps
internal docs under `docs/`, so the doc lives in `docs/slate-browser/`.

Follow-up docs:

- [framework-design.md](/Users/zbeyens/git/plate-2/docs/slate-browser/framework-design.md)
- [api-design.md](/Users/zbeyens/git/plate-2/docs/slate-browser/api-design.md)
- [proof-lane-matrix.md](/Users/zbeyens/git/plate-2/docs/slate-browser/proof-lane-matrix.md)
- [next-api-candidates.md](/Users/zbeyens/git/plate-2/docs/slate-browser/next-api-candidates.md)
- [next-api-candidates-matrix.md](/Users/zbeyens/git/plate-2/docs/slate-browser/next-api-candidates-matrix.md)
- [four-way-api-deep-dive.md](/Users/zbeyens/git/plate-2/docs/slate-browser/four-way-api-deep-dive.md)
- [next-system-move.md](/Users/zbeyens/git/plate-2/docs/slate-browser/next-system-move.md)
- [prioritized-backlog.md](/Users/zbeyens/git/plate-2/docs/slate-browser/prioritized-backlog.md)

Current package:

- package:
  [/Users/zbeyens/git/slate-v2/packages/slate-browser](/Users/zbeyens/git/slate-v2/packages/slate-browser)
- Playwright harness entrypoint:
  [/Users/zbeyens/git/slate-v2/packages/slate-browser/src/playwright/index.ts](/Users/zbeyens/git/slate-v2/packages/slate-browser/src/playwright/index.ts)

Canonical root commands:

- `yarn build:slate-browser:playwright`
- `yarn setup:slate-browser`
- `yarn test:slate-browser`
- `yarn test:slate-browser:core`
- `yarn test:slate-browser:dom`
- `yarn test:slate-browser:selection`
- `yarn test:slate-browser:e2e`
- `yarn test:slate-browser:e2e:local`
- `yarn test:slate-browser:ime`
- `yarn test:slate-browser:ime:local`
- `yarn test:slate-browser:anchors`
- `yarn test:replacement:compat:local`
- `yarn test:replacement:gate:local`

Current role:

- `slate-browser` is the specialist testing/proof lane for the master roadmap
- it does not own roadmap truth or queue order
- it feeds the emitted-artifact obligations in
  [true-slate-rc-proof-ledger.md](/Users/zbeyens/git/plate-2/docs/slate-v2/true-slate-rc-proof-ledger.md)
- the current live browser/runtime proof rows are carried by:
  - [runtime.tsx](/Users/zbeyens/git/slate-v2/packages/slate-react/test/runtime.tsx)
  - [replacement-compatibility.test.ts](/Users/zbeyens/git/slate-v2/playwright/integration/examples/replacement-compatibility.test.ts)
- if `slate-browser` work reopens, the current follow-on seam is captured in
  [next-system-move.md](/Users/zbeyens/git/plate-2/docs/slate-browser/next-system-move.md)

## Migration Review Rule

When a browser lane disappears or changes shape, the acceptance bar is not
"there used to be a file with that name."

The acceptance bar is:

- the contributor-facing concept still exists
- the proof owner is explicit in
  [proof-lane-matrix.md](/Users/zbeyens/git/plate-2/docs/slate-browser/proof-lane-matrix.md)
  or the live `docs/slate-v2` verdict docs
- the moved or removed lane is documented in the maintainer diff story

## What We Are Optimizing For

1. fast local feedback
2. real browser behavior when browser behavior is the thing under test
3. first-class IME/composition coverage
4. deterministic selection assertions
5. performance lanes that measure instead of hand-wave
6. future agent-native extensibility, so an agent layer can be added later
   without distorting the deterministic core design

## Best Ideas By Repo

## Lexical

Best steal:

- real browser IME tests with Chromium CDP
- selection assertions as first-class artifacts
- explicit browser matrix for e2e

Key files:

- [/Users/zbeyens/git/lexical/packages/lexical-playground/**tests**/e2e/Composition.spec.mjs](/Users/zbeyens/git/lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs)
- [/Users/zbeyens/git/lexical/packages/lexical-playground/**tests**/utils/index.mjs](/Users/zbeyens/git/lexical/packages/lexical-playground/__tests__/utils/index.mjs)

Take:

- this is the best model for the IME lane
- do not try to reinvent IME testing in jsdom when Lexical already proved the
  right browser seam

## Slate

Best steal:

- example-driven Playwright integration already exists
- mixed unit/dom/browser stack already covers real product surfaces

Key files:

- [/Users/zbeyens/git/slate-v2/playwright/integration/examples/placeholder.test.ts](/Users/zbeyens/git/slate-v2/playwright/integration/examples/placeholder.test.ts)
- [/Users/zbeyens/git/slate-v2/package.json](/Users/zbeyens/git/slate-v2/package.json)

Take:

- keep Slate’s Playwright harness
- grow it instead of replacing it

## edix

Best steal:

- Vitest project split between fast unit and browser tests
- Playwright e2e plus direct IME cases in the same repo

Key files:

- [/Users/zbeyens/git/edix/vitest.config.ts](/Users/zbeyens/git/edix/vitest.config.ts)
- [/Users/zbeyens/git/edix/e2e/common.spec.ts](/Users/zbeyens/git/edix/e2e/common.spec.ts)

Take:

- this is the best small-repo shape for “fast browser contract tests”
- especially useful for focused DOM/selection assertions that are too browser-ish
  for jsdom but too small for heavyweight e2e suites

## rich-textarea

Best steal:

- composition-aware selection compensation
- split between unit, browser-story, and Playwright e2e

Key files:

- [/Users/zbeyens/git/rich-textarea/src/selection.ts](/Users/zbeyens/git/rich-textarea/src/selection.ts)
- [/Users/zbeyens/git/rich-textarea/vitest.config.ts](/Users/zbeyens/git/rich-textarea/vitest.config.ts)
- [/Users/zbeyens/git/rich-textarea/e2e/textarea.spec.ts](/Users/zbeyens/git/rich-textarea/e2e/textarea.spec.ts)

Take:

- good model for lightweight surfaces and composition-aware selection helpers
- not enough on its own for rich-contenteditable editor coverage

## Tiptap

Best steal:

- good placeholder extension tests
- decent product-DX test posture with unit + Cypress

Key files:

- [/Users/zbeyens/git/tiptap/packages/extensions/**tests**/placeholder.spec.ts](/Users/zbeyens/git/tiptap/packages/extensions/__tests__/placeholder.spec.ts)
- [/Users/zbeyens/git/tiptap/package.json](/Users/zbeyens/git/tiptap/package.json)

Take:

- useful for extension behavior and product-layer regression shape
- not the best IME or low-level browser harness model

## Premirror

Best steal:

- the cleanest written testing strategy for layout, determinism, and perf

Key file:

- [/Users/zbeyens/git/premirror/docs/testing-strategy.md](/Users/zbeyens/git/premirror/docs/testing-strategy.md)

Take:

- best source for test-lane taxonomy and perf-governance language
- especially useful once editor testing expands into composition/layout/perf

## Pretext

Best steal:

- accuracy and benchmark checks as first-class scripts

Key file:

- [/Users/zbeyens/git/pretext/package.json](/Users/zbeyens/git/pretext/package.json)

Take:

- useful for measurement/perf verification design
- not a general editor-testing framework model

## VS Code

Best steal:

- layered test entrypoints:
  node, browser, extension, smoke, perf

Key file:

- [/Users/zbeyens/git/vscode/package.json](/Users/zbeyens/git/vscode/package.json)

Take:

- strongest structure for “many lanes, explicit commands, no one-suite delusion”

## ProseMirror

Best steal:

- almost nothing framework-specific here for our testing problem beyond
  disciplined core tests

Key file:

- [/Users/zbeyens/git/prosemirror/package.json](/Users/zbeyens/git/prosemirror/package.json)

Take:

- good engine influence
- weak direct testing-framework influence for this problem

## use-editable and markdown-editor

Best steal:

- no strong testing-framework leverage for this problem

Key files:

- [/Users/zbeyens/git/use-editable/package.json](/Users/zbeyens/git/use-editable/package.json)
- [/Users/zbeyens/git/markdown-editor/package.json](/Users/zbeyens/git/markdown-editor/package.json)

Take:

- useful product/code references
- not testing-framework references

## urql and TanStack DB

Best steal:

- project-split Vitest discipline
- explicit e2e subpackages

Key files:

- [/Users/zbeyens/git/urql/package.json](/Users/zbeyens/git/urql/package.json)
- [/Users/zbeyens/git/db/package.json](/Users/zbeyens/git/db/package.json)

Take:

- useful for repo-wide test-lane organization
- not editor-specific behavior coverage

## Agent-Browser / Dev-Browser / OMX

Best steal:

- agent-native lane for actions Playwright does poorly or too rigidly
- explicit capability-coverage thinking

Key files:

- [/Users/zbeyens/git/agent-browser/AGENTS.md](/Users/zbeyens/git/agent-browser/AGENTS.md)
- [/Users/zbeyens/git/dev-browser/package.json](/Users/zbeyens/git/dev-browser/package.json)
- [/Users/zbeyens/git/oh-my-codex/COVERAGE.md](/Users/zbeyens/git/oh-my-codex/COVERAGE.md)

Take:

- agent-native testing should be designed in as a future extension seam
- but it should not shape the first deterministic framework layers

## Recommended Framework Shape

This is a layered base with a few specialized lanes on top of it.

- Layers are about dependency order.
- Lanes are about specialized risk classes.

## Layer 0: Core Fast Tests

Purpose:

- pure model, transform, selection, and projection semantics

Tools:

- fast package-local runner
- current Slate mix is acceptable short-term
- longer-term, Vitest-style project splits are cleaner than Mocha/Jest drift

Steal from:

- Slate v2 proof packages
- edix Vitest split
- TanStack DB / urql test organization

## Layer 1: DOM Contract Tests

Purpose:

- DOM translation, selection math, placeholder shape, clipboard DOM adaptation
- focused browser-backed contracts for one seam at a time
- no example-app orchestration

Tools:

- fast browser-backed contract tests, not only jsdom
- best future direction: Vitest browser + Playwright provider for small contract
  lanes

Steal from:

- edix `vitest.config.ts`
- rich-textarea `vitest.config.ts`

## Layer 2: Example Integration Tests

Purpose:

- assert real editor behavior on real app/example surfaces
- cross-feature flows and product-shaped regressions
- use when the behavior only makes sense once the full example is mounted

Tools:

- Playwright

Steal from:

- Slate existing Playwright example tests
- VS Code multi-entry lane organization

## Lane A: IME / Composition

Purpose:

- empty-state composition
- placeholder-sensitive composition
- range/selection after commit
- browser-ordering quirks

Tools:

- Chromium Playwright + CDP for first lane
- later WebKit/Safari regression lanes where needed

Steal from:

- Lexical IME e2e tests
- edix IME e2e tests

Strong take:

- this lane must exist
- jsdom composition is not enough

## Lane B: Agent-Native

Purpose:

- cover actions that humans can do but deterministic browser scripts either
  express badly or not at all

Examples:

- weird selection drags
- multi-step context-menu workflows
- visual proofreading of cursor/toolbar state
- copy/paste flows where OS/browser glue matters

Tools:

- `dev-browser`
- `agent-browser`

Rules:

- every agent-native test still needs explicit assertions or artifacts
- screenshots, DOM dumps, selection dumps, and event logs must be captured
- this lane complements deterministic suites; it does not replace them

## Lane C: Performance

Purpose:

- benchmark real editor behaviors without mixing them into correctness suites

Steal from:

- Premirror testing strategy
- Pretext benchmark/accuracy scripts
- VS Code explicit perf command separation

## Agent-Native Review

Using the `agent-native-reviewer` lens, the future framework should require:

1. Every critical user action has at least one deterministic test lane.
2. Every action Playwright cannot faithfully express has an agent-native lane.
3. Agent-native runs operate in the same workspace and examples as human tests.
4. Capabilities are explicit, not tribal knowledge.

Current gap:

- Slate has Playwright example tests, but no first-class documented
  agent-native lane for editor actions

That is a real framework gap.

## Recommended Stack

Do **not** chase a single universal runner.

Best stack is:

- fast local/unit layer:
  current package runners, converging toward Vitest-style project splits
- browser contract layer:
  Vitest browser + Playwright provider
- integration/e2e layer:
  Playwright
- IME layer:
  Playwright + Chromium CDP composition helpers
- perf layer:
  explicit benchmark scripts
- agent-native layer:
  `dev-browser` / `agent-browser`

## Adoption Order

1. Keep the current public package/API tranche stable.
2. Strengthen `openExample(...)` into a real readiness contract.
3. Build the renderer/input-policy gauntlet for zero-width and IME-sensitive
   empty-state behavior.
4. Add `test:slate-browser:cross` only after that contract is stable.
5. Add `test:slate-browser:perf` and maybe `test:slate-browser:accuracy`
   after correctness lanes stop moving.
6. Keep the agent-native lane as a later extension seam, not the next core
   tranche.

## Bottom Line

The best future testing framework is:

- **Lexical’s IME realism**
- **Slate’s example-driven Playwright harness**
- **edix and rich-textarea’s browser-contract speed**
- **Premirror’s determinism/perf discipline**
- **VS Code’s layered lane organization**
- **agent-browser/dev-browser for agent-native parity**

Not:

- one runner
- one suite
- one fake jsdom composition test pretending it solved IME

---

### Slate V2 Draft Overview (`docs/slate-v2-draft/overview.md`)

---
date: 2026-04-08
topic: slate-v2-overview
---

# Slate v2 Overview

## Purpose

Front door to the live `docs/slate-v2` stack.

## Current Read

- live verdict now treats `Target A` as `Go` on the proved default stack
- the broader `Target B` claim is still reopened under the exhaustive
  API/public-surface audit challenge
- the curated perf gate package currently clears on blocker-facing lanes in
  [replacement-gates-scoreboard.md](/Users/zbeyens/git/plate-2/docs/slate-v2/replacement-gates-scoreboard.md)
- completed roadmap groundwork is now called `POC RC`
- the core `packages/slate/test/**` deleted-family bucket is closed
- the full `packages/slate-react/**` deleted-family bucket is closed
- the full `packages/slate-history/**` package bucket is closed
- major file/test deletion review is now explicitly closed
- extension model / behavior interception is now explicitly closed
- schema / normalization extensibility is now explicitly closed
- non-React / headless core usability is now explicitly closed
- operation-history-collaboration integrity is now explicitly closed
- the decoration source-scoped invalidation tranche is now the banked overlay
  authority, not the next broad blocker lane
- the earlier package-matrix public-surface pass is banked, but exhaustive
  API/public-surface contract-width audit remains reopened under challenge
- maximum parity with legacy for all examples is now reopened as a sibling
  blocker lane
- direct 1:1 legacy fixture proof now exists for `Editor.nodes/**` and the
  non-Editor `interfaces/**` namespaces
- the direct transform audit at
  `/Users/zbeyens/git/slate-v2/packages/slate/test/legacy-transforms-fixtures.ts`
  is green again, so the transform lane is no longer a blanket reopened family
- the remaining transform debt is narrower:
  - `explicit-skip` rows
- the overlay architecture lock is complete, and its next perfection tranche is
  active:
  - decoration sources own inline projected decoration
  - `Bookmark` owns durable public anchors
  - annotation stores own anchored data
  - widget stores own widget UI
- the broader program is still called `True Slate RC`
- the current execution owners are now:
  - [2026-04-13-slate-v2-full-no-regression-story-plan.md](/Users/zbeyens/git/plate-2/docs/plans/2026-04-13-slate-v2-full-no-regression-story-plan.md)
  - [2026-04-15-slate-v2-example-parity-recovery-plan.md](/Users/zbeyens/git/plate-2/docs/plans/2026-04-15-slate-v2-example-parity-recovery-plan.md)
  - [decoration-roadmap.md](/Users/zbeyens/git/plate-2/docs/slate-v2/decoration-roadmap.md)
- browser/input external-evidence work is now post-RC follow-up, not the active
  current blocker lane
- local Firefox and Android structural/browser rows are exhausted; the current
  broader blocker lanes are exhaustive API/public-surface audit plus example
  parity, and external Android keyboard-feature evidence plus broader iOS
  evidence remain post-RC follow-up
- the zero-regression diff seed in
  [true-slate-rc-proof-ledger.md](/Users/zbeyens/git/plate-2/docs/slate-v2/true-slate-rc-proof-ledger.md)
  is `EMPTY`, so there are no hidden unreviewed browser/input files left in the
  current scoped diff

## Ownership

| Class              | Start here                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| verdict            | [release-readiness-decision.md](/Users/zbeyens/git/plate-2/docs/slate-v2/release-readiness-decision.md) (primary); supporting live surfaces: [replacement-family-ledger.md](/Users/zbeyens/git/plate-2/docs/slate-v2/replacement-family-ledger.md), [replacement-gates-scoreboard.md](/Users/zbeyens/git/plate-2/docs/slate-v2/replacement-gates-scoreboard.md) |
| sequence           | [master-roadmap.md](/Users/zbeyens/git/plate-2/docs/slate-v2/master-roadmap.md)                                                                                                                                                                                                                                                                                                                                                                                           |
| evidence           | [true-slate-rc-proof-ledger.md](/Users/zbeyens/git/plate-2/docs/slate-v2/true-slate-rc-proof-ledger.md), [release-file-review-ledger.md](/Users/zbeyens/git/plate-2/docs/slate-v2/release-file-review-ledger.md), [docs/slate-browser/proof-lane-matrix.md](/Users/zbeyens/git/plate-2/docs/slate-browser/proof-lane-matrix.md)                                                                                                                                                     |
| perf gate          | [replacement-gates-scoreboard.md](/Users/zbeyens/git/plate-2/docs/slate-v2/replacement-gates-scoreboard.md)                                                                                                                                                                                                                                                                                                                                                                  |
| protocol           | [deletion-closure-protocol.md](/Users/zbeyens/git/plate-2/docs/slate-v2/references/deletion-closure-protocol.md)                                                                                                                                                                                                                                                                                                                                                                     |
| reference          | [architecture-contract.md](/Users/zbeyens/git/plate-2/docs/slate-v2/references/architecture-contract.md), [live-shape-register.md](/Users/zbeyens/git/plate-2/docs/slate-v2/references/live-shape-register.md), [normalization-reference.md](/Users/zbeyens/git/plate-2/docs/slate-v2/references/normalization-reference.md)                                                                                                                                                                                                                                     |
| maintainer context | [pr-description.md](/Users/zbeyens/git/plate-2/docs/slate-v2/references/pr-description.md)                                                                                                                                                                                                                                                                                                                                  |

## Vocabulary

| Historical term | Current meaning                                                                       |
| --------------- | ------------------------------------------------------------------------------------- |
| `Target A`      | the live default-stack verdict that corresponds to completed `POC RC` work            |
| `Target B`      | the older broad-replacement label that now maps to the broader `True Slate RC` destination |

## Read In This Order

1. [release-readiness-decision.md](/Users/zbeyens/git/plate-2/docs/slate-v2/release-readiness-decision.md)
2. [replacement-gates-scoreboard.md](/Users/zbeyens/git/plate-2/docs/slate-v2/replacement-gates-scoreboard.md)
3. [replacement-family-ledger.md](/Users/zbeyens/git/plate-2/docs/slate-v2/replacement-family-ledger.md)
4. [master-roadmap.md](/Users/zbeyens/git/plate-2/docs/slate-v2/master-roadmap.md)
5. [release-file-review-ledger.md](/Users/zbeyens/git/plate-2/docs/slate-v2/release-file-review-ledger.md)
6. [true-slate-rc-proof-ledger.md](/Users/zbeyens/git/plate-2/docs/slate-v2/true-slate-rc-proof-ledger.md)
7. [decoration-roadmap.md](/Users/zbeyens/git/plate-2/docs/slate-v2/decoration-roadmap.md)
8. [2026-04-13-slate-v2-full-no-regression-story-plan.md](/Users/zbeyens/git/plate-2/docs/plans/2026-04-13-slate-v2-full-no-regression-story-plan.md)
9. [pr-description.md](/Users/zbeyens/git/plate-2/docs/slate-v2/references/pr-description.md)

## Command Entry

- [commands/reconsolidate-roadmap.md](/Users/zbeyens/git/plate-2/docs/slate-v2/commands/reconsolidate-roadmap.md)
  is the command-pack entrypoint

## Reference / Historical Specs

- [architecture-contract.md](/Users/zbeyens/git/plate-2/docs/slate-v2/references/architecture-contract.md)
- [live-shape-register.md](/Users/zbeyens/git/plate-2/docs/slate-v2/references/live-shape-register.md)
- [normalization-reference.md](/Users/zbeyens/git/plate-2/docs/slate-v2/references/normalization-reference.md)
- [slate-batch-engine.md](/Users/zbeyens/git/plate-2/docs/slate-v2/references/slate-batch-engine.md)
- [chunking-review.md](/Users/zbeyens/git/plate-2/docs/slate-v2/references/chunking-review.md)

These do not own queue or verdict truth.

Current read:

- `slate-batch-engine.md` is legacy retrofit context, not active remaining-work
  ownership
- `chunking-review.md` is historical design analysis; the live runtime posture
  is selector-first rendering plus semantic islands, not child-count chunking

---

### Slate V2 Overview (`docs/slate-v2/overview.md`)

---
date: 2026-04-18
topic: slate-v2-overview
status: active
---

# Slate v2 Overview

## Purpose

Front door to the live `slate-v2` migration program.

This stack now describes the final-state program for the fresh `.tmp/slate-v2`
clone. It is not the old rewrite archive.

## Current Read

- `.tmp/slate-v2` is the live target
- `.tmp/slate-v2-draft` is the evidence/value bank
- `docs/slate-v2/**` is the final-state spec lane
- `docs/slate-v2-draft/**` is the archived prior doc lane
- tranche 1 is complete:
  - Bun root/tooling graph
  - Bun test ownership
  - package-manifest build owners
  - docs ownership reset
- tranche 2 is complete:
  - React 19.2.5 baseline
  - Next 16.2.4 for the site/runtime lane
  - TypeScript 6.0.3 baseline
  - package-src HMR without package rebuilds
  - low-risk compatibility fallout only
- tranche 3 is the live redesign lane:
  - `packages/slate` is being redesigned toward the native transaction engine
    and snapshot/store-first API described in
    [architecture-contract.md](/Users/zbeyens/git/plate-2/docs/slate-v2/references/architecture-contract.md)
  - support-package work stays blocked until the `slate` core API is honestly
    settled
  - backward compatibility is no longer the default value; compatibility keeps
    only what still earns its weight
  - hard cuts are allowed when retrofit baggage blocks the better API
  - current `packages/slate` proof and perf floors stay active guardrails while
    the redesign lands
- merged corpus docs now exist for:
  - `slate`
  - `slate-history`
  - `slate-hyperscript`
  - `slate-dom`
  - `slate-react`
- the live stack again has explicit north-star docs for:
  - absolute architecture release claim
  - post-closure proof hardening plan
  - architecture contract
  - overlay roadmap
  - decorations/annotations rationale
  - chunking rejection and huge-doc posture

## Read Order

1. [absolute-architecture-release-claim.md](/Users/zbeyens/git/plate-2/docs/slate-v2/absolute-architecture-release-claim.md)
2. [docs/plans/2026-04-25-slate-v2-editing-epoch-kernel-regression-closure-plan.md](/Users/zbeyens/git/plate-2/docs/plans/2026-04-25-slate-v2-editing-epoch-kernel-regression-closure-plan.md)
3. [docs/plans/2026-04-24-slate-v2-post-closure-proof-hardening-plan.md](/Users/zbeyens/git/plate-2/docs/plans/2026-04-24-slate-v2-post-closure-proof-hardening-plan.md)
4. [docs/plans/2026-04-24-slate-v2-absolute-architecture-closure-plan.md](/Users/zbeyens/git/plate-2/docs/plans/2026-04-24-slate-v2-absolute-architecture-closure-plan.md)
5. [references/architecture-contract.md](/Users/zbeyens/git/plate-2/docs/slate-v2/references/architecture-contract.md)
6. [master-roadmap.md](/Users/zbeyens/git/plate-2/docs/slate-v2/master-roadmap.md)
7. [release-readiness-decision.md](/Users/zbeyens/git/plate-2/docs/slate-v2/release-readiness-decision.md)
8. [replacement-gates-scoreboard.md](/Users/zbeyens/git/plate-2/docs/slate-v2/replacement-gates-scoreboard.md)
9. [true-slate-rc-proof-ledger.md](/Users/zbeyens/git/plate-2/docs/slate-v2/true-slate-rc-proof-ledger.md)
10. [fresh-branch-migration-plan.md](/Users/zbeyens/git/plate-2/docs/slate-v2/fresh-branch-migration-plan.md)
11. [release-file-review-ledger.md](/Users/zbeyens/git/plate-2/docs/slate-v2/release-file-review-ledger.md)
12. historical context only:
    [2026-04-18-001-refactor-slate-v2-parity-first-migration-plan.md](/Users/zbeyens/git/plate-2/docs/plans/2026-04-18-001-refactor-slate-v2-parity-first-migration-plan.md)
13. [decoration-roadmap.md](/Users/zbeyens/git/plate-2/docs/slate-v2/decoration-roadmap.md)
14. [decorations-annotations-cluster.md](/Users/zbeyens/git/plate-2/docs/slate-v2/decorations-annotations-cluster.md)
15. [references/chunking-review.md](/Users/zbeyens/git/plate-2/docs/slate-v2/references/chunking-review.md)
16. [final-api-hard-cuts-status.md](/Users/zbeyens/git/plate-2/docs/slate-v2/final-api-hard-cuts-status.md)
17. [pr-description.md](/Users/zbeyens/git/plate-2/docs/slate-v2/references/pr-description.md)
18. [ledgers/README.md](/Users/zbeyens/git/plate-2/docs/slate-v2/ledgers/README.md)

## Ownership

| Class                  | Owner                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| architecture claim     | [absolute-architecture-release-claim.md](/Users/zbeyens/git/plate-2/docs/slate-v2/absolute-architecture-release-claim.md)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| execution plan         | [2026-04-25-slate-v2-editing-epoch-kernel-regression-closure-plan.md](/Users/zbeyens/git/plate-2/docs/plans/2026-04-25-slate-v2-editing-epoch-kernel-regression-closure-plan.md), [2026-04-24-slate-v2-post-closure-proof-hardening-plan.md](/Users/zbeyens/git/plate-2/docs/plans/2026-04-24-slate-v2-post-closure-proof-hardening-plan.md), [2026-04-24-slate-v2-absolute-architecture-closure-plan.md](/Users/zbeyens/git/plate-2/docs/plans/2026-04-24-slate-v2-absolute-architecture-closure-plan.md), and [fresh-branch-migration-plan.md](/Users/zbeyens/git/plate-2/docs/slate-v2/fresh-branch-migration-plan.md) |
| tranche order          | [master-roadmap.md](/Users/zbeyens/git/plate-2/docs/slate-v2/master-roadmap.md)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| review state           | [release-file-review-ledger.md](/Users/zbeyens/git/plate-2/docs/slate-v2/release-file-review-ledger.md)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| readiness claim        | [release-readiness-decision.md](/Users/zbeyens/git/plate-2/docs/slate-v2/release-readiness-decision.md)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| gate status            | [replacement-gates-scoreboard.md](/Users/zbeyens/git/plate-2/docs/slate-v2/replacement-gates-scoreboard.md)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| proof status           | [true-slate-rc-proof-ledger.md](/Users/zbeyens/git/plate-2/docs/slate-v2/true-slate-rc-proof-ledger.md)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| maintainer drift story | [pr-description.md](/Users/zbeyens/git/plate-2/docs/slate-v2/references/pr-description.md)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |

## Archive Rule

If a doc belongs to the old rewrite program and is not live migration truth, it
belongs in `docs/slate-v2-draft/**`.

---

### Editor Test Harvester Lexical Test Index (`docs/editor-test-harvester/lexical/test-index.md`)

# Lexical Portable Test-Name Index

source report: [report.md](./report.md)
target: `../lexical`
generated_at: 2026-05-08
last_consolidated_at: 2026-05-09
consolidation: portable runnable file count still 137; extracted line count still 1996; no missing or stale index files.

Indexed runnable portable and portable-mixed files: 137.
Extracted test/describe/it lines: 1996.
Files with zero extracted names: 0.

The extractor records literal, dynamic, and multiline titles by line pointer. Dynamic rows still need local reading before an apply pass, but they are no longer hidden behind a file-name-only route.

## `../lexical/packages/lexical-code-shiki/src/__tests__/unit/LexicalCodeNodeTabs.test.ts`

category: portable
family: core package behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-code-shiki/src/__tests__/unit/LexicalCodeNodeTabs.test.ts:47` describe: LexicalCodeNode tests
- `../lexical/packages/lexical-code-shiki/src/__tests__/unit/LexicalCodeNodeTabs.test.ts:49` describe: Tabs
- `../lexical/packages/lexical-code-shiki/src/__tests__/unit/LexicalCodeNodeTabs.test.ts:96` test: testing ${scenario[2]}: ${scenario[0]} => ${scenario[1]} (${direction})

## `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNode.test.ts`

category: portable
family: core package behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNode.test.ts:60` describe: LexicalCodeNode tests
- `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNode.test.ts:62` test: CodeNode.constructor
- `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNode.test.ts:73` test: CodeNode.createDOM()
- `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNode.test.ts:90` test: CodeNode.updateDOM()
- `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNode.test.ts:111` test: CodeNode.exportJSON() should return and object conforming to the expected schema
- `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNode.test.ts:133` test: CodeNode.insertNewAfter()
- `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNode.test.ts:167` test: $createCodeNode()
- `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNode.test.ts:179` test: can tab with collapsed selection
- `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNode.test.ts:215` test: can tab with non-collapsed selection
- `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNode.test.ts:239` test: can indent/outdent one line by forward selecting all line (with tabs)
- `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNode.test.ts:279` test: can indent/outdent one line by backward selecting all line (with tabs)
- `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNode.test.ts:319` test: can indent/outdent with collapsed selection at start of line (with tabs)
- `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNode.test.ts:357` test: can indent/outdent multiline (with tabs)
- `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNode.test.ts:391` test: can indent at the start of the second line
- `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNode.test.ts:409` test: can indent when selection has a CodeNode element (with indent)
- `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNode.test.ts:435` test: can outdent at arbitrary points in the line (with tabs)
- `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNode.test.ts:459` test: code blocks can shift lines (with tab)
- `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNode.test.ts:479` test: code blocks can shift multiple lines (with tab)
- `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNode.test.ts:513` describe: arrows
- `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNode.test.ts:514` describe: rtl code lines
- `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNode.test.ts:537` test: MOVE_TO_END moves caret to visual right
- `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNode.test.ts:559` test: MOVE_TO_START moves caret to visual left
- `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNode.test.ts:1006` describe: initial editor state before transforms
- `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNode.test.ts:1007` test: can be registered after initial editor state (regression #7014)

## `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNodeTabs.test.ts`

category: portable
family: core package behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNodeTabs.test.ts:34` describe: LexicalCodeNode tests
- `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNodeTabs.test.ts:36` describe: Tabs
- `../lexical/packages/lexical-code/src/__tests__/unit/LexicalCodeNodeTabs.test.ts:83` test: testing ${scenario[2]}: ${scenario[0]} => ${scenario[1]} (${direction})

## `../lexical/packages/lexical-history/src/__tests__/unit/LexicalHistory.test.tsx`

category: portable
family: core package behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-history/src/__tests__/unit/LexicalHistory.test.tsx:205` describe: LexicalHistory tests
- `../lexical/packages/lexical-history/src/__tests__/unit/LexicalHistory.test.tsx:248` test: LexicalHistory after clearing
- `../lexical/packages/lexical-history/src/__tests__/unit/LexicalHistory.test.tsx:284` test: LexicalHistory.Redo after Quote Node
- `../lexical/packages/lexical-history/src/__tests__/unit/LexicalHistory.test.tsx:352` test: LexicalHistory in sequence: change, undo, redo, undo, change
- `../lexical/packages/lexical-history/src/__tests__/unit/LexicalHistory.test.tsx:437` test: undoStack selection points to the same editor
- `../lexical/packages/lexical-history/src/__tests__/unit/LexicalHistory.test.tsx:481` test: Changes to TextNode leaf are detected properly #6409
- `../lexical/packages/lexical-history/src/__tests__/unit/LexicalHistory.test.tsx:541` describe: SharedHistoryExtension
- `../lexical/packages/lexical-history/src/__tests__/unit/LexicalHistory.test.tsx:542` test: can create a parent editor

## `../lexical/packages/lexical-html/src/__tests__/unit/LexicalHtml.test.ts`

category: portable
family: core package behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-html/src/__tests__/unit/LexicalHtml.test.ts:25` describe: HTML
- `../lexical/packages/lexical-html/src/__tests__/unit/LexicalHtml.test.ts:42` test: [Lexical -> HTML]: ${name}
- `../lexical/packages/lexical-html/src/__tests__/unit/LexicalHtml.test.ts:64` test: [Lexical -> HTML]: Use provided selection
- `../lexical/packages/lexical-html/src/__tests__/unit/LexicalHtml.test.ts:111` test: [Lexical -> HTML]: Default selection (undefined) should serialize entire editor state
- `../lexical/packages/lexical-html/src/__tests__/unit/LexicalHtml.test.ts:156` test: dynamic or multiline title
- `../lexical/packages/lexical-html/src/__tests__/unit/LexicalHtml.test.ts:186` test: If alignment is set on the paragraph, it should take precedence over its parent block alignment
- `../lexical/packages/lexical-html/src/__tests__/unit/LexicalHtml.test.ts:216` test: It should output correctly nodes whose export is DocumentFragment

## `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts`

category: portable
family: serialization-parsing / marks-inline
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-history/test; .tmp/slate-v2/playwright/integration/examples/richtext.test.ts

- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:44` describe: LexicalListItemNode tests
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:46` test: ListItemNode.constructor
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:60` test: ListItemNode.createDOM()
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:85` describe: ListItemNode.updateDOM()
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:86` test: base
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:119` test: nested list
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:158` describe: ListItemNode.replace()
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:206` test: another list item node
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:239` test: first list item with a non list item node
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:294` test: last list item with a non list item node
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:323` test: middle list item with a non list item node
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:354` test: the only list item with a non list item node
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:397` describe: ListItemNode.remove()
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:401` test: siblings are not nested
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:469` test: the previous sibling is nested
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:549` test: the next sibling is nested
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:629` test: both siblings are nested
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:718` test: the previous sibling is nested deeper than the next sibling
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:828` test: the next sibling is nested deeper than the previous sibling
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:939` test: both siblings are deeply nested
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:1063` describe: ListItemNode.insertNewAfter(): non-empty list items
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:1111` test: first list item
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:1142` test: last list item
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:1173` test: middle list item
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:1204` test: the only list item
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:1251` test: $createListItemNode()
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:1265` test: $isListItemNode()
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:1275` describe: ListItemNode.setIndent()
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:1296` it: indents and outdents list item
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:1356` it: handles fractional indent values
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:1369` test: Can serialize a node that is not attached
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:1388` test: ListItemNode marker style inheritance on indent
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:1415` test: Default: Splitting a list resets numbering to 1 (Backward Compatibility)
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListItemNode.test.ts:1455` test: Option Enabled: Splitting a list preserves numbering (Smart Behavior)

## `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListNode.test.ts`

category: portable
family: serialization-parsing / marks-inline
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-history/test; .tmp/slate-v2/playwright/integration/examples/richtext.test.ts

- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListNode.test.ts:54` describe: LexicalListNode tests
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListNode.test.ts:56` test: ListNode.constructor
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListNode.test.ts:70` test: ListNode.getTag()
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListNode.test.ts:83` test: ListNode.createDOM()
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListNode.test.ts:108` test: ListNode.createDOM() correctly applies classes to a nested ListNode
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListNode.test.ts:189` test: ListNode.updateDOM()
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListNode.test.ts:214` test: ListNode.append() should properly transform a ListItemNode
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListNode.test.ts:231` test: ListNode.append() should properly transform a ListNode
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListNode.test.ts:253` test: ListNode.append() should properly transform a ParagraphNode
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListNode.test.ts:269` test: ListNode.append() should wrap an InlineNode in a ListItemNode without converting it to TextNode
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListNode.test.ts:308` test: ListNode.splice() should wrap multiple non-ListItem nodes in individual ListItem nodes
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListNode.test.ts:341` test: Should update list children when switching from checklist to bullet
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListNode.test.ts:367` test: Should clear checklist attributes when nesting lists
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListNode.test.ts:425` test: $createListNode()
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListNode.test.ts:439` test: $isListNode()
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListNode.test.ts:449` test: $createListNode() with tag name (backward compatibility)
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListNode.test.ts:462` describe: LexicalListNode subclassing tests ($config)
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListNode.test.ts:494` describe: ListNode as-is
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListNode.test.ts:497` test: applies transform
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListNode.test.ts:513` describe: ListNodeConfig (no replacement)
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListNode.test.ts:516` test: applies transform
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListNode.test.ts:532` describe: ListNodeSubclass (no replacement)
- `../lexical/packages/lexical-list/src/__tests__/unit/LexicalListNode.test.ts:535` test: applies transform

## `../lexical/packages/lexical-list/src/__tests__/unit/ListExtension.test.ts`

category: portable
family: serialization-parsing / marks-inline
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-history/test; .tmp/slate-v2/playwright/integration/examples/richtext.test.ts

- `../lexical/packages/lexical-list/src/__tests__/unit/ListExtension.test.ts:23` describe: ListExtension
- `../lexical/packages/lexical-list/src/__tests__/unit/ListExtension.test.ts:36` it: Creates the list
- `../lexical/packages/lexical-list/src/__tests__/unit/ListExtension.test.ts:47` describe: CheckListExtension
- `../lexical/packages/lexical-list/src/__tests__/unit/ListExtension.test.ts:61` it: Preserves numbering when configured via extension
- `../lexical/packages/lexical-list/src/__tests__/unit/ListExtension.test.ts:118` it: Creates the list

## `../lexical/packages/lexical-list/src/__tests__/unit/formatList.test.ts`

category: portable
family: serialization-parsing / marks-inline
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-history/test; .tmp/slate-v2/playwright/integration/examples/richtext.test.ts

- `../lexical/packages/lexical-list/src/__tests__/unit/formatList.test.ts:82` describe: insertList
- `../lexical/packages/lexical-list/src/__tests__/unit/formatList.test.ts:84` test: inserting with empty root selection
- `../lexical/packages/lexical-list/src/__tests__/unit/formatList.test.ts:106` test: inserting in root selection with existing child
- `../lexical/packages/lexical-list/src/__tests__/unit/formatList.test.ts:131` test: inserting with empty shadow root selection
- `../lexical/packages/lexical-list/src/__tests__/unit/formatList.test.ts:160` test: formatting empty list items
- `../lexical/packages/lexical-list/src/__tests__/unit/formatList.test.ts:187` test: preserves element-anchored selection when converting paragraph with linebreak to list
- `../lexical/packages/lexical-list/src/__tests__/unit/formatList.test.ts:233` describe: $handleListInsertParagraph
- `../lexical/packages/lexical-list/src/__tests__/unit/formatList.test.ts:235` test: exits list when list item is completely empty
- `../lexical/packages/lexical-list/src/__tests__/unit/formatList.test.ts:262` test: exits list when list item contains only whitespace
- `../lexical/packages/lexical-list/src/__tests__/unit/formatList.test.ts:291` test: extends list when list item contains non-whitespace content
- `../lexical/packages/lexical-list/src/__tests__/unit/formatList.test.ts:317` test: extends list when list item contains a decorator node
- `../lexical/packages/lexical-list/src/__tests__/unit/formatList.test.ts:343` test: splits list when the empty element is not the last one
- `../lexical/packages/lexical-list/src/__tests__/unit/formatList.test.ts:386` describe: $handleIndent
- `../lexical/packages/lexical-list/src/__tests__/unit/formatList.test.ts:389` test: creates a new nested sublist
- `../lexical/packages/lexical-list/src/__tests__/unit/formatList.test.ts:422` describe: $handleOutdent
- `../lexical/packages/lexical-list/src/__tests__/unit/formatList.test.ts:424` test: removes the nested list and replaces list item

## `../lexical/packages/lexical-list/src/__tests__/unit/registerListStrictIndentTransform.test.ts`

category: portable
family: serialization-parsing / marks-inline
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-history/test; .tmp/slate-v2/playwright/integration/examples/richtext.test.ts

- `../lexical/packages/lexical-list/src/__tests__/unit/registerListStrictIndentTransform.test.ts:19` describe: Lexical List StrictIndentTransform tests
- `../lexical/packages/lexical-list/src/__tests__/unit/registerListStrictIndentTransform.test.ts:26` test: applyStrictListIndentation

## `../lexical/packages/lexical-list/src/__tests__/unit/utils.test.ts`

category: portable
family: core package behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-list/src/__tests__/unit/utils.test.ts:15` describe: Lexical List Utils tests
- `../lexical/packages/lexical-list/src/__tests__/unit/utils.test.ts:17` test: getListDepth should return the 1-based depth of a list with one levels
- `../lexical/packages/lexical-list/src/__tests__/unit/utils.test.ts:35` test: getListDepth should return the 1-based depth of a list with two levels
- `../lexical/packages/lexical-list/src/__tests__/unit/utils.test.ts:68` test: getListDepth should return the 1-based depth of a list with five levels
- `../lexical/packages/lexical-list/src/__tests__/unit/utils.test.ts:113` test: getTopListNode should return the top list node when the list is a direct child of the RootNode
- `../lexical/packages/lexical-list/src/__tests__/unit/utils.test.ts:144` test: getTopListNode should return the top list node when the list is not a direct child of the RootNode
- `../lexical/packages/lexical-list/src/__tests__/unit/utils.test.ts:176` test: getTopListNode should return the top list node when the list item is deeply nested.
- `../lexical/packages/lexical-list/src/__tests__/unit/utils.test.ts:214` test: isLastItemInList should return true if the listItem is the last in a nested list.
- `../lexical/packages/lexical-list/src/__tests__/unit/utils.test.ts:249` test: isLastItemInList should return true if the listItem is the last in a non-nested list.
- `../lexical/packages/lexical-list/src/__tests__/unit/utils.test.ts:275` test: isLastItemInList should return false if the listItem is not the last in a nested list.
- `../lexical/packages/lexical-list/src/__tests__/unit/utils.test.ts:310` test: isLastItemInList should return true if the listItem is not the last in a non-nested list.

## `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts`

category: portable
family: serialization-parsing / marks-inline
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-history/test; .tmp/slate-v2/playwright/integration/examples/richtext.test.ts

- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:257` describe: Markdown
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:818` it: dynamic or multiline title
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:866` it: dynamic or multiline title
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:916` it: dynamic or multiline title
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:950` it: should not remove leading node and transform if replace returns false
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:997` it: should remove leading node and execute transform if replace does not return false
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1044` it: can round-trip nested fenced code blocks (4 backticks wrapping 3 backticks)
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1080` it: can round-trip deeply nested fenced code blocks (5 backticks wrapping 4 backticks)
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1117` it: computes fence dynamically when code block content contains backticks
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1145` describe: list marker
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1146` it: should remember marker used on import
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1168` it: should not use [ as a marker for an implicit check list
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1192` it: should remember the marker for checkbox with an explicit marker
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1217` it: should remember marker used on export
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1245` describe: Enter key triggers
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1246` it: dynamic or multiline title
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1286` it: dynamic or multiline title
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1326` it: should not transform on Enter when replace returns false
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1381` describe: normalizeMarkdown - shouldMergeAdjacentLines = true
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1382` it: should combine lines separated by a single \n unless they are in a codeblock
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1446` it: tables
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1455` it: merges adjacent plain text lines with a single space
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1461` it: merges while trimming the next line and inserting a single space
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1467` it: does not merge across HTML-like tags (opening, content, closing, after)
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1476` it: does not merge the fence line with the first line after a code block
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1482` it: trims hard-break trailing spaces when merging adjacent lines
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1488` it: treats whitespace-only lines as empty separators (no merge across them)
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1498` it: mdx start tag followed by content, than closing tag preceded by content
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1507` describe: normalizeMarkdown - shouldMergeAdjacentLines = false
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1508` it: should not combine lines separated by a single \n
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1575` it: tables
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1584` it: preserves trailing whitespace on content lines
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1589` it: collapses whitespace-only lines to empty (paragraph separator)
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1594` it: preserves leading whitespace on content lines
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1600` describe: markdown hard line break import
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1601` it: preserves hard line break when shouldPreserveNewLines is true
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1641` it: preserves backslash hard line break when shouldPreserveNewLines is true
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1682` describe: markdown whitespace import (default mode)
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1696` it: preserves trailing whitespace on a standalone paragraph line (default mode)
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1722` it: preserves leading whitespace on a standalone paragraph line (default mode)
- `../lexical/packages/lexical-markdown/src/__tests__/unit/LexicalMarkdown.test.ts:1747` it: handles two-space hard line break in default mode (adjacent lines merged into LineBreak)

## `../lexical/packages/lexical-markdown/src/__tests__/unit/MarkdownTransformers.test.ts`

category: portable
family: serialization-parsing / marks-inline
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-history/test; .tmp/slate-v2/playwright/integration/examples/richtext.test.ts

- `../lexical/packages/lexical-markdown/src/__tests__/unit/MarkdownTransformers.test.ts:52` describe: LINK
- `../lexical/packages/lexical-markdown/src/__tests__/unit/MarkdownTransformers.test.ts:53` test: text before a markdown link is preserved
- `../lexical/packages/lexical-markdown/src/__tests__/unit/MarkdownTransformers.test.ts:68` test: formatted text before a markdown link is preserved
- `../lexical/packages/lexical-markdown/src/__tests__/unit/MarkdownTransformers.test.ts:90` test: LINK is not too greedy if there is a preceding match that was not processed
- `../lexical/packages/lexical-markdown/src/__tests__/unit/MarkdownTransformers.test.ts:123` test: markdown link should not be created inside another link.

## `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs`

category: portable-mixed
family: selection-dom-mapping / void-atom
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-react/test/editable-behavior.test.tsx; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:29` describe: Auto Links
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:32` test: Can convert url-like text into links
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:33` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:63` test: Can convert url-like text into links for email
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:67` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:92` test: Can destruct links if add non-spacing text in front or right after it
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:96` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:156` test: Can create link when pasting text with urls
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:160` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:191` test: Can create link for email when pasting text with urls
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:195` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:225` test: Does not create redundant auto-link
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:226` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:263` test: Can create links when pasting text with multiple autolinks in a row separated by non-alphanumeric characters, but not whitespaces
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:267` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:300` test: Handles multiple autolinks in a row
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:301` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:337` test: Handles autolink following an invalid autolink
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:341` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:360` test: Handles autolink following an invalid autolink to email
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:364` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:391` test: Can convert url-like text with formatting into links
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:395` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:440` test: Can convert url-like text with styles into links
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:444` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:491` test: Can convert URL into an autolink
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:542` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:543` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:567` test: Can convert URL into an email autolink
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:583` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:584` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:607` test: Can not convert bad URLs into links
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:639` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:655` test: Can not convert bad URLs into email links
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:678` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:694` test: Can unlink the autolink and then make it link again
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:698` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:755` test: Unlinked autolink is preserved when adding punctuation before or after it
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:759` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:842` test: Adding an invalid character will destruct an unlinked autolink
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:846` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:896` test: Adding an emoji inside an unlinked autolink will destruct it
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:900` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:955` test: Pressing Enter inside an AutoLinkNode does not insert extra paragraph
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoLinks.spec.mjs:959` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/AutoScroll.spec.mjs`

category: portable
family: beforeinput-input / browser-engine
target: .tmp/slate-v2/packages/slate-react/test/model-input-strategy-contract.test.ts; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/AutoScroll.spec.mjs:17` test: Auto scroll while typing
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoScroll.spec.mjs:66` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/AutoScroll.spec.mjs:69` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/Autocomplete.spec.mjs`

category: portable-mixed
family: mixed portable invariant
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/e2e/Autocomplete.spec.mjs:27` test: Autocomplete
- `../lexical/packages/lexical-playground/__tests__/e2e/Autocomplete.spec.mjs:31` test: Can autocomplete a word
- `../lexical/packages/lexical-playground/__tests__/e2e/Autocomplete.spec.mjs:79` test: Can autocomplete in the same format as the original text
- `../lexical/packages/lexical-playground/__tests__/e2e/Autocomplete.spec.mjs:83` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Autocomplete.spec.mjs:161` test: Undo does not cause an exception
- `../lexical/packages/lexical-playground/__tests__/e2e/Autocomplete.spec.mjs:166` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Autocomplete.spec.mjs:168` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/CharacterLimit.spec.mjs`

category: portable-mixed
family: mixed portable invariant
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/e2e/CharacterLimit.spec.mjs:24` test: displays overflow on text
- `../lexical/packages/lexical-playground/__tests__/e2e/CharacterLimit.spec.mjs:25` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CharacterLimit.spec.mjs:82` test: handles auto link nodes
- `../lexical/packages/lexical-playground/__tests__/e2e/CharacterLimit.spec.mjs:83` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CharacterLimit.spec.mjs:124` test: displays overflow on token nodes
- `../lexical/packages/lexical-playground/__tests__/e2e/CharacterLimit.spec.mjs:130` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CharacterLimit.spec.mjs:160` test: can type new lines inside overflow
- `../lexical/packages/lexical-playground/__tests__/e2e/CharacterLimit.spec.mjs:165` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CharacterLimit.spec.mjs:215` test: can delete text in front and overflow is recomputed
- `../lexical/packages/lexical-playground/__tests__/e2e/CharacterLimit.spec.mjs:220` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CharacterLimit.spec.mjs:287` test: can delete text in front and overflow is recomputed (token nodes)
- `../lexical/packages/lexical-playground/__tests__/e2e/CharacterLimit.spec.mjs:291` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CharacterLimit.spec.mjs:332` test: can overflow in lists
- `../lexical/packages/lexical-playground/__tests__/e2e/CharacterLimit.spec.mjs:333` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CharacterLimit.spec.mjs:353` test: can delete an overflowed paragraph
- `../lexical/packages/lexical-playground/__tests__/e2e/CharacterLimit.spec.mjs:358` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CharacterLimit.spec.mjs:393` test: handles accented characters
- `../lexical/packages/lexical-playground/__tests__/e2e/CharacterLimit.spec.mjs:394` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CharacterLimit.spec.mjs:426` test: handles graphemes
- `../lexical/packages/lexical-playground/__tests__/e2e/CharacterLimit.spec.mjs:427` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CharacterLimit.spec.mjs:444` test: CharacterLimit
- `../lexical/packages/lexical-playground/__tests__/e2e/CharacterLimit.spec.mjs:445` test: UTF-16
- `../lexical/packages/lexical-playground/__tests__/e2e/CharacterLimit.spec.mjs:453` test: UTF-8

## `../lexical/packages/lexical-playground/__tests__/e2e/ClearFormatting.spec.mjs`

category: portable
family: serialization-parsing / marks-inline
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-history/test; .tmp/slate-v2/playwright/integration/examples/richtext.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/ClearFormatting.spec.mjs:34` test: Clear All Formatting
- `../lexical/packages/lexical-playground/__tests__/e2e/ClearFormatting.spec.mjs:36` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/ClearFormatting.spec.mjs:39` test: Can clear BIU formatting
- `../lexical/packages/lexical-playground/__tests__/e2e/ClearFormatting.spec.mjs:60` test: Should preserve the default styling of links and quoted text
- `../lexical/packages/lexical-playground/__tests__/e2e/ClearFormatting.spec.mjs:107` test: Should preserve the default styling of hashtags and mentions
- `../lexical/packages/lexical-playground/__tests__/e2e/ClearFormatting.spec.mjs:188` test: Can clear left/center/right alignment when BIU formatting already applied
- `../lexical/packages/lexical-playground/__tests__/e2e/ClearFormatting.spec.mjs:210` test: Can clear left/center/right alignment when BIU formatting not applied
- `../lexical/packages/lexical-playground/__tests__/e2e/ClearFormatting.spec.mjs:231` test: Can clear when only indent/outdent alignment is applied
- `../lexical/packages/lexical-playground/__tests__/e2e/ClearFormatting.spec.mjs:252` test: Can clear indent/outdent alignment when other formatting options like BIU or left/right/center align are also applied
- `../lexical/packages/lexical-playground/__tests__/e2e/ClearFormatting.spec.mjs:279` test: Should clear formatting of selected text which spans over 1 paragraph

## `../lexical/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs`

category: portable
family: serialization-parsing / marks-inline
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-history/test; .tmp/slate-v2/playwright/integration/examples/richtext.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs:34` test: CodeBlock
- `../lexical/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs:36` test: Can create code block with markdown
- `../lexical/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs:108` test: Can create code block with markdown and wrap existing text
- `../lexical/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs:173` test: Can select multiple paragraphs and convert to code block
- `../lexical/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs:177` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs:234` test: Can select partial paragraphs and convert to code block
- `../lexical/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs:238` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs:300` test: Can select a line within line breaks and convert to code block
- `../lexical/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs:304` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs:351` test: Can switch highlighting language in a toolbar
- `../lexical/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs:423` test: Can maintain indent when creating new lines
- `../lexical/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs:428` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs:515` test: Can indent text via tab when selecting the line with Shift+Down
- `../lexical/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs:520` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs:603` test: Can (un)indent multiple lines at once
- `../lexical/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs:608` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs:924` test: Can move around lines with option+arrow keys
- `../lexical/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs:928` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs:1111` test: prevents selection and typing outside code block boundaries
- `../lexical/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs:1115` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs:1267` test: When pressing CMD/Ctrl + Left, CMD/Ctrl + Right, the cursor should go to the start of the code
- `../lexical/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs:1271` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs:1350` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CodeBlock.spec.mjs:1410` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/Collaboration.spec.mjs`

category: portable
family: collaboration-remote / history-undo-redo
target: .tmp/slate-v2/packages/slate/test/collab-history-runtime-contract.ts; future slate-yjs browser lane

- `../lexical/packages/lexical-playground/__tests__/e2e/Collaboration.spec.mjs:33` test: Collaboration
- `../lexical/packages/lexical-playground/__tests__/e2e/Collaboration.spec.mjs:36` test: Undo with collaboration on
- `../lexical/packages/lexical-playground/__tests__/e2e/Collaboration.spec.mjs:42` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Collaboration.spec.mjs:220` test: Remove dangling text from YJS when there is no preceding text node
- `../lexical/packages/lexical-playground/__tests__/e2e/Collaboration.spec.mjs:226` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Collaboration.spec.mjs:295` test: Merge dangling text into preceding text node
- `../lexical/packages/lexical-playground/__tests__/e2e/Collaboration.spec.mjs:301` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Collaboration.spec.mjs:387` test: Undo/redo where text node is split by formatting change
- `../lexical/packages/lexical-playground/__tests__/e2e/Collaboration.spec.mjs:393` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Collaboration.spec.mjs:512` test: Undo/redo where text node is split by inline element node
- `../lexical/packages/lexical-playground/__tests__/e2e/Collaboration.spec.mjs:518` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Collaboration.spec.mjs:644` test: $handleNormalizationMergeConflicts handles nodes that have been reparented
- `../lexical/packages/lexical-playground/__tests__/e2e/Collaboration.spec.mjs:648` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/ColumnLayoutBackspaceAtEnd.spec.mjs`

category: portable-mixed
family: mixed portable invariant
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/e2e/ColumnLayoutBackspaceAtEnd.spec.mjs:17` test: Layout - removes layout completely when both columns are empty and backspace is pressed at the first layout item
- `../lexical/packages/lexical-playground/__tests__/e2e/ColumnLayoutBackspaceAtEnd.spec.mjs:22` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs`

category: portable
family: ime-composition / history-undo-redo
target: .tmp/slate-v2/playwright/stress/generated-editing.test.ts; .tmp/slate-v2/packages/slate-browser/src/playwright/ime.ts; .tmp/slate-v2/packages/slate-history/test

- `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs:33` test: Composition
- `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs:35` test: Handles Hiragana characters
- `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs:88` test: Handles Arabic characters with diacritics
- `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs:173` test: IME
- `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs:174` test: Can type Hiragana via IME
- `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs:176` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs:258` test: Can type Hiragana via IME between line breaks
- `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs:263` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs:371` test: Can type Hiragana via IME into a new bold format
- `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs:377` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs:445` test: Can type Hiragana via IME between emojis
- `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs:449` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs:636` test: Can type Hiragana via IME at the end of a mention
- `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs:641` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs:746` test: Can type Hiragana via IME part way through a mention
- `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs:751` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs:852` test: Typing after mention with IME should not break it
- `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs:858` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs:920` test: Can type Hiragana via IME with hashtags
- `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs:926` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs:1078` test: Can type, delete and cancel Hiragana via IME
- `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs:1083` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs:1211` test: Floating toolbar should not be displayed when using IME
- `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs:1217` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs:1276` test: Typeahead menu should not close during IME composition
- `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs:1281` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs:1325` test: Can replace multiple formatted text nodes with IME composition (Korean)
- `../lexical/packages/lexical-playground/__tests__/e2e/Composition.spec.mjs:1331` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/HTMLCopyAndPaste.spec.mjs`

category: portable
family: clipboard-paste / browser-engine
target: .tmp/slate-v2/packages/slate/test/clipboard-contract.ts; .tmp/slate-v2/packages/slate-dom/test/clipboard-boundary.test.ts; .tmp/slate-v2/playwright/integration/examples/paste-html.test.ts; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/HTMLCopyAndPaste.spec.mjs:22` test: HTML CopyAndPaste
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/HTMLCopyAndPaste.spec.mjs:25` test: Copy + paste multi line html with extra newlines
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/HTMLCopyAndPaste.spec.mjs:30` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/HTMLCopyAndPaste.spec.mjs:53` test: Copy + paste a code block with BR
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/HTMLCopyAndPaste.spec.mjs:54` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/HTMLCopyAndPaste.spec.mjs:135` test: Copy + paste a paragraph element between horizontal rules
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/HTMLCopyAndPaste.spec.mjs:140` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/HTMLCopyAndPaste.spec.mjs:199` test: Paste top level element in the middle of paragraph
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/HTMLCopyAndPaste.spec.mjs:204` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/ImageHTMLCopyAndPaste.spec.mjs`

category: portable
family: clipboard-paste / browser-engine
target: .tmp/slate-v2/packages/slate/test/clipboard-contract.ts; .tmp/slate-v2/packages/slate-dom/test/clipboard-boundary.test.ts; .tmp/slate-v2/playwright/integration/examples/paste-html.test.ts; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/ImageHTMLCopyAndPaste.spec.mjs:26` test: HTML Image CopyAndPaste
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/ImageHTMLCopyAndPaste.spec.mjs:31` test: Copy + paste HTML of a figure with img and figcaption
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/ImageHTMLCopyAndPaste.spec.mjs:37` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/ImageHTMLCopyAndPaste.spec.mjs:134` test: Copy + paste an image
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/ImageHTMLCopyAndPaste.spec.mjs:135` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/ImageHTMLCopyAndPaste.spec.mjs:172` test: Copy + paste + undo multiple image
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/ImageHTMLCopyAndPaste.spec.mjs:177` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/LinksHTMLCopyAndPaste.spec.mjs`

category: portable
family: clipboard-paste / browser-engine
target: .tmp/slate-v2/packages/slate/test/clipboard-contract.ts; .tmp/slate-v2/packages/slate-dom/test/clipboard-boundary.test.ts; .tmp/slate-v2/playwright/integration/examples/paste-html.test.ts; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/LinksHTMLCopyAndPaste.spec.mjs:34` test: HTML Links CopyAndPaste
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/LinksHTMLCopyAndPaste.spec.mjs:37` test: Copy + paste an anchor element
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/LinksHTMLCopyAndPaste.spec.mjs:38` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/LinksHTMLCopyAndPaste.spec.mjs:99` test: Copy + paste in front of or after a link
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/LinksHTMLCopyAndPaste.spec.mjs:103` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/LinksHTMLCopyAndPaste.spec.mjs:130` test: Copy + paste link by selecting its (partial) content
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/LinksHTMLCopyAndPaste.spec.mjs:134` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/LinksHTMLCopyAndPaste.spec.mjs:166` test: Copy + paste empty link #3193
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/LinksHTMLCopyAndPaste.spec.mjs:167` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/LinksHTMLCopyAndPaste.spec.mjs:213` test: Paste a link into text
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/LinksHTMLCopyAndPaste.spec.mjs:214` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/LinksHTMLCopyAndPaste.spec.mjs:247` test: Paste text into a link
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/LinksHTMLCopyAndPaste.spec.mjs:248` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/LinksHTMLCopyAndPaste.spec.mjs:284` test: Paste formatted text into a link
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/LinksHTMLCopyAndPaste.spec.mjs:285` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/LinksHTMLCopyAndPaste.spec.mjs:326` test: Paste a link into a link
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/LinksHTMLCopyAndPaste.spec.mjs:327` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/LinksHTMLCopyAndPaste.spec.mjs:366` test: Paste multiple blocks into a link
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/LinksHTMLCopyAndPaste.spec.mjs:367` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/ListsHTMLCopyAndPaste.spec.mjs`

category: portable
family: clipboard-paste / browser-engine
target: .tmp/slate-v2/packages/slate/test/clipboard-contract.ts; .tmp/slate-v2/packages/slate-dom/test/clipboard-boundary.test.ts; .tmp/slate-v2/playwright/integration/examples/paste-html.test.ts; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/ListsHTMLCopyAndPaste.spec.mjs:21` test: HTML Lists CopyAndPaste
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/ListsHTMLCopyAndPaste.spec.mjs:24` test: Copy + paste a list element
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/ListsHTMLCopyAndPaste.spec.mjs:25` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/ListsHTMLCopyAndPaste.spec.mjs:93` test: Copy + paste a Lexical nested list
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/ListsHTMLCopyAndPaste.spec.mjs:94` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/ListsHTMLCopyAndPaste.spec.mjs:129` test: Copy + paste (Nested List - directly nested ul)
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/ListsHTMLCopyAndPaste.spec.mjs:133` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/ListsHTMLCopyAndPaste.spec.mjs:217` test: Copy + paste (Nested List - li with non-list content plus ul child)
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/ListsHTMLCopyAndPaste.spec.mjs:221` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/ListsHTMLCopyAndPaste.spec.mjs:299` test: Copy + paste a checklist
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/ListsHTMLCopyAndPaste.spec.mjs:300` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/ListsHTMLCopyAndPaste.spec.mjs:372` test: Paste top level element in the middle of list
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/ListsHTMLCopyAndPaste.spec.mjs:377` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/ListsHTMLCopyAndPaste.spec.mjs:425` test: Copy + paste a nested divs in a list
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/ListsHTMLCopyAndPaste.spec.mjs:426` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/TablesHTMLCopyAndPaste.spec.mjs`

category: portable
family: clipboard-paste / browser-engine
target: .tmp/slate-v2/packages/slate/test/clipboard-contract.ts; .tmp/slate-v2/packages/slate-dom/test/clipboard-boundary.test.ts; .tmp/slate-v2/playwright/integration/examples/paste-html.test.ts; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/TablesHTMLCopyAndPaste.spec.mjs:19` test: HTML Tables CopyAndPaste
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/TablesHTMLCopyAndPaste.spec.mjs:24` test: Copy + paste (Table - Google Docs)
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/TablesHTMLCopyAndPaste.spec.mjs:29` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/TablesHTMLCopyAndPaste.spec.mjs:31` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/TablesHTMLCopyAndPaste.spec.mjs:95` test: Copy + paste (Table - Google Docs with custom widths)
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/TablesHTMLCopyAndPaste.spec.mjs:100` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/TablesHTMLCopyAndPaste.spec.mjs:161` test: Copy + paste (Table - Quip)
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/TablesHTMLCopyAndPaste.spec.mjs:162` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/TablesHTMLCopyAndPaste.spec.mjs:233` test: Copy + paste (Table - Google Sheets)
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/TablesHTMLCopyAndPaste.spec.mjs:234` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/TablesHTMLCopyAndPaste.spec.mjs:306` test: Copy + paste - Merge Grids
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/TablesHTMLCopyAndPaste.spec.mjs:307` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/TablesHTMLCopyAndPaste.spec.mjs:308` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/TablesHTMLCopyAndPaste.spec.mjs:434` test: Copy + paste nested block and inline html in a table
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/TablesHTMLCopyAndPaste.spec.mjs:439` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/TablesHTMLCopyAndPaste.spec.mjs:441` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/TablesHTMLCopyAndPaste.spec.mjs:534` test: Copy + paste table with merged cells and unequal number of cells in rows
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/TablesHTMLCopyAndPaste.spec.mjs:539` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/TablesHTMLCopyAndPaste.spec.mjs:691` test: Copy + paste table with empty row
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/TablesHTMLCopyAndPaste.spec.mjs:696` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/TextFormatHTMLCopyAndPaste.spec.mjs`

category: portable
family: clipboard-paste / browser-engine
target: .tmp/slate-v2/packages/slate/test/clipboard-contract.ts; .tmp/slate-v2/packages/slate-dom/test/clipboard-boundary.test.ts; .tmp/slate-v2/playwright/integration/examples/paste-html.test.ts; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/TextFormatHTMLCopyAndPaste.spec.mjs:17` test: HTML CopyAndPaste
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/TextFormatHTMLCopyAndPaste.spec.mjs:20` test: Copy + paste html with BIU formatting
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/TextFormatHTMLCopyAndPaste.spec.mjs:21` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/TextFormatHTMLCopyAndPaste.spec.mjs:70` test: Copy + paste html with highlight formatting
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/html/TextFormatHTMLCopyAndPaste.spec.mjs:74` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/ContextMenuCopyAndPaste.spec.mjs`

category: portable
family: clipboard-paste / browser-engine
target: .tmp/slate-v2/packages/slate/test/clipboard-contract.ts; .tmp/slate-v2/packages/slate-dom/test/clipboard-boundary.test.ts; .tmp/slate-v2/playwright/integration/examples/paste-html.test.ts; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/ContextMenuCopyAndPaste.spec.mjs:23` test: ContextMenuCopyAndPaste
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/ContextMenuCopyAndPaste.spec.mjs:29` test: Basic copy-paste #6231
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/ContextMenuCopyAndPaste.spec.mjs:30` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/ContextMenuCopyAndPaste.spec.mjs:56` test: Rich text Copy and Paste with different Font Size
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/ContextMenuCopyAndPaste.spec.mjs:62` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/CopyAndPaste.spec.mjs`

category: portable
family: clipboard-paste / browser-engine
target: .tmp/slate-v2/packages/slate/test/clipboard-contract.ts; .tmp/slate-v2/packages/slate-dom/test/clipboard-boundary.test.ts; .tmp/slate-v2/playwright/integration/examples/paste-html.test.ts; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/CopyAndPaste.spec.mjs:33` test: CopyAndPaste
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/CopyAndPaste.spec.mjs:35` test: Basic copy + paste
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/CopyAndPaste.spec.mjs:222` test: Copy and paste heading
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/CopyAndPaste.spec.mjs:228` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/CopyAndPaste.spec.mjs:229` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/CopyAndPaste.spec.mjs:230` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/CopyAndPaste.spec.mjs:278` test: Copy and paste between sections
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/CopyAndPaste.spec.mjs:743` test: Copy and paste an inline element into a leaf node
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/CopyAndPaste.spec.mjs:747` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/CopyAndPaste.spec.mjs:796` test: Copy + paste multi-line plain text into rich text produces separate paragraphs
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/CopyAndPaste.spec.mjs:800` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/CopyAndPaste.spec.mjs:819` test: Pasting a decorator node on a blank line inserts before the line
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/CopyAndPaste.spec.mjs:826` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/CopyAndPaste.spec.mjs:875` test: Copy and paste paragraph into quote
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/CopyAndPaste.spec.mjs:876` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/CopyAndPaste.spec.mjs:905` test: Process font-size from content copied from Google Docs/MS Word
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/CopyAndPaste.spec.mjs:909` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/CopyAndPaste.spec.mjs:933` test: test font-size in pt and px both are processed correctly
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/CopyAndPaste.spec.mjs:937` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/CopyAndPaste.spec.mjs:965` test: Cut then copy empty selection preserves clipboard

## `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/ListsCopyAndPaste.spec.mjs`

category: portable
family: clipboard-paste / browser-engine
target: .tmp/slate-v2/packages/slate/test/clipboard-contract.ts; .tmp/slate-v2/packages/slate-dom/test/clipboard-boundary.test.ts; .tmp/slate-v2/playwright/integration/examples/paste-html.test.ts; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/ListsCopyAndPaste.spec.mjs:30` test: Lists CopyAndPaste
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/ListsCopyAndPaste.spec.mjs:33` test: Copy and paste of partial list items into an empty editor
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/ListsCopyAndPaste.spec.mjs:37` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/ListsCopyAndPaste.spec.mjs:139` test: Copy and paste of partial list items into the list
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/ListsCopyAndPaste.spec.mjs:143` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/ListsCopyAndPaste.spec.mjs:280` test: Copy list items and paste back into list
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/ListsCopyAndPaste.spec.mjs:285` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/ListsCopyAndPaste.spec.mjs:399` test: Copy list items and paste into list
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/ListsCopyAndPaste.spec.mjs:404` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/ListsCopyAndPaste.spec.mjs:405` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/ListsCopyAndPaste.spec.mjs:533` test: Copy and paste of list items and paste back into list on an existing item
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/ListsCopyAndPaste.spec.mjs:538` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/ListsCopyAndPaste.spec.mjs:663` test: Copy and paste two paragraphs into list on an existing item
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/ListsCopyAndPaste.spec.mjs:667` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/ListsCopyAndPaste.spec.mjs:766` test: Copy and paste two paragraphs at the end of a list
- `../lexical/packages/lexical-playground/__tests__/e2e/CopyAndPaste/lexical/ListsCopyAndPaste.spec.mjs:770` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/DateTime.spec.mjs`

category: portable-mixed
family: mixed portable invariant
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/e2e/DateTime.spec.mjs:20` test: DateTime
- `../lexical/packages/lexical-playground/__tests__/e2e/DateTime.spec.mjs:23` test: can insert a DateTime node via the Insert dropdown
- `../lexical/packages/lexical-playground/__tests__/e2e/DateTime.spec.mjs:27` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/DateTime.spec.mjs:62` test: Datetime should be inserted into the link
- `../lexical/packages/lexical-playground/__tests__/e2e/DateTime.spec.mjs:66` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/DateTime.spec.mjs:114` test: Datetime should apply the current selection format
- `../lexical/packages/lexical-playground/__tests__/e2e/DateTime.spec.mjs:118` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/DraggableBlock.spec.mjs`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/e2e/DraggableBlock.spec.mjs:18` test: DraggableBlock
- `../lexical/packages/lexical-playground/__tests__/e2e/DraggableBlock.spec.mjs:21` test: Paragraph one can be successfully dragged below paragraph two
- `../lexical/packages/lexical-playground/__tests__/e2e/DraggableBlock.spec.mjs:27` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/DraggableBlock.spec.mjs:28` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/DraggableBlock.spec.mjs:29` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/DraggableBlock.spec.mjs:70` test: Dragging a paragraph to the end of itself does not change the content
- `../lexical/packages/lexical-playground/__tests__/e2e/DraggableBlock.spec.mjs:76` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/DraggableBlock.spec.mjs:77` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/DraggableBlock.spec.mjs:78` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/DraggableBlock.spec.mjs:112` test: Drag a paragraph to the bottom of its previous paragraph and nothing happens
- `../lexical/packages/lexical-playground/__tests__/e2e/DraggableBlock.spec.mjs:118` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/DraggableBlock.spec.mjs:119` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/DraggableBlock.spec.mjs:120` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/DraggableBlock.spec.mjs:154` test: Dragging the first paragraph to an empty space in the middle of the editor works correctly
- `../lexical/packages/lexical-playground/__tests__/e2e/DraggableBlock.spec.mjs:160` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/DraggableBlock.spec.mjs:161` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/DraggableBlock.spec.mjs:162` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/ElementFormat.spec.mjs`

category: portable
family: serialization-parsing / marks-inline
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-history/test; .tmp/slate-v2/playwright/integration/examples/richtext.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/ElementFormat.spec.mjs:20` test: Element format
- `../lexical/packages/lexical-playground/__tests__/e2e/ElementFormat.spec.mjs:22` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/ElementFormat.spec.mjs:26` test: Can indent/align paragraph when caret is within link
- `../lexical/packages/lexical-playground/__tests__/e2e/ElementFormat.spec.mjs:59` test: Can center align an empty paragraph

## `../lexical/packages/lexical-playground/__tests__/e2e/Emoticons.spec.mjs`

category: portable-mixed
family: mixed portable invariant
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/e2e/Emoticons.spec.mjs:24` test: Emoticons
- `../lexical/packages/lexical-playground/__tests__/e2e/Emoticons.spec.mjs:26` test: Can handle a single emoticon
- `../lexical/packages/lexical-playground/__tests__/e2e/Emoticons.spec.mjs:107` test: Can enter multiple emoticons
- `../lexical/packages/lexical-playground/__tests__/e2e/Emoticons.spec.mjs:573` test: Can handle single emoticon replaced with text

## `../lexical/packages/lexical-playground/__tests__/e2e/EquationNode.spec.mjs`

category: portable-mixed
family: mixed portable invariant
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/e2e/EquationNode.spec.mjs:60` test: EquationNode
- `../lexical/packages/lexical-playground/__tests__/e2e/EquationNode.spec.mjs:62` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/EquationNode.spec.mjs:68` test: inline EquationNode is wrapped in a paragraph
- `../lexical/packages/lexical-playground/__tests__/e2e/EquationNode.spec.mjs:86` test: block EquationNode is a child of the root

## `../lexical/packages/lexical-playground/__tests__/e2e/Events.spec.mjs`

category: portable
family: beforeinput-input / browser-engine
target: .tmp/slate-v2/packages/slate-react/test/model-input-strategy-contract.test.ts; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/Events.spec.mjs:18` test: Events
- `../lexical/packages/lexical-playground/__tests__/e2e/Events.spec.mjs:21` test: Autocapitalization (MacOS specific)
- `../lexical/packages/lexical-playground/__tests__/e2e/Events.spec.mjs:96` test: Add period with double-space after emoji (MacOS specific) #3953

## `../lexical/packages/lexical-playground/__tests__/e2e/Extensions.spec.mjs`

category: portable
family: clipboard-paste / browser-engine
target: .tmp/slate-v2/packages/slate/test/clipboard-contract.ts; .tmp/slate-v2/packages/slate-dom/test/clipboard-boundary.test.ts; .tmp/slate-v2/playwright/integration/examples/paste-html.test.ts; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/Extensions.spec.mjs:23` test: Extensions
- `../lexical/packages/lexical-playground/__tests__/e2e/Extensions.spec.mjs:25` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Extensions.spec.mjs:47` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Extensions.spec.mjs:128` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Extensions.spec.mjs:183` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Extensions.spec.mjs:189` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Extensions.spec.mjs:190` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Extensions.spec.mjs:237` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Extensions.spec.mjs:274` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/Focus.spec.mjs`

category: portable
family: beforeinput-input / browser-engine
target: .tmp/slate-v2/packages/slate-react/test/model-input-strategy-contract.test.ts; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/Focus.spec.mjs:18` test: Focus
- `../lexical/packages/lexical-playground/__tests__/e2e/Focus.spec.mjs:20` test: can tab out of the editor
- `../lexical/packages/lexical-playground/__tests__/e2e/Focus.spec.mjs:23` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Focus.spec.mjs:34` test: selection remains internally when clicking outside the editor
- `../lexical/packages/lexical-playground/__tests__/e2e/Focus.spec.mjs:38` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/Hashtags.spec.mjs`

category: portable
family: selection-dom-mapping / void-atom
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-react/test/editable-behavior.test.tsx; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/Hashtags.spec.mjs:28` test: Hashtags
- `../lexical/packages/lexical-playground/__tests__/e2e/Hashtags.spec.mjs:30` test: Can handle a single hashtag
- `../lexical/packages/lexical-playground/__tests__/e2e/Hashtags.spec.mjs:90` test: Can handle adjacent hashtags
- `../lexical/packages/lexical-playground/__tests__/e2e/Hashtags.spec.mjs:195` test: Can insert many hashtags mixed with text and delete them all correctly
- `../lexical/packages/lexical-playground/__tests__/e2e/Hashtags.spec.mjs:269` test: Hashtag inherits format
- `../lexical/packages/lexical-playground/__tests__/e2e/Hashtags.spec.mjs:270` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Hashtags.spec.mjs:290` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Hashtags.spec.mjs:329` test: Should not break while skipping invalid hashtags #5703
- `../lexical/packages/lexical-playground/__tests__/e2e/Hashtags.spec.mjs:365` test: Can handle hashtags following multiple invalid hashtags
- `../lexical/packages/lexical-playground/__tests__/e2e/Hashtags.spec.mjs:420` test: Should not break when pasting multiple matches
- `../lexical/packages/lexical-playground/__tests__/e2e/Hashtags.spec.mjs:424` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Hashtags.spec.mjs:444` test: Should not break while importing and exporting multiple matches
- `../lexical/packages/lexical-playground/__tests__/e2e/Hashtags.spec.mjs:448` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/Headings/HeadingsBackspaceAtStart.spec.mjs`

category: portable
family: serialization-parsing / marks-inline
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-history/test; .tmp/slate-v2/playwright/integration/examples/richtext.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/Headings/HeadingsBackspaceAtStart.spec.mjs:19` test: Headings - stays as a heading when you backspace at the start of a heading with no previous sibling nodes present
- `../lexical/packages/lexical-playground/__tests__/e2e/Headings/HeadingsBackspaceAtStart.spec.mjs:24` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/Headings/HeadingsEnterAtEnd.spec.mjs`

category: portable
family: serialization-parsing / marks-inline
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-history/test; .tmp/slate-v2/playwright/integration/examples/richtext.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/Headings/HeadingsEnterAtEnd.spec.mjs:18` test: Headings - changes to a paragraph when you press enter at the end of a heading
- `../lexical/packages/lexical-playground/__tests__/e2e/Headings/HeadingsEnterAtEnd.spec.mjs:23` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/Headings/HeadingsEnterInMiddle.spec.mjs`

category: portable
family: serialization-parsing / marks-inline
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-history/test; .tmp/slate-v2/playwright/integration/examples/richtext.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/Headings/HeadingsEnterInMiddle.spec.mjs:23` test: Headings - stays as a heading when you press enter in the middle of a heading
- `../lexical/packages/lexical-playground/__tests__/e2e/Headings/HeadingsEnterInMiddle.spec.mjs:28` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/HorizontalRule.spec.mjs`

category: portable
family: selection-dom-mapping / void-atom
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-react/test/editable-behavior.test.tsx; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/HorizontalRule.spec.mjs:35` test: HorizontalRule
- `../lexical/packages/lexical-playground/__tests__/e2e/HorizontalRule.spec.mjs:37` test: Can create a horizontal rule and move selection around it
- `../lexical/packages/lexical-playground/__tests__/e2e/HorizontalRule.spec.mjs:41` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/HorizontalRule.spec.mjs:158` test: Will add a horizontal rule at the end of a current TextNode and move selection to the new ParagraphNode.
- `../lexical/packages/lexical-playground/__tests__/e2e/HorizontalRule.spec.mjs:162` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/HorizontalRule.spec.mjs:210` test: Will add a horizontal rule and split a TextNode across 2 paragraphs if the caret is in the middle of the TextNode, moving selection to the start of the new ParagraphNode.
- `../lexical/packages/lexical-playground/__tests__/e2e/HorizontalRule.spec.mjs:214` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/HorizontalRule.spec.mjs:272` test: Will add a horizontal rule and split a TextNode across 2 ListItemNode if the caret is in the middle of the TextNode, moving selection to the start of the new ParagraphNode
- `../lexical/packages/lexical-playground/__tests__/e2e/HorizontalRule.spec.mjs:276` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/HorizontalRule.spec.mjs:341` test: Will add a horizontal rule and split a TextNode across 2 ListItemNode if the caret is in an empty ListItemNode, moving selection to the start of the new ListItemNode (#6849)
- `../lexical/packages/lexical-playground/__tests__/e2e/HorizontalRule.spec.mjs:345` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/HorizontalRule.spec.mjs:399` test: Can copy and paste a horizontal rule
- `../lexical/packages/lexical-playground/__tests__/e2e/HorizontalRule.spec.mjs:400` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/HorizontalRule.spec.mjs:489` test: Can delete empty paragraph after a horizontal rule without deleting the horizontal rule
- `../lexical/packages/lexical-playground/__tests__/e2e/HorizontalRule.spec.mjs:495` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/Images.spec.mjs`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/e2e/Images.spec.mjs:35` test: Images
- `../lexical/packages/lexical-playground/__tests__/e2e/Images.spec.mjs:37` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Images.spec.mjs:40` test: Can create a decorator and move selection around it
- `../lexical/packages/lexical-playground/__tests__/e2e/Images.spec.mjs:45` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Images.spec.mjs:219` test: Can add images and delete them correctly
- `../lexical/packages/lexical-playground/__tests__/e2e/Images.spec.mjs:223` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Images.spec.mjs:391` test: Can add images by arbitrary URL
- `../lexical/packages/lexical-playground/__tests__/e2e/Images.spec.mjs:396` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Images.spec.mjs:442` test: Can be dragged and dropped correctly when the image is clicked
- `../lexical/packages/lexical-playground/__tests__/e2e/Images.spec.mjs:448` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Images.spec.mjs:449` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Images.spec.mjs:450` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Images.spec.mjs:535` test: Cannot be dragged without being clicked
- `../lexical/packages/lexical-playground/__tests__/e2e/Images.spec.mjs:539` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Images.spec.mjs:577` test: Select image, then select text - EditorState.\_selection updates with mousedown #2901
- `../lexical/packages/lexical-playground/__tests__/e2e/Images.spec.mjs:584` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Images.spec.mjs:585` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Images.spec.mjs:615` test: Node selection: can select multiple image nodes and replace them with a new image
- `../lexical/packages/lexical-playground/__tests__/e2e/Images.spec.mjs:620` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Images.spec.mjs:725` test: Can resolve selection correctly when the image is clicked and dragged right
- `../lexical/packages/lexical-playground/__tests__/e2e/Images.spec.mjs:731` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Images.spec.mjs:770` test: Verifies image dimensions are properly calculated for both SVG and JPG formats
- `../lexical/packages/lexical-playground/__tests__/e2e/Images.spec.mjs:775` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Images.spec.mjs:820` test: Dimensionless SVG renders with a visible bounding box instead of collapsing
- `../lexical/packages/lexical-playground/__tests__/e2e/Images.spec.mjs:825` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/Indentation.spec.mjs`

category: portable
family: serialization-parsing / marks-inline
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-history/test; .tmp/slate-v2/playwright/integration/examples/richtext.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/Indentation.spec.mjs:41` test: Identation
- `../lexical/packages/lexical-playground/__tests__/e2e/Indentation.spec.mjs:46` test: Can create content and indent and outdent it all
- `../lexical/packages/lexical-playground/__tests__/e2e/Indentation.spec.mjs:53` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Indentation.spec.mjs:461` test: Can only indent paragraph until the max depth
- `../lexical/packages/lexical-playground/__tests__/e2e/Indentation.spec.mjs:465` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Indentation.spec.mjs:479` test: Can only indent until the max depth when list is empty
- `../lexical/packages/lexical-playground/__tests__/e2e/Indentation.spec.mjs:483` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Indentation.spec.mjs:591` test: Can only indent until the max depth when list has content
- `../lexical/packages/lexical-playground/__tests__/e2e/Indentation.spec.mjs:595` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Indentation.spec.mjs:704` test: Can only indent until the max depth a list with nested lists
- `../lexical/packages/lexical-playground/__tests__/e2e/Indentation.spec.mjs:708` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Indentation.spec.mjs:1007` test: Cannot have negative indents (#7410)
- `../lexical/packages/lexical-playground/__tests__/e2e/Indentation.spec.mjs:1008` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/Keyboard.spec.mjs`

category: portable
family: beforeinput-input / browser-engine
target: .tmp/slate-v2/packages/slate-react/test/model-input-strategy-contract.test.ts; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/Keyboard.spec.mjs:21` test: Keyboard shortcuts
- `../lexical/packages/lexical-playground/__tests__/e2e/Keyboard.spec.mjs:26` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Keyboard.spec.mjs:32` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/KeyboardShortcuts.spec.mjs`

category: portable
family: beforeinput-input / browser-engine
target: .tmp/slate-v2/packages/slate-react/test/model-input-strategy-contract.test.ts; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/KeyboardShortcuts.spec.mjs:179` test: Keyboard shortcuts
- `../lexical/packages/lexical-playground/__tests__/e2e/KeyboardShortcuts.spec.mjs:181` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/KeyboardShortcuts.spec.mjs:186` test: Can use ${format} format with the shortcut
- `../lexical/packages/lexical-playground/__tests__/e2e/KeyboardShortcuts.spec.mjs:211` test: Can use ${alignment} with the shortcut
- `../lexical/packages/lexical-playground/__tests__/e2e/KeyboardShortcuts.spec.mjs:229` test: Can use ${style} with the shortcut
- `../lexical/packages/lexical-playground/__tests__/e2e/KeyboardShortcuts.spec.mjs:246` test: Can increase and decrease font size with the shortcuts
- `../lexical/packages/lexical-playground/__tests__/e2e/KeyboardShortcuts.spec.mjs:264` test: Can clear formatting with the shortcut
- `../lexical/packages/lexical-playground/__tests__/e2e/KeyboardShortcuts.spec.mjs:312` test: Can toggle Insert Code Block with the shortcut
- `../lexical/packages/lexical-playground/__tests__/e2e/KeyboardShortcuts.spec.mjs:335` test: Can indent and outdent with the shortcuts

## `../lexical/packages/lexical-playground/__tests__/e2e/Keywords.spec.mjs`

category: portable-mixed
family: selection-dom-mapping / void-atom
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-react/test/editable-behavior.test.tsx; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/Keywords.spec.mjs:24` test: Keywords
- `../lexical/packages/lexical-playground/__tests__/e2e/Keywords.spec.mjs:26` test: Can create a decorator and move selection around it
- `../lexical/packages/lexical-playground/__tests__/e2e/Keywords.spec.mjs:190` test: Can type congrats[Team]!
- `../lexical/packages/lexical-playground/__tests__/e2e/Keywords.spec.mjs:217` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Keywords.spec.mjs:223` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Keywords.spec.mjs:354` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Keywords.spec.mjs:358` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs`

category: portable
family: selection-dom-mapping / void-atom
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-react/test/editable-behavior.test.tsx; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:39` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:42` describe: Links
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:44` test: Can convert a text node into a link
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:127` test: Can convert multi-formatted text into a link (backward)
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:244` test: Can convert multi-formatted text into a link (forward)
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:361` test: Can create a link in a list and insert a paragraph at the start
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:410` test: Can create a link with some text after, insert paragraph, then backspace, it should merge correctly
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:495` test: Can backspace across a link and it deletes text, not the whole link
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:551` test: Can create a link then replace it with plain text
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:590` test: Can create a link then replace it with plain text #2
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:616` test: Can create a link then partly replace it with plain text
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:649` test: Inserting text either side of links
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:673` test: Inserting text before links
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:674` test: Start-of-paragraph links
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:721` test: Can insert text before a start-of-paragraph link, via typing
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:727` test: Can insert text before a start-of-paragraph link, via pasting plain text
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:734` test: Can insert text before a start-of-paragraph link, via pasting HTML
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:741` test: Can insert text before a start-of-paragraph link, via pasting Lexical text
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:748` test: Mid-paragraph links
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:795` test: Can insert text before a mid-paragraph link, via typing
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:801` test: Can insert text before a mid-paragraph link, via pasting plain text
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:807` test: Can insert text before a mid-paragraph link, via pasting HTML
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:813` test: Can insert text before a mid-paragraph link, via pasting Lexical text
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:820` test: End-of-paragraph links
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:865` test: Can insert text before an end-of-paragraph link, via typing
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:871` test: Can insert text before an end-of-paragraph link, via pasting plain text
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:878` test: Can insert text before an end-of-paragraph link, via pasting HTML
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:885` test: Can insert text before an end-of-paragraph link, via pasting Lexical text
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:893` test: Inserting text after links
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:894` test: Start-of-paragraph links
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:940` test: Can insert text after a start-of-paragraph link, via typing
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:946` test: Can insert text after a start-of-paragraph link, via pasting plain text
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:953` test: Can insert text after a start-of-paragraph link, via pasting HTML
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:960` test: Can insert text after a start-of-paragraph link, via pasting Lexical text
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:967` test: Mid-paragraph links
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:1014` test: Can insert text after a mid-paragraph link, via typing
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:1020` test: Can insert text after a mid-paragraph link, via pasting plain text
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:1027` test: Can insert text after a mid-paragraph link, via pasting HTML
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:1034` test: Can insert text after a mid-paragraph link, via pasting Lexical text
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:1041` test: End-of-paragraph links
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:1087` test: Can insert text after an end-of-paragraph link, via typing
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:1093` test: Can insert text after an end-of-paragraph link, via pasting plain text
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:1100` test: Can insert text after an end-of-paragraph link, via pasting HTML
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:1107` test: Can insert text after an end-of-paragraph link, via pasting Lexical text
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:1116` test: Can convert multi-formatted text into a link and then modify text after
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:1241` test: It can insert text inside a link after a formatted text node
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:1326` test: It can insert text inside a link before a formatted text node
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:1414` test: Can edit link with collapsed selection
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:1454` test: Can type text before and after
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:1506` test: Can delete text up to a link and then add text after
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:1570` test: Can convert part of a text node into a link with forwards selection
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:1662` test: Can convert part of a text node into a link with backwards selection
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:1766` test: Can convert part of a text node into a link and change block type
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:1814` test: Can create multiline links
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:1850` test: Can handle pressing Enter inside a Link
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:1888` test: Can handle pressing Enter inside a Link containing multiple TextNodes
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:1931` test: Can handle pressing Enter at the beginning of a Link
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:1965` test: Can handle pressing Enter at the end of a Link
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:1969` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:1999` test: Can add, edit and remove links on images
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:2005` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:2150` test: Can add, edit and remove links on multiple selected images
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:2156` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:2406` test: Link attributes
- `../lexical/packages/lexical-playground/__tests__/e2e/Links.spec.mjs:2411` test: Can add attributes with paste

## `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs`

category: portable
family: serialization-parsing / marks-inline
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-history/test; .tmp/slate-v2/playwright/integration/examples/richtext.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:75` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:78` test: Checklist focus option
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:79` test: (shouldDisableFocusOnClickChecklist: true) Keeps focus outside the editor when clicking a checklist item
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:83` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:120` test: (shouldDisableFocusOnClickChecklist: false) Moves focus into the editor/listItem when clicking a checklist item
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:124` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:169` describe: Nested List
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:172` test: Can create a list and partially copy some content out of it
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:224` test: Should outdent if indented when the backspace key is pressed
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:316` test: Should outdent if indented when the backspace key is pressed only at the front
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:367` test: Should retain selection style when exiting list
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:447` test: Can indent/outdent multiple list nodes in a list with multiple levels of indentation
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:671` test: Can indent a list with a list item in between nested lists
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:719` test: Can create a list and then toggle it back to original state.
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:923` test: Can toggle format for multi-line list of each type without losing indentation state.
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:1242` test: Can create a list containing inline blocks and then toggle it back to original state.
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:1329` test: Can create multiple bullet lists and then toggle off the list.
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:1446` test: Can create an unordered list and convert it to an ordered list
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:1487` test: Can create a single item unordered list with text and convert it to an ordered list
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:1523` test: Can create a multi-line unordered list and convert it to an ordered list
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:1614` test: Can create a multi-line unordered list and convert it to an ordered list when no nodes are in the selection
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:1698` test: Can create an indented multi-line unordered list and convert it to an ordered list
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:1831` test: Can create an indented multi-line unordered list and convert individual lists in the nested structure to a numbered list.
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:2117` test: Should merge selected nodes into existing list siblings of the same type when formatting to a list
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:2194` test: Should NOT merge selected nodes into existing list siblings of a different type when formatting to a list
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:2270` test: Should create list with start number markdown
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:2301` test: Should not process paragraph markdown inside list.
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:2318` test: Un-indents list empty list items when the user presses enter
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:2371` test: Converts a List with one ListItem to a Paragraph when Normal is selected in the format menu
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:2400` test: Converts the last ListItem in a List with multiple ListItem to a Paragraph when Normal is selected in the format menu
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:2439` test: Converts the middle ListItem in a List with multiple ListItem to a Paragraph when Normal is selected in the format menu
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:2489` test: Can create check list, toggle it to bullet-list and back
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:2617` test: can navigate and check/uncheck with keyboard
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:2683` test: replaces existing element node
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:2707` test: remove list breaks when selection in empty nested list item
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:2739` test: remove list breaks when selection in empty nested list item 2
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:2789` test: new list item should preserve format from previous list item even after new list item is indented
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:2827` test: collapseAtStart for trivial bullet list
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:2848` test: collapseAtStart for bullet list with text
- `../lexical/packages/lexical-playground/__tests__/e2e/List.spec.mjs:2873` test: collapseAtStart for bullet list with text inside autolink

## `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs`

category: portable
family: serialization-parsing / marks-inline
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-history/test; .tmp/slate-v2/playwright/integration/examples/richtext.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs:55` describe: Markdown
- `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs:219` test: Should create stylized (e.g. BIUS) text from plain text using a markdown shortcut e.g. ${markdownText}
- `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs:224` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs:250` test: Should create stylized (e.g. BIUS) text from already stylized text using a markdown shortcut e.g. ${markdownText}
- `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs:255` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs:308` test: Should test markdown with the (${markdownText}) trigger. Should include undo and redo.
- `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs:313` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs:333` test: Should test importing markdown (${markdownText}) trigger.
- `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs:338` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs:380` describe: Markdown
- `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs:382` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs:654` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs:678` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs:690` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs:698` test: can undo/redo nested transformations
- `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs:763` test: can convert already styled text (overlapping ranges)
- `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs:810` test: can convert markdown text into rich text
- `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs:839` test: can type text with markdown
- `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs:845` test: intraword text format
- `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs:871` test: can export text format next to a newline
- `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs:907` test: can import single decorator node (#2604)
- `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs:909` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs:941` test: can import several text match transformers in a same line (#5385)
- `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs:945` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs:1007` test: does not use code-formatted text in text format transformers (#7349)
- `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs:1028` test: can adjust selection after text match transformer
- `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs:1055` test: keep list marker on its own items
- `../lexical/packages/lexical-playground/__tests__/e2e/Markdown.spec.mjs:1069` test: keep list marker on its own items with copy/paste

## `../lexical/packages/lexical-playground/__tests__/e2e/MaxLength.spec.mjs`

category: portable-mixed
family: mixed portable invariant
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/e2e/MaxLength.spec.mjs:24` test: MaxLength
- `../lexical/packages/lexical-playground/__tests__/e2e/MaxLength.spec.mjs:29` test: can restrict the text to specified length
- `../lexical/packages/lexical-playground/__tests__/e2e/MaxLength.spec.mjs:56` test: can restrict pasted text to specified length
- `../lexical/packages/lexical-playground/__tests__/e2e/MaxLength.spec.mjs:73` test: can restrict emojis on boundaries
- `../lexical/packages/lexical-playground/__tests__/e2e/MaxLength.spec.mjs:125` test: paste with empty paragraph in between #3773
- `../lexical/packages/lexical-playground/__tests__/e2e/MaxLength.spec.mjs:142` test: paste with empty paragraph at end #3773

## `../lexical/packages/lexical-playground/__tests__/e2e/Mentions.spec.mjs`

category: portable
family: selection-dom-mapping / void-atom
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-react/test/editable-behavior.test.tsx; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/Mentions.spec.mjs:29` test: Mentions
- `../lexical/packages/lexical-playground/__tests__/e2e/Mentions.spec.mjs:32` test: Can enter the Luke Skywalker mention
- `../lexical/packages/lexical-playground/__tests__/e2e/Mentions.spec.mjs:105` test: Can enter and delete part of the Luke Skywalker mention
- `../lexical/packages/lexical-playground/__tests__/e2e/Mentions.spec.mjs:200` test: Can enter and backspace part of the Luke Skywalker mention in the middle
- `../lexical/packages/lexical-playground/__tests__/e2e/Mentions.spec.mjs:276` test: Can enter and delete part of the Luke Skywalker mention in the middle
- `../lexical/packages/lexical-playground/__tests__/e2e/Mentions.spec.mjs:352` test: Can enter and backspace part of the Luke Skywalker mention
- `../lexical/packages/lexical-playground/__tests__/e2e/Mentions.spec.mjs:524` test: Can enter multiple Luke Skywalker mentions and then delete them from start
- `../lexical/packages/lexical-playground/__tests__/e2e/Mentions.spec.mjs:858` test: Can enter a mention then delete it and partially remove text after
- `../lexical/packages/lexical-playground/__tests__/e2e/Mentions.spec.mjs:940` test: Pasting over a mention does not lead to crash
- `../lexical/packages/lexical-playground/__tests__/e2e/Mentions.spec.mjs:992` test: Sets correct attributes on typeahead menu container
- `../lexical/packages/lexical-playground/__tests__/e2e/Mentions.spec.mjs:996` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/Mutations.spec.mjs`

category: portable
family: beforeinput-input / browser-engine
target: .tmp/slate-v2/packages/slate-react/test/model-input-strategy-contract.test.ts; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/Mutations.spec.mjs:51` test: Mutations
- `../lexical/packages/lexical-playground/__tests__/e2e/Mutations.spec.mjs:53` test: Text mutation observers also manage the selection
- `../lexical/packages/lexical-playground/__tests__/e2e/Mutations.spec.mjs:156` test: Can restore the DOM to the editor state state

## `../lexical/packages/lexical-playground/__tests__/e2e/Navigation.spec.mjs`

category: portable
family: selection-dom-mapping / void-atom
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-react/test/editable-behavior.test.tsx; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/Navigation.spec.mjs:44` test: Keyboard Navigation
- `../lexical/packages/lexical-playground/__tests__/e2e/Navigation.spec.mjs:47` test: can type several paragraphs
- `../lexical/packages/lexical-playground/__tests__/e2e/Navigation.spec.mjs:66` test: can move to the beginning of the current line, then back to the end of the current line
- `../lexical/packages/lexical-playground/__tests__/e2e/Navigation.spec.mjs:105` test: can move to the top of the editor
- `../lexical/packages/lexical-playground/__tests__/e2e/Navigation.spec.mjs:116` test: can move one word to the right
- `../lexical/packages/lexical-playground/__tests__/e2e/Navigation.spec.mjs:153` test: can move to the beginning of the previous word
- `../lexical/packages/lexical-playground/__tests__/e2e/Navigation.spec.mjs:198` test: can move to the bottom of the editor
- `../lexical/packages/lexical-playground/__tests__/e2e/Navigation.spec.mjs:219` test: can move to the beginning of the current paragraph
- `../lexical/packages/lexical-playground/__tests__/e2e/Navigation.spec.mjs:242` test: can move to the top of the editor, then to the bottom of the current paragraph
- `../lexical/packages/lexical-playground/__tests__/e2e/Navigation.spec.mjs:260` test: can navigate through the plain text word by word
- `../lexical/packages/lexical-playground/__tests__/e2e/Navigation.spec.mjs:474` test: can navigate through the formatted text word by word
- `../lexical/packages/lexical-playground/__tests__/e2e/Navigation.spec.mjs:795` test: can navigate through the text with emoji word by word

## `../lexical/packages/lexical-playground/__tests__/e2e/Placeholder.spec.mjs`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/e2e/Placeholder.spec.mjs:20` test: Placeholder
- `../lexical/packages/lexical-playground/__tests__/e2e/Placeholder.spec.mjs:22` test: Displays a placeholder when no content is present

## `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs`

category: portable
family: selection-dom-mapping / void-atom
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-react/test/editable-behavior.test.tsx; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:59` describe: Selection
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:63` test: does not focus the editor on load
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:84` test: keeps single active selection for nested editors
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:90` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:139` test: can wrap post-linebreak nodes into new element
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:143` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:171` test: can delete text by line backwards with CMD+delete
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:175` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:210` test: can delete text by line forwards with opt+CMD+delete
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:214` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:258` test: can delete text by line forwards with control+K
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:268` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:312` test: can delete line which ends with element backwards with CMD+delete
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:316` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:351` test: can delete line which starts with element forwards with opt+CMD+delete
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:355` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:511` test: can delete line by collapse
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:512` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:532` test: Can insert inline element within text and put selection after it
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:536` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:552` test: Can delete at boundary #4221
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:553` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:590` test: Can select all with node selection
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:591` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:606` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:611` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:649` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:654` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:697` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:698` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:737` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:738` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:780` test: Can delete block elements
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:781` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:836` test: Can delete sibling elements forward
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:842` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:860` test: Can adjust triple click selection
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:865` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:891` test: Can adjust triple click selection with
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:896` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:933` test: Select all from Node selection #4658
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:935` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:952` test: Select all (DecoratorNode at start) #4670
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:957` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:976` test: Can use block controls on selections including decorator nodes #5371
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:981` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1008` test: Select previous with RTL (DecoratorNode) #7685
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1013` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1035` test: Select next with RTL (DecoratorNode) #7685
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1040` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1063` test: Move left from DecoratorNode in RTL #7771
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1068` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1096` test: Move right from DecoratorNode in RTL #7771
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1101` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1128` test: Move right from last node in RTL #7775
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1133` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1145` test: Move left from last node in RTL #7775
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1151` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1152` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1170` test: Can delete table node present at the end #5543
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1176` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1193` test: Triple-clicking last cell in table should not select entire document
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1199` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1248` test: Selecting table cell then dragging to outside of table should select entire table
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1254` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1295` test: Can persist the text format from the paragraph
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1299` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1338` test: toggle format at the start of paragraph to a different format persists the format
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1342` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1379` test: formatting is persisted after deleting all nodes from the paragraph node
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1383` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1410` test: Can persist the text style (color) from the paragraph
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1414` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1449` test: shift+arrowdown into a table selects the whole table
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1455` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1456` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1471` test: shift+arrowup into a table selects the whole table
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1477` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1478` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1493` test: shift+arrowdown into a table, when the table is the last node, selects the whole table
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1497` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1515` test: shift+arrowup into a table, when the table is the first node, selects the whole table
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1519` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1537` test: shift+arrowdown into a table, when the table is the only node, selects the whole table
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1541` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1566` test: shift+arrowup into a table, when the table is the only node, selects the whole table
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1572` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1597` test: shift+arrowdown into a table does not select element after
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1603` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1622` test: shift+arrowup into a table does not select element before
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1628` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1646` test: programatic update on blurred editor does not kill selection
- `../lexical/packages/lexical-playground/__tests__/e2e/Selection.spec.mjs:1651` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/SelectionAlwaysOnDisplay.spec.mjs`

category: portable-mixed
family: selection-dom-mapping / void-atom
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-react/test/editable-behavior.test.tsx; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/SelectionAlwaysOnDisplay.spec.mjs:20` test: SelectionAlwaysOnDisplay
- `../lexical/packages/lexical-playground/__tests__/e2e/SelectionAlwaysOnDisplay.spec.mjs:24` test: retain selection works
- `../lexical/packages/lexical-playground/__tests__/e2e/SelectionAlwaysOnDisplay.spec.mjs:25` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/SelectionAlwaysOnDisplay.spec.mjs:62` test: retain selection works with reverse selection
- `../lexical/packages/lexical-playground/__tests__/e2e/SelectionAlwaysOnDisplay.spec.mjs:67` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/SpecialTexts.spec.mjs`

category: portable-mixed
family: mixed portable invariant
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/e2e/SpecialTexts.spec.mjs:18` test: Special Text
- `../lexical/packages/lexical-playground/__tests__/e2e/SpecialTexts.spec.mjs:27` test: should handle a single special text
- `../lexical/packages/lexical-playground/__tests__/e2e/SpecialTexts.spec.mjs:45` test: should handle multiple special texts
- `../lexical/packages/lexical-playground/__tests__/e2e/SpecialTexts.spec.mjs:69` test: should not work when the option to use brackets for highlighting is disabled

## `../lexical/packages/lexical-playground/__tests__/e2e/Tab.spec.mjs`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/e2e/Tab.spec.mjs:20` test: Tab
- `../lexical/packages/lexical-playground/__tests__/e2e/Tab.spec.mjs:22` test: can tab + IME
- `../lexical/packages/lexical-playground/__tests__/e2e/Tab.spec.mjs:27` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tab.spec.mjs:94` test: can tab inside code block #4399
- `../lexical/packages/lexical-playground/__tests__/e2e/Tab.spec.mjs:95` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tab.spec.mjs:124` test: can go to start of line after a tab character
- `../lexical/packages/lexical-playground/__tests__/e2e/Tab.spec.mjs:128` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs`

category: portable
family: tables-grid / selection-dom-mapping
target: .tmp/slate-v2/playwright/stress/generated-editing.test.ts; .tmp/slate-v2/playwright/integration/examples/tables.test.ts; .tmp/slate-v2/packages/slate/test/transforms/insertFragment

- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:92` describe: Tables
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:93` test: Can a table be inserted from the toolbar
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:98` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:137` test: Can type inside of table cell
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:142` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:185` test: Can exit the first cell of a table
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:190` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:231` test: Can exit the last cell of a table
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:236` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:276` test: Can exit the first cell of a nested table into the parent table cell
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:281` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:304` test: Can exit the last cell of a nested table into the parent table cell
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:309` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:334` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:340` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:441` test: Can type text after a table that is the last node
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:447` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:499` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:505` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:593` test: Can enter a table from a paragraph underneath via the left arrow key
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:598` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:621` describe: Can navigate table with keyboard
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:622` test: Can navigate cells horizontally
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:627` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:721` test: Can navigate cells vertically
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:726` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:756` test: Should not navigate cells when typeahead menu is open and focused
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:761` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:795` test: Can select cells using Table selection
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:801` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:857` test: Can select cells using Table selection via keyboard
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:863` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:941` test: Can style text using Table selection
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:947` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1008` test: Can style on empty table cells and paragraphs with no text
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1013` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1071` test: Align selection style for table cells
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1076` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1143` test: Can copy + paste (internal) using Table selection
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1149` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1238` test: Can clear text using Table selection
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1244` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1303` test: Range Selection is corrected when it contains a partial Table.
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1308` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1344` test: Select All when document contains tables adds custom table styles.
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1349` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1399` test: Can delete all with node selection
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1404` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1423` test: Can delete all with range selection anchored in table
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1428` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1464` test: Horizontal rule inside cell
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1465` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1500` test: Table selection: can select multiple cells and insert a decorator
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1506` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1564` test: Table selection: can backspace lines, backspacing empty cell does not destroy it #3278
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1569` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1642` test: Can remove new lines in a collapsible section inside of a table
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1648` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1747` test: Resize merged cells width (1)
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1753` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1757` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1834` test: Resize merged cells width (2)
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1840` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1918` test: Resize merged cells height
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1924` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:1925` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:2013` test: Merge/unmerge cells (1)
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:2014` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:2105` test: Merge/unmerge cells (2)
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:2106` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:2241` test: Merge/unmerge with already merged cells
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:2247` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:2556` test: Merged cell tab navigation forward
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:2561` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:2562` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:2702` test: Merged cell tab navigation reverse
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:2707` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:2708` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:2850` test: Merge with content
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:2851` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:2939` test: Select multiple merged cells (selection expands to a rectangle)
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:2945` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:3077` test: Merge multiple merged cells and then unmerge
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:3083` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:3222` test: Insert row above (with conflicting merged cell)
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:3227` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:3290` test: Insert column before (with conflicting merged cell)
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:3295` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:3356` test: Insert column before (with selected cell with rowspan > 1)
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:3361` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:3416` test: Insert column before (with 1+ selected cells in a row)
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:3421` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:3493` test: Delete rows (with conflicting merged cell)
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:3499` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:3561` test: Delete selected rows (with merged cell overflowing selection from top and bottom)
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:3566` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:3752` test: Delete selected rows (with merged cell overflowing selection from the top)
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:3757` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:3947` test: Delete selected rows (with merged cell overflowing selection from the bottom)
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:3952` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:4142` test: Delete columns (with conflicting merged cell)
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:4147` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:4208` test: Delete columns backward
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:4214` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:4263` test: Delete columns forward at end of table
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:4268` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:4316` test: Deselect when click outside #3785 #4138
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:4321` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:4345` test: Background color to cell
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:4346` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:4382` test: Cell merge feature disabled
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:4383` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:4479` test: Cell background color feature disabled
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:4484` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:4521` test: Add column header after merging cells #4378
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:4526` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:4622` test: Can align text using Table selection
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:4628` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:4702` test: Paste and insert new lines after unmerging cells
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:4707` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:4875` test: Can delete table row when previous cell is a merged cell
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:4880` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:5100` test: Can delete table row when siblings are merged cell
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:5105` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:5318` test: Can insert multiple rows above the selection
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:5324` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:5325` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:5521` test: Can insert multiple rows below the selection
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:5527` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:5528` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:5723` test: with context menu
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:5725` test: Can select cells using Table selection and cut them with the context menu
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:5732` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:5735` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:5841` test: Cannot insert nested tables
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:5842` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:5889` test: Cannot paste tables inside table cells
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:5894` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:5948` test: Can paste tables inside table cells (with hasNestedTables)
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:5953` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:6031` test: Can paste and autofit tables inside table cells (with hasNestedTables, hasFitNestedTables)
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:6036` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:6037` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:6128` test: Click and drag to create selection in Firefox #7245
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:6133` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:6522` test: Resize row with merged cells spanning multiple rows
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:6528` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:6529` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:6619` test: Table action menu is hidden when cell overflows
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:6627` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:6628` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:6665` test: Can expand table to fit content when pasting table into table
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:6670` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:6904` test: Can paste table containing merged cells into table
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:6909` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7127` test: Can paste table into table while having table selection
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7132` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7227` test: Can delete table when fully selected with merged cells
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7232` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7233` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7273` test: Ctrl+A selects all cells in table with merged cells when table is only content
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7279` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7333` test: Drag-select column in 2x2 table selects all cells in that column
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7338` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7514` test: Can clear table selection in table by selecting cell in another table
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7519` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7573` test: Table selection is properly cleared when clicking and dragging a cell in the same table
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7578` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7638` test: shift-selection tests
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7639` test: Range-select from above table into it selects the entire table
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7644` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7676` test: Range-select from below table into it selects the entire table
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7681` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7711` test: Range-select from inside table to text above it selects the entire table
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7716` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7747` test: Range-select from inside table to text below it selects the entire table
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7752` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7782` test: nested table shift-selection tests
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7800` test: Range-select from above nested table into it selects the entire table, but not the outer table
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7806` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7807` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7808` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7837` test: Range-select from below nested table into it selects the entire table, but not the outer table
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7843` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7844` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7867` test: Range-select from inside nested table to text above it selects the entire table, but not the outer table
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7873` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7874` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7875` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7901` test: Range-select from inside nested table to text below it selects the entire table, but not the outer table
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7907` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7908` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Tables.spec.mjs:7909` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/TextEntry.spec.mjs`

category: portable
family: beforeinput-input / browser-engine
target: .tmp/slate-v2/packages/slate-react/test/model-input-strategy-contract.test.ts; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/TextEntry.spec.mjs:27` test: TextEntry
- `../lexical/packages/lexical-playground/__tests__/e2e/TextEntry.spec.mjs:29` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/TextEntry.spec.mjs:49` test: Can insert text and replace it
- `../lexical/packages/lexical-playground/__tests__/e2e/TextEntry.spec.mjs:50` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/TextEntry.spec.mjs:69` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/TextEntry.spec.mjs:73` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/TextEntry.spec.mjs:113` test: Can insert a paragraph between two text nodes
- `../lexical/packages/lexical-playground/__tests__/e2e/TextEntry.spec.mjs:117` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/TextEntry.spec.mjs:146` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/TextEntry.spec.mjs:174` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/TextEntry.spec.mjs:202` test: Paragraphed text entry and selection
- `../lexical/packages/lexical-playground/__tests__/e2e/TextEntry.spec.mjs:273` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/TextEntry.spec.mjs:301` test: Can type characters, and select and replace a part
- `../lexical/packages/lexical-playground/__tests__/e2e/TextEntry.spec.mjs:353` test: Can select and delete a word
- `../lexical/packages/lexical-playground/__tests__/e2e/TextEntry.spec.mjs:395` test: First paragraph backspace handling
- `../lexical/packages/lexical-playground/__tests__/e2e/TextEntry.spec.mjs:476` test: Mix of paragraphs and break points
- `../lexical/packages/lexical-playground/__tests__/e2e/TextEntry.spec.mjs:600` test: Empty paragraph and new line node selection

## `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs`

category: portable
family: serialization-parsing / marks-inline
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-history/test; .tmp/slate-v2/playwright/integration/examples/richtext.test.ts

- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:37` describe: TextFormatting
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:39` test: Can create bold text using the shortcut
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:43` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:93` test: Can create italic text using the shortcut
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:97` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:147` test: Can select text and boldify it with the shortcut
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:151` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:203` test: Should not format the text in the subsequent paragraph after a triple click selection event.
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:207` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:245` test: Can select text and italicify it with the shortcut
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:249` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:301` test: Can select text and underline+strikethrough
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:305` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:424` test: Can select text and change it to ${format}
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:428` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:500` test: Pressing ${key} resets ${format} format
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:504` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:532` test: Can select text and increase the font-size
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:536` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:571` test: Can select text with different size and increase the font-size relatively
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:575` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:596` test: Can select text and decrease the font-size
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:600` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:635` test: Can select text with different size and decrease the font-size relatively
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:639` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:660` test: Can select text and change the font-size and font-family
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:664` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:749` test: Can select text and update font size by entering the value
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:753` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:790` test: Can select text with different size and update font size by entering the value
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:794` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:817` test: Can select multiple text parts and format them with shortcuts
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:822` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:996` test: Can insert range of formatted text and select part and replace with character
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:1000` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:1093` test: Regression #2439: can format backwards when at first text node boundary
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:1097` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:1144` test: The active state of the button in the toolbar should to be displayed correctly
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:1148` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:1182` test: Regression #2523: can toggle format when selecting a TextNode edge followed by a non TextNode;
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:1186` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:1240` test: Multiline selection format ignores new lines
- `../lexical/packages/lexical-playground/__tests__/e2e/TextFormatting.spec.mjs:1245` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/e2e/Toolbar.spec.mjs`

category: portable-mixed
family: mixed portable invariant
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/e2e/Toolbar.spec.mjs:33` test: Toolbar
- `../lexical/packages/lexical-playground/__tests__/e2e/Toolbar.spec.mjs:43` test: Insert image caption + table
- `../lexical/packages/lexical-playground/__tests__/e2e/Toolbar.spec.mjs:50` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Toolbar.spec.mjs:271` test: Center align image
- `../lexical/packages/lexical-playground/__tests__/e2e/Toolbar.spec.mjs:273` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Toolbar.spec.mjs:351` test: When we select three textNodes with different formatting at the same time, the selection formatting should show no formatting at all
- `../lexical/packages/lexical-playground/__tests__/e2e/Toolbar.spec.mjs:356` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/e2e/Toolbar.spec.mjs:373` test: Selecting empty paragraphs has empty selection format
- `../lexical/packages/lexical-playground/__tests__/e2e/Toolbar.spec.mjs:378` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/regression/1055-fast-typing-undo.spec.mjs`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/regression/1055-fast-typing-undo.spec.mjs:18` test: Regression test #1055
- `../lexical/packages/lexical-playground/__tests__/regression/1055-fast-typing-undo.spec.mjs:20` test: Adds new editor state into undo stack right after undo was done
- `../lexical/packages/lexical-playground/__tests__/regression/1055-fast-typing-undo.spec.mjs:24` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/regression/1083-backspace-with-element-at-front.spec.mjs`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/regression/1083-backspace-with-element-at-front.spec.mjs:23` test: Regression test #1083
- `../lexical/packages/lexical-playground/__tests__/regression/1083-backspace-with-element-at-front.spec.mjs:25` test: Backspace with ElementNode at the front of the paragraph
- `../lexical/packages/lexical-playground/__tests__/regression/1083-backspace-with-element-at-front.spec.mjs:29` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/regression/1083-backspace-with-element-at-front.spec.mjs:66` test: Backspace with ElementNode at the front of the selection
- `../lexical/packages/lexical-playground/__tests__/regression/1083-backspace-with-element-at-front.spec.mjs:70` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/regression/1113-link-newline-at-end.spec.mjs`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/regression/1113-link-newline-at-end.spec.mjs:18` test: Regression test #1113
- `../lexical/packages/lexical-playground/__tests__/regression/1113-link-newline-at-end.spec.mjs:20` test: Selects new line when inserting a new line at the end of a link
- `../lexical/packages/lexical-playground/__tests__/regression/1113-link-newline-at-end.spec.mjs:24` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/regression/1258-delete-forward.spec.mjs`

category: portable
family: selection-dom-mapping / void-atom
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-react/test/editable-behavior.test.tsx; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/regression/1258-delete-forward.spec.mjs:22` test: Regression test #1258
- `../lexical/packages/lexical-playground/__tests__/regression/1258-delete-forward.spec.mjs:24` test: Can delete forward with keyboard

## `../lexical/packages/lexical-playground/__tests__/regression/1384-insert-nodes.spec.mjs`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/regression/1384-insert-nodes.spec.mjs:21` test: Regression test #1384
- `../lexical/packages/lexical-playground/__tests__/regression/1384-insert-nodes.spec.mjs:23` test: Properly pastes in code blocks
- `../lexical/packages/lexical-playground/__tests__/regression/1384-insert-nodes.spec.mjs:28` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/regression/1730-delete-backword.spec.mjs`

category: portable
family: selection-dom-mapping / void-atom
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-react/test/editable-behavior.test.tsx; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/regression/1730-delete-backword.spec.mjs:19` test: Regression test #1730
- `../lexical/packages/lexical-playground/__tests__/regression/1730-delete-backword.spec.mjs:21` test: Can delete backward with keyboard

## `../lexical/packages/lexical-playground/__tests__/regression/221-editing-hashtags.spec.mjs`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/regression/221-editing-hashtags.spec.mjs:20` test: Regression test #221
- `../lexical/packages/lexical-playground/__tests__/regression/221-editing-hashtags.spec.mjs:22` test: Can handle space in hashtag
- `../lexical/packages/lexical-playground/__tests__/regression/221-editing-hashtags.spec.mjs:64` test: Can handle delete in hashtag
- `../lexical/packages/lexical-playground/__tests__/regression/221-editing-hashtags.spec.mjs:106` test: Can handle backspace into hashtag

## `../lexical/packages/lexical-playground/__tests__/regression/230-navigation-around-hashtags.spec.mjs`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/regression/230-navigation-around-hashtags.spec.mjs:20` test: Regression test #230
- `../lexical/packages/lexical-playground/__tests__/regression/230-navigation-around-hashtags.spec.mjs:22` test: Is able to right arrow before hashtag after inserting text node

## `../lexical/packages/lexical-playground/__tests__/regression/231-empty-text-nodes.spec.mjs`

category: portable
family: core package behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/regression/231-empty-text-nodes.spec.mjs:24` test: Regression test #231
- `../lexical/packages/lexical-playground/__tests__/regression/231-empty-text-nodes.spec.mjs:26` test: Does not generate segment error when editing empty text nodes

## `../lexical/packages/lexical-playground/__tests__/regression/3136-insert-nodes-adjacent-to-inline.spec.mjs`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/regression/3136-insert-nodes-adjacent-to-inline.spec.mjs:24` test: Regression test #3136
- `../lexical/packages/lexical-playground/__tests__/regression/3136-insert-nodes-adjacent-to-inline.spec.mjs:26` test: Correctly pastes rich content when the selection is followed by an inline element
- `../lexical/packages/lexical-playground/__tests__/regression/3136-insert-nodes-adjacent-to-inline.spec.mjs:30` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/regression/3136-insert-nodes-adjacent-to-inline.spec.mjs:47` it: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/regression/3136-insert-nodes-adjacent-to-inline.spec.mjs:67` test: Correctly pastes rich content when the selection is preceded by an inline element
- `../lexical/packages/lexical-playground/__tests__/regression/3136-insert-nodes-adjacent-to-inline.spec.mjs:71` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/regression/3136-insert-nodes-adjacent-to-inline.spec.mjs:89` it: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/regression/3433-merge-markdown-lists.spec.mjs`

category: portable
family: core package behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/regression/3433-merge-markdown-lists.spec.mjs:17` test: Regression test #3433
- `../lexical/packages/lexical-playground/__tests__/regression/3433-merge-markdown-lists.spec.mjs:19` test: can merge markdown lists created immediately before existing lists
- `../lexical/packages/lexical-playground/__tests__/regression/3433-merge-markdown-lists.spec.mjs:23` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/regression/379-backspace-with-mentions.spec.mjs`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/regression/379-backspace-with-mentions.spec.mjs:20` test: Regression test #379
- `../lexical/packages/lexical-playground/__tests__/regression/379-backspace-with-mentions.spec.mjs:22` test: Is able to correctly handle backspace press at the line boundary

## `../lexical/packages/lexical-playground/__tests__/regression/399-open-line.spec.mjs`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/regression/399-open-line.spec.mjs:20` test: Regression test #399
- `../lexical/packages/lexical-playground/__tests__/regression/399-open-line.spec.mjs:22` test: Supports Ctrl-O as an open line command

## `../lexical/packages/lexical-playground/__tests__/regression/429-swapping-emoji.spec.mjs`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/regression/429-swapping-emoji.spec.mjs:19` test: Regression test #429
- `../lexical/packages/lexical-playground/__tests__/regression/429-swapping-emoji.spec.mjs:21` test: Can add new lines before the line with emoji

## `../lexical/packages/lexical-playground/__tests__/regression/4661-insert-column-selection.spec.mjs`

category: portable
family: core package behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/regression/4661-insert-column-selection.spec.mjs:22` test: Regression test #4661
- `../lexical/packages/lexical-playground/__tests__/regression/4661-insert-column-selection.spec.mjs:26` test: inserting 2 columns before inserts before selection
- `../lexical/packages/lexical-playground/__tests__/regression/4661-insert-column-selection.spec.mjs:31` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/regression/4661-insert-column-selection.spec.mjs:98` test: inserting 2 columns after inserts after selection
- `../lexical/packages/lexical-playground/__tests__/regression/4661-insert-column-selection.spec.mjs:103` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/regression/4697-repeated-table-selection.spec.mjs`

category: portable
family: core package behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/regression/4697-repeated-table-selection.spec.mjs:19` test: Regression test #4697
- `../lexical/packages/lexical-playground/__tests__/regression/4697-repeated-table-selection.spec.mjs:21` test: repeated table selection results in table selection
- `../lexical/packages/lexical-playground/__tests__/regression/4697-repeated-table-selection.spec.mjs:27` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/regression/4872-full-row-span-cell-merge.spec.mjs`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/regression/4872-full-row-span-cell-merge.spec.mjs:19` test: Regression test #4872
- `../lexical/packages/lexical-playground/__tests__/regression/4872-full-row-span-cell-merge.spec.mjs:21` test: merging two full rows does not break table selection
- `../lexical/packages/lexical-playground/__tests__/regression/4872-full-row-span-cell-merge.spec.mjs:27` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/regression/4876-unmerge-cell.spec.mjs`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/regression/4876-unmerge-cell.spec.mjs:21` test: Regression test #4876
- `../lexical/packages/lexical-playground/__tests__/regression/4876-unmerge-cell.spec.mjs:23` test: unmerging cells should add cells to correct rows
- `../lexical/packages/lexical-playground/__tests__/regression/4876-unmerge-cell.spec.mjs:28` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/regression/5251-paste-into-inline-element.spec.mjs`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/regression/5251-paste-into-inline-element.spec.mjs:29` test: Regression test #5251
- `../lexical/packages/lexical-playground/__tests__/regression/5251-paste-into-inline-element.spec.mjs:31` test: Correctly pastes rich content inside an inline element
- `../lexical/packages/lexical-playground/__tests__/regression/5251-paste-into-inline-element.spec.mjs:35` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/regression/5583-select-list-followed-by-element-node.spec.mjs`

category: portable
family: core package behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/regression/5583-select-list-followed-by-element-node.spec.mjs:25` test: Regression test #5251
- `../lexical/packages/lexical-playground/__tests__/regression/5583-select-list-followed-by-element-node.spec.mjs:27` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/regression/5583-select-list-followed-by-element-node.spec.mjs:31` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/regression/6870-table-left-arrow-selection.spec.mjs`

category: portable
family: tables-grid / selection-dom-mapping
target: .tmp/slate-v2/playwright/stress/generated-editing.test.ts; .tmp/slate-v2/playwright/integration/examples/tables.test.ts; .tmp/slate-v2/packages/slate/test/transforms/insertFragment

- `../lexical/packages/lexical-playground/__tests__/regression/6870-table-left-arrow-selection.spec.mjs:22` test: Regression test #6870
- `../lexical/packages/lexical-playground/__tests__/regression/6870-table-left-arrow-selection.spec.mjs:24` test: left arrow moves selection around decorators near tables
- `../lexical/packages/lexical-playground/__tests__/regression/6870-table-left-arrow-selection.spec.mjs:29` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/regression/6870-table-left-arrow-selection.spec.mjs:30` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/regression/6870-table-left-arrow-selection.spec.mjs:66` test: left arrow expands selection around decorators near tables
- `../lexical/packages/lexical-playground/__tests__/regression/6870-table-left-arrow-selection.spec.mjs:71` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/regression/6870-table-left-arrow-selection.spec.mjs:72` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/regression/6974-delete-character-backward.spec.mjs`

category: portable
family: selection-dom-mapping / void-atom
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-react/test/editable-behavior.test.tsx; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/regression/6974-delete-character-backward.spec.mjs:21` test: Regression tests for #6974
- `../lexical/packages/lexical-playground/__tests__/regression/6974-delete-character-backward.spec.mjs:26` test: deleteCharacter merges children from adjacent blocks even if the previous leaf is an inline decorator
- `../lexical/packages/lexical-playground/__tests__/regression/6974-delete-character-backward.spec.mjs:31` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/regression/7163-graphemes.spec.mjs`

category: portable
family: selection-dom-mapping / void-atom
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-react/test/editable-behavior.test.tsx; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/regression/7163-graphemes.spec.mjs:21` test: Grapheme deleteCharacter
- `../lexical/packages/lexical-playground/__tests__/regression/7163-graphemes.spec.mjs:133` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/regression/7163-graphemes.spec.mjs:135` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/regression/7246-delete-character-backward-list.spec.mjs`

category: portable
family: selection-dom-mapping / void-atom
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-react/test/editable-behavior.test.tsx; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/regression/7246-delete-character-backward-list.spec.mjs:21` test: Regression tests for #7246
- `../lexical/packages/lexical-playground/__tests__/regression/7246-delete-character-backward-list.spec.mjs:26` test: deleteCharacter merges children from block adjacent to ListNode
- `../lexical/packages/lexical-playground/__tests__/regression/7246-delete-character-backward-list.spec.mjs:31` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/regression/7266-column-header-merged-cells.spec.mjs`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/regression/7266-column-header-merged-cells.spec.mjs:22` test: Regression test #7266
- `../lexical/packages/lexical-playground/__tests__/regression/7266-column-header-merged-cells.spec.mjs:25` test: toggling column header with merged column cells should only apply column header to the selected column
- `../lexical/packages/lexical-playground/__tests__/regression/7266-column-header-merged-cells.spec.mjs:30` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/regression/7266-column-header-merged-cells.spec.mjs:136` test: toggling row header with merged row cells should only apply row header to the selected row
- `../lexical/packages/lexical-playground/__tests__/regression/7266-column-header-merged-cells.spec.mjs:141` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/regression/7319-delete-character-backward-nodeselection.spec.mjs`

category: portable
family: selection-dom-mapping / void-atom
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-react/test/editable-behavior.test.tsx; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/regression/7319-delete-character-backward-nodeselection.spec.mjs:19` test: Regression tests for #7319
- `../lexical/packages/lexical-playground/__tests__/regression/7319-delete-character-backward-nodeselection.spec.mjs:24` test: deleteCharacter after hr with RangeSelection
- `../lexical/packages/lexical-playground/__tests__/regression/7319-delete-character-backward-nodeselection.spec.mjs:29` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/regression/7319-delete-character-backward-nodeselection.spec.mjs:62` test: deleteCharacter after hr with NodeSelection
- `../lexical/packages/lexical-playground/__tests__/regression/7319-delete-character-backward-nodeselection.spec.mjs:67` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/regression/7354-firefox-decorator-paste.spec.mjs`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/regression/7354-firefox-decorator-paste.spec.mjs:23` test: HTML CopyAndPaste
- `../lexical/packages/lexical-playground/__tests__/regression/7354-firefox-decorator-paste.spec.mjs:26` test: Copy + paste multi line html with extra newlines
- `../lexical/packages/lexical-playground/__tests__/regression/7354-firefox-decorator-paste.spec.mjs:31` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/regression/7635-SELECTION_INSERT_CLIPBOARD_NODES_COMMAND.spec.mjs`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-playground/__tests__/regression/7635-SELECTION_INSERT_CLIPBOARD_NODES_COMMAND.spec.mjs:34` test: Regression #7635
- `../lexical/packages/lexical-playground/__tests__/regression/7635-SELECTION_INSERT_CLIPBOARD_NODES_COMMAND.spec.mjs:39` test: Paste into image caption
- `../lexical/packages/lexical-playground/__tests__/regression/7635-SELECTION_INSERT_CLIPBOARD_NODES_COMMAND.spec.mjs:40` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/regression/8153-safari-ime-delete-selection.spec.mjs`

category: portable
family: ime-composition / history-undo-redo
target: .tmp/slate-v2/playwright/stress/generated-editing.test.ts; .tmp/slate-v2/packages/slate-browser/src/playwright/ime.ts; .tmp/slate-v2/packages/slate-history/test

- `../lexical/packages/lexical-playground/__tests__/regression/8153-safari-ime-delete-selection.spec.mjs:36` test: Regression #8153
- `../lexical/packages/lexical-playground/__tests__/regression/8153-safari-ime-delete-selection.spec.mjs:39` test: Can delete all text selected with Cmd+A after IME composition end on Safari
- `../lexical/packages/lexical-playground/__tests__/regression/8153-safari-ime-delete-selection.spec.mjs:45` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/regression/8153-safari-ime-delete-selection.spec.mjs:46` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/regression/8153-safari-ime-delete-selection.spec.mjs:47` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/regression/8153-safari-ime-delete-selection.spec.mjs:73` test: Can delete multi-paragraph selection with Shift+ArrowUp after IME composition end on Safari
- `../lexical/packages/lexical-playground/__tests__/regression/8153-safari-ime-delete-selection.spec.mjs:79` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/regression/8153-safari-ime-delete-selection.spec.mjs:80` test: dynamic or multiline title
- `../lexical/packages/lexical-playground/__tests__/regression/8153-safari-ime-delete-selection.spec.mjs:81` test: dynamic or multiline title

## `../lexical/packages/lexical-playground/__tests__/unit/ImageHTML.test.ts`

category: portable-mixed
family: clipboard-paste / browser-engine
target: .tmp/slate-v2/packages/slate/test/clipboard-contract.ts; .tmp/slate-v2/packages/slate-dom/test/clipboard-boundary.test.ts; .tmp/slate-v2/playwright/integration/examples/paste-html.test.ts; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-playground/__tests__/unit/ImageHTML.test.ts:26` describe: ImageNode HTML serialization
- `../lexical/packages/lexical-playground/__tests__/unit/ImageHTML.test.ts:27` describe: ImageNode export
- `../lexical/packages/lexical-playground/__tests__/unit/ImageHTML.test.ts:28` it: with no caption
- `../lexical/packages/lexical-playground/__tests__/unit/ImageHTML.test.ts:54` it: with plain text caption

## `../lexical/packages/lexical-rich-text/src/__tests__/unit/LexicalHeadingNode.test.ts`

category: portable
family: core package behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-rich-text/src/__tests__/unit/LexicalHeadingNode.test.ts:38` describe: LexicalHeadingNode tests
- `../lexical/packages/lexical-rich-text/src/__tests__/unit/LexicalHeadingNode.test.ts:40` test: HeadingNode.constructor
- `../lexical/packages/lexical-rich-text/src/__tests__/unit/LexicalHeadingNode.test.ts:51` test: HeadingNode.createDOM()
- `../lexical/packages/lexical-rich-text/src/__tests__/unit/LexicalHeadingNode.test.ts:75` test: HeadingNode.updateDOM()
- `../lexical/packages/lexical-rich-text/src/__tests__/unit/LexicalHeadingNode.test.ts:101` test: HeadingNode.insertNewAfter() empty
- `../lexical/packages/lexical-rich-text/src/__tests__/unit/LexicalHeadingNode.test.ts:123` test: HeadingNode.insertNewAfter() middle
- `../lexical/packages/lexical-rich-text/src/__tests__/unit/LexicalHeadingNode.test.ts:147` test: HeadingNode.insertNewAfter() end
- `../lexical/packages/lexical-rich-text/src/__tests__/unit/LexicalHeadingNode.test.ts:173` test: HeadingNode.setTag()
- `../lexical/packages/lexical-rich-text/src/__tests__/unit/LexicalHeadingNode.test.ts:200` test: $createHeadingNode()
- `../lexical/packages/lexical-rich-text/src/__tests__/unit/LexicalHeadingNode.test.ts:211` test: $isHeadingNode()
- `../lexical/packages/lexical-rich-text/src/__tests__/unit/LexicalHeadingNode.test.ts:219` test: creates a h2 with text and can insert a new paragraph after

## `../lexical/packages/lexical-rich-text/src/__tests__/unit/LexicalQuoteNode.test.ts`

category: portable
family: core package behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-rich-text/src/__tests__/unit/LexicalQuoteNode.test.ts:21` describe: LexicalQuoteNode tests
- `../lexical/packages/lexical-rich-text/src/__tests__/unit/LexicalQuoteNode.test.ts:23` test: QuoteNode.constructor
- `../lexical/packages/lexical-rich-text/src/__tests__/unit/LexicalQuoteNode.test.ts:33` test: QuoteNode.createDOM()
- `../lexical/packages/lexical-rich-text/src/__tests__/unit/LexicalQuoteNode.test.ts:49` test: QuoteNode.updateDOM()
- `../lexical/packages/lexical-rich-text/src/__tests__/unit/LexicalQuoteNode.test.ts:66` test: QuoteNode.insertNewAfter()
- `../lexical/packages/lexical-rich-text/src/__tests__/unit/LexicalQuoteNode.test.ts:87` test: $createQuoteNode()

## `../lexical/packages/lexical-rich-text/src/__tests__/unit/LexicalTabNode.test.ts`

category: portable
family: clipboard-paste / browser-engine
target: .tmp/slate-v2/packages/slate/test/clipboard-contract.ts; .tmp/slate-v2/packages/slate-dom/test/clipboard-boundary.test.ts; .tmp/slate-v2/playwright/integration/examples/paste-html.test.ts; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-rich-text/src/__tests__/unit/LexicalTabNode.test.ts:23` describe: LexicalTabNode tests
- `../lexical/packages/lexical-rich-text/src/__tests__/unit/LexicalTabNode.test.ts:25` test: INSERT_TAB_COMMAND applies selection format and style to TabNode
- `../lexical/packages/lexical-rich-text/src/__tests__/unit/LexicalTabNode.test.ts:58` test: format preserved when typing between tabs inserted in bold text

## `../lexical/packages/lexical-selection/src/__tests__/unit/$sliceSelectedTextNodeContent.test.ts`

category: portable
family: core package behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-selection/src/__tests__/unit/$sliceSelectedTextNodeContent.test.ts:21` describe: $sliceSelectedTextNodeContent
- `../lexical/packages/lexical-selection/src/__tests__/unit/$sliceSelectedTextNodeContent.test.ts:55` describe: clone
- `../lexical/packages/lexical-selection/src/__tests__/unit/$sliceSelectedTextNodeContent.test.ts:56` test: does not clone with full selection (both nodes)
- `../lexical/packages/lexical-selection/src/__tests__/unit/$sliceSelectedTextNodeContent.test.ts:72` test: clones only with partial selection (last node)
- `../lexical/packages/lexical-selection/src/__tests__/unit/$sliceSelectedTextNodeContent.test.ts:95` test: clones only with partial selection (first node)
- `../lexical/packages/lexical-selection/src/__tests__/unit/$sliceSelectedTextNodeContent.test.ts:116` test: can slice a node from both sides

## `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx`

category: portable
family: selection-dom-mapping / void-atom
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-react/test/editable-behavior.test.tsx; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:125` describe: LexicalSelection tests
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:228` test: Expect initial output to be a block with no text.
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:234` test: Bold format preserved when typing between consecutive line breaks
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:294` test: dynamic or multiline title
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:1295` test: dynamic or multiline title
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:1309` test: insert text one selected node element selection
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:1333` test: getNodes resolves nested block nodes
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:1355` describe: Block selection moves when new nodes are inserted
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:1958` describe: Selection correctly resolves to a sibling ElementNode when a node is removed
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:1959` test: dynamic or multiline title
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:1988` describe: Selection correctly resolves to a sibling ElementNode when a selected node child is removed
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:1989` test: dynamic or multiline title
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:2023` describe: Selection correctly resolves to a sibling ElementNode that has multiple children with the correct offset when a node is removed
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:2024` test: dynamic or multiline title
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:2075` test: isBackward
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:2119` describe: Decorator text content for selection
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:2200` it: dynamic or multiline title
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:2234` describe: insertParagraph
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:2235` test: three text nodes at offset 0 on third node
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:2280` test: four text nodes at offset 0 on third node
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:2328` it: adjust offset for inline elements text formatting
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:2373` describe: Node.replace
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:2428` test: dynamic or multiline title
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:2447` describe: Testing that $getStyleObjectFromRawCSS handles unformatted css text
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:2448` test: dynamic or multiline title
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:2503` describe: Testing that getStyleObjectFromRawCSS handles values with colons
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:2504` test: dynamic or multiline title
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:2559` describe: $patchStyle
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:2560` it: should patch the style with the new style object
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:2610` it: should patch the style with property function
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:2666` describe: $setBlocksType
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:2667` test: Collapsed selection in text
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:2706` test: Collapsed selection in element
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:2741` test: Two elements, same top-element
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:2780` test: Two empty elements, same top-element
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:2821` test: Two elements, same top-element
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:2860` test: Collapsed in element inside top-element
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:2904` test: Collapsed in text inside top-element
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:2948` test: Full editor selection with a mix of top-elements
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:3012` test: Paragraph with links to heading with links
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:3060` test: Nested list
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelection.test.tsx:3103` test: Nested list with listItem twice indented from its parent

## `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts`

category: portable
family: selection-dom-mapping / void-atom
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-react/test/editable-behavior.test.tsx; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:90` describe: LexicalSelectionHelpers tests
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:91` describe: Collapsed
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:92` test: Can handle a text point
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:267` test: Has correct text point after removal after merge
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:348` test: Has correct text point after removal after merge (2)
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:424` test: Has correct text point adjust to element point after removal of a single empty text node
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:485` test: Has correct element point after removal of an empty text node in a group #1
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:551` test: Has correct element point after removal of an empty text node in a group #2
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:627` test: Has correct text point after removal of an empty text node in a group #3
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:703` test: Can handle an element point on empty element
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:840` test: Can handle a start element point
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:993` test: Can handle an end element point
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:1146` test: Has correct element point after merge from middle
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:1217` test: Has correct element point after merge from end
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:1289` describe: Simple range
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:1290` test: Can handle multiple text points
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:1467` test: Can handle multiple element points
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:1624` test: Can handle a mix of text and element points
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:1794` describe: can insert non-element nodes correctly
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:1795` describe: with an empty paragraph node selected
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:1796` test: a single text node
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:1835` test: two text nodes
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:1876` test: link insertion without parent element
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:1921` test: a single heading node with a child text node
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:1965` describe: with a paragraph node selected on some existing text
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:1966` test: a single text node
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2007` test: two text nodes
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2052` test: a single heading node with a child text node
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2099` test: a paragraph with a child text and a child italic text and a child text
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2171` describe: with a fully-selected text node
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2172` test: a single text node
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2214` describe: with a fully-selected text node followed by an inline element
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2215` test: a single text node
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2261` describe: with a fully-selected text node preceded by an inline element
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2262` test: a single text node
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2308` test: can insert a linebreak node before an inline element node
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2333` describe: can insert block element nodes correctly
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2334` describe: with a fully-selected text node
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2335` test: a paragraph node
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2380` describe: with a fully-selected text node followed by an inline element
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2381` test: a paragraph node
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2430` describe: with a fully-selected text node preceded by an inline element
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2431` test: a paragraph node
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2480` test: Can insert link into empty paragraph
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2499` test: Can insert link into empty paragraph (2)
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2519` test: Can insert an ElementNode after ShadowRoot
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2541` describe: extract
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2542` test: Should return the selected node when collapsed on a TextNode
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2578` describe: insertNodes
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2583` it: can insert element next to top level decorator node
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2614` it: can insert when previous selection was null
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2643` it: can insert when before empty text node
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2663` it: last node is LineBreakNode
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2691` describe: $patchStyleText
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2692` test: can patch a selection anchored to the end of a TextNode before an inline element
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2748` test: can patch a selection anchored to the end of a TextNode at the end of a paragraph
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2798` test: can patch a selection that ends on an element
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2851` test: can patch a reversed selection that ends on an element
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2904` test: can patch a selection that starts and ends on an element
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2946` test: can clear a style
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:2984` test: can toggle a style on a collapsed selection
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:3033` test: updates cached styles when setting on a collapsed selection
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:3082` test: $getSelectionStyleValueForProperty returns consistent value regardless of selection direction
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:3141` test: $getSelectionStyleValueForProperty ignores nodes with zero characters selected at boundaries
- `../lexical/packages/lexical-selection/src/__tests__/unit/LexicalSelectionHelpers.test.ts:3232` test: preserve backward selection when changing style of 2 different text nodes

## `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableCellNode.test.ts`

category: portable
family: tables-grid / selection-dom-mapping
target: .tmp/slate-v2/playwright/stress/generated-editing.test.ts; .tmp/slate-v2/playwright/integration/examples/tables.test.ts; .tmp/slate-v2/packages/slate/test/transforms/insertFragment

- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableCellNode.test.ts:32` describe: LexicalTableCellNode tests
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableCellNode.test.ts:34` test: TableCellNode.constructor
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableCellNode.test.ts:48` test: TableCellNode.createDOM()
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableCellNode.test.ts:103` test: TableCellNode.importDOM
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableCellNode.test.ts:255` test: dynamic or multiline title
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableCellNode.test.ts:270` test: dynamic or multiline title
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableCellNode.test.ts:285` test: DOM Conversion: <th> without scope defaults to ROW header
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableCellNode.test.ts:304` test: DOM Conversion: <th> in first row without scope becomes ROW header
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableCellNode.test.ts:324` test: DOM Conversion: <th> in first column of non-first row becomes COLUMN header
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableCellNode.test.ts:350` test: DOM Conversion: <th> in thead without scope becomes ROW header

## `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableExtension.test.ts`

category: portable
family: tables-grid / selection-dom-mapping
target: .tmp/slate-v2/playwright/stress/generated-editing.test.ts; .tmp/slate-v2/playwright/integration/examples/tables.test.ts; .tmp/slate-v2/packages/slate/test/transforms/insertFragment

- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableExtension.test.ts:51` describe: TableExtension
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableExtension.test.ts:67` it: Creates a table with INSERT_TABLE_COMMAND
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableExtension.test.ts:101` it: Prevents nested tables by default
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableExtension.test.ts:141` it: Allows nested tables when hasNestedTables is true
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableExtension.test.ts:184` describe: $insertGeneratedNodes
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableExtension.test.ts:185` test: SELECTION_INSERT_CLIPBOARD_NODES_COMMAND handler prevents pasting whole table into cells by default
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableExtension.test.ts:236` test: SELECTION_INSERT_CLIPBOARD_NODES_COMMAND handler allows pasting whole table into a single cell when hasNestedTables is true
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableExtension.test.ts:292` test: SELECTION_INSERT_CLIPBOARD_NODES_COMMAND handler allows extending table when hasNestedTables is true
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableExtension.test.ts:365` describe: colWidths
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableExtension.test.ts:366` it: removes colWidths if it is an empty array
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableExtension.test.ts:388` it: uses the last column width if the column count is greater than the number of column widths
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableExtension.test.ts:410` it: shortens the colWidths if the column count is less than the number of column widths
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableExtension.test.ts:433` describe: SELECT_ALL_COMMAND
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableExtension.test.ts:434` it: Selects all cells in table without merged cells when table is only content
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableExtension.test.ts:519` it: Selects all cells in table with merged cells when table is only content
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableExtension.test.ts:618` it: Does not intercept SELECT_ALL_COMMAND when cursor is outside table
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableExtension.test.ts:656` it: Does not intercept SELECT_ALL_COMMAND when there is paragraph after table

## `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableMobileSelection.test.tsx`

category: portable
family: tables-grid / selection-dom-mapping
target: .tmp/slate-v2/playwright/stress/generated-editing.test.ts; .tmp/slate-v2/playwright/integration/examples/tables.test.ts; .tmp/slate-v2/packages/slate/test/transforms/insertFragment

- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableMobileSelection.test.tsx:53` describe: LexicalTableMobileSelection
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableMobileSelection.test.tsx:108` test: mouse click should set anchor cell for selection (existing behavior)
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableMobileSelection.test.tsx:137` test: touch tap on single cell should not create table selection
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableMobileSelection.test.tsx:164` test: touch tap between different cells should not create table selection
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableMobileSelection.test.tsx:201` test: touch drag (with isSelecting=true) should still create table selection
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableMobileSelection.test.tsx:241` test: mixed pointer types should be handled correctly
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableMobileSelection.test.tsx:272` test: mouse leaving browser window during selection should stop selection

## `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableNode.test.tsx`

category: portable
family: tables-grid / selection-dom-mapping
target: .tmp/slate-v2/playwright/stress/generated-editing.test.ts; .tmp/slate-v2/playwright/integration/examples/tables.test.ts; .tmp/slate-v2/packages/slate/test/transforms/insertFragment

- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableNode.test.tsx:105` describe: LexicalTableNode tests
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableNode.test.tsx:107` describe: hasHorizontalScroll={${hasHorizontalScroll}}
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableNode.test.tsx:140` test: TableNode.constructor
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableNode.test.tsx:152` test: TableNode.createDOM()
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableNode.test.tsx:169` test: TableNode.createDOM() and updateDOM() style
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableNode.test.tsx:278` test: TableNode.exportDOM() with range selection
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableNode.test.tsx:349` test: TableNode.exportDOM() with partial table selection
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableNode.test.tsx:405` test: Copy table from an external source
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableNode.test.tsx:456` test: Copy table with caption/tbody/thead/tfoot from an external source
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableNode.test.tsx:600` test: Copy table with caption from an external source
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableNode.test.tsx:770` test: Copy table from an external source like gdoc with formatting
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableNode.test.tsx:835` test: Cut table in the middle of a range selection
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableNode.test.tsx:865` test: Cut table as last node in range selection
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableNode.test.tsx:893` test: Cut table as first node in range selection
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableNode.test.tsx:921` test: Cut table is whole selection, should remove it
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableNode.test.tsx:962` test: Cut subsection of table cells, should just clear contents
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableNode.test.tsx:1067` test: Table plain text output validation
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableNode.test.tsx:1117` test: Toggle row striping ON/OFF
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableNode.test.tsx:1182` test: Toggle frozen first column ON/OFF
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableNode.test.tsx:1696` test: Change Table-level alignment
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableNode.test.tsx:1759` test: Update column widths
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableNode.test.tsx:1841` describe: hasHorizontalScroll false -> true
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableNode.test.tsx:1859` test: table is re-rendered when scroll changes

## `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTablePlugin.test.tsx`

category: portable
family: tables-grid / selection-dom-mapping
target: .tmp/slate-v2/playwright/stress/generated-editing.test.ts; .tmp/slate-v2/playwright/integration/examples/tables.test.ts; .tmp/slate-v2/packages/slate/test/transforms/insertFragment

- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTablePlugin.test.tsx:26` describe: LexicalTablePlugin
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTablePlugin.test.tsx:43` test: INSERT_TABLE_COMMAND inserts a table
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTablePlugin.test.tsx:77` test: INSERT_TABLE_COMMAND inserts a table when the editor is blurred

## `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableRowNode.test.ts`

category: portable
family: tables-grid / selection-dom-mapping
target: .tmp/slate-v2/playwright/stress/generated-editing.test.ts; .tmp/slate-v2/playwright/integration/examples/tables.test.ts; .tmp/slate-v2/packages/slate/test/transforms/insertFragment

- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableRowNode.test.ts:20` describe: LexicalTableRowNode tests
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableRowNode.test.ts:22` test: TableRowNode.constructor
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableRowNode.test.ts:34` test: TableRowNode.createDOM()

## `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableSelection.test.tsx`

category: portable
family: tables-grid / selection-dom-mapping
target: .tmp/slate-v2/playwright/stress/generated-editing.test.ts; .tmp/slate-v2/playwright/integration/examples/tables.test.ts; .tmp/slate-v2/packages/slate/test/transforms/insertFragment

- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableSelection.test.tsx:34` describe: table selection
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableSelection.test.tsx:70` describe: regression #7076
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableSelection.test.tsx:71` test: $patchStyleText works on a TableSelection
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableSelection.test.tsx:93` test: $patchStyleText applies styles to empty table cells
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableSelection.test.tsx:127` describe: regression #7140
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableSelection.test.tsx:128` test: selection points to missing nodes after deleting table rows

## `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableUtils.test.ts`

category: portable
family: tables-grid / selection-dom-mapping
target: .tmp/slate-v2/playwright/stress/generated-editing.test.ts; .tmp/slate-v2/playwright/integration/examples/tables.test.ts; .tmp/slate-v2/packages/slate/test/transforms/insertFragment

- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableUtils.test.ts:58` describe: $moveTableColumn
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableUtils.test.ts:73` test: moves a column forward
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableUtils.test.ts:105` test: moves a column backward
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableUtils.test.ts:137` test: moves a column to the first position
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableUtils.test.ts:169` test: moves a column to the last position
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableUtils.test.ts:201` test: is a no-op when origin equals target
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableUtils.test.ts:233` test: is a no-op when origin is out of bounds
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableUtils.test.ts:265` test: is a no-op when target is out of bounds
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableUtils.test.ts:297` test: is a no-op when origin is negative
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableUtils.test.ts:329` test: reorders colWidths when present
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableUtils.test.ts:360` test: does not modify table with merged cells
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableUtils.test.ts:425` test: swaps adjacent columns
- `../lexical/packages/lexical-table/src/__tests__/unit/LexicalTableUtils.test.ts:458` test: preserves table structure after move

## `../lexical/packages/lexical-utils/src/__tests__/unit/LexicalUtilsInsertNodeToNearestRoot.test.tsx`

category: portable
family: core package behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-utils/src/__tests__/unit/LexicalUtilsInsertNodeToNearestRoot.test.tsx:26` describe: LexicalUtils#insertNodeToNearestRoot
- `../lexical/packages/lexical-utils/src/__tests__/unit/LexicalUtilsInsertNodeToNearestRoot.test.tsx:139` it: dynamic or multiline title

## `../lexical/packages/lexical-utils/src/__tests__/unit/LexicalUtilsSplitNode.test.tsx`

category: portable
family: core package behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical-utils/src/__tests__/unit/LexicalUtilsSplitNode.test.tsx:18` describe: LexicalUtils#splitNode
- `../lexical/packages/lexical-utils/src/__tests__/unit/LexicalUtilsSplitNode.test.tsx:104` it: dynamic or multiline title
- `../lexical/packages/lexical-utils/src/__tests__/unit/LexicalUtilsSplitNode.test.tsx:138` it: throws when splitting root

## `../lexical/packages/lexical/src/__tests__/unit/CodeBlock.test.ts`

category: portable
family: serialization-parsing / marks-inline
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-history/test; .tmp/slate-v2/playwright/integration/examples/richtext.test.ts

- `../lexical/packages/lexical/src/__tests__/unit/CodeBlock.test.ts:23` describe: CodeBlock tests
- `../lexical/packages/lexical/src/__tests__/unit/CodeBlock.test.ts:117` test: Code block html paste: ${testCase.name}

## `../lexical/packages/lexical/src/__tests__/unit/HTMLCopyAndPaste.test.ts`

category: portable
family: clipboard-paste / browser-engine
target: .tmp/slate-v2/packages/slate/test/clipboard-contract.ts; .tmp/slate-v2/packages/slate-dom/test/clipboard-boundary.test.ts; .tmp/slate-v2/playwright/integration/examples/paste-html.test.ts; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical/src/__tests__/unit/HTMLCopyAndPaste.test.ts:24` describe: HTMLCopyAndPaste tests
- `../lexical/packages/lexical/src/__tests__/unit/HTMLCopyAndPaste.test.ts:110` test: HTML copy paste: ${testCase.name}
- `../lexical/packages/lexical/src/__tests__/unit/HTMLCopyAndPaste.test.ts:135` test: iOS fix: Word predictions should be handled as plain text to maintain selection formatting

## `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:167` describe: LexicalEditor tests
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:244` describe: registerNodeTransform
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:245` it: Calls the RootNode transform last on every update
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:357` describe: read()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:358` it: Can read the editor state
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:409` it: runs transforms the editor state
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:445` it: can be nested in an update or read
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:481` it: Should create an editor with an initial editor state
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:526` it: Should handle nested updates in the correct sequence
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:671` it: nested update after selection update triggers exactly 1 update
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:698` it: update does not call onUpdate callback when no dirty nodes
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:713` it: editor.focus() callback is called
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:728` it: Synchronously runs three transforms, two of them depend on the other
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:775` it: Synchronously runs three transforms, two of them depend on the other (2)
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:841` it: Synchronously runs three transforms, two of them depend on previously merged text content
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:912` it: text transform runs when node is removed
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:943` it: transforms only run on nodes that were explicitly marked as dirty
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:992` it: transforms do not discard unintentional dirtyElements
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1072` describe: transforms on siblings
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1110` it: on remove
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1118` it: on replace
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1127` it: on insertBefore
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1136` it: on insertAfter
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1145` it: on splitText
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1155` it: on append
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1165` it: Detects infinite recursivity on transforms
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1186` it: Should be able to update an editor state without a root element
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1221` it: Should be able to recover from an update error
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1258` it: Should be able to handle a change in root element
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1322` it: dynamic or multiline title
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1349` describe: With node decorators
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1384` it: Should correctly render React component into Lexical node #1
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1428` it: Should correctly render React component into Lexical node #2
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1523` describe: parseEditorState()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1532` it: exportJSON API - parses parsed JSON
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1552` describe: range selection
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1576` it: Parses the nodes of a stringified editor state
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1624` it: Parses the text content of the editor state
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1634` describe: node selection
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1660` it: Parses the nodes of a stringified editor state
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1708` it: Parses the text content of the editor state
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1719` describe: $parseSerializedNode()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1720` it: parses serialized nodes
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1744` describe: Node children
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1761` it: moves node to different tree branches
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1816` it: moves node to different tree branches (inverse)
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1851` it: moves node to different tree branches (node appended twice in two different branches)
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1893` it: can subscribe and unsubscribe from commands and the callback is fired
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1921` it: removes the command from the command map when no listener are attached
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1962` it: can register transforms before updates
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:1988` it: textcontent listener
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:2049` it: mutation listener
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:2146` it: rejects creating an editor with invalid LexicalNode parent class
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:2158` it: mutation listener on newly initialized editor
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:2166` it: mutation listener with setEditorState
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:2226` it: mutation listener set for original node should work with the replaced node
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:2323` it: mutation listener should work with the replaced node
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:2380` it: multiple update tags
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:2402` it: mutation listeners does not trigger when other node types are mutated
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:2422` it: mutation listeners with normalization
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:2468` it: dynamic or multiline title
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:2586` it: editable listener
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:2603` it: does not add new listeners while triggering existing
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:2690` it: allows using the same listener for multiple node types
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:2719` it: calls mutation listener with initial state
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:2787` it: can use discrete for synchronous updates
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:2814` it: can use discrete after a non-discrete update to flush the entire queue
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:2841` it: can use discrete after a non-discrete setEditorState to flush the entire queue
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:2871` it: can use discrete in a nested update to flush the entire queue
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:2898` it: can read in a nested update
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:2917` it: does not include linebreak into inline elements
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:2934` it: reconciles state without root element
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:2945` describe: node replacement
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:2946` it: should work correctly
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:2983` it: should fail if node keys are re-used
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:3021` it: dynamic or multiline title
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:3074` it: dynamic or multiline title
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:3123` it: recovers from reconciler failure and trigger proper prev editor state
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:3161` it: should call importDOM methods only once
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:3183` describe: setRootElement
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:3184` it: root element count is always positive
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:3200` it: should handle root element moving between documents
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:3224` describe: html config
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:3225` it: should override export output function
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:3272` it: should override import conversion function
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:3312` describe: selection
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:3313` it: updates the DOM selection
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditor.test.tsx:3355` it: does not update the Lexical->DOM selection with skip-dom-selection

## `../lexical/packages/lexical/src/__tests__/unit/LexicalEditorListener.test.ts`

category: portable
family: serialization-parsing / marks-inline
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-history/test; .tmp/slate-v2/playwright/integration/examples/richtext.test.ts

- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditorListener.test.ts:11` describe: LexicalEditor listeners
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditorListener.test.ts:12` describe: registerRootListener
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditorListener.test.ts:13` test: can return a function that is called when unregistered
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditorListener.test.ts:31` test: updates the function on each call
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditorListener.test.ts:47` test: works when the root element changes too
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditorListener.test.ts:80` describe: registerEditableListener
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditorListener.test.ts:81` test: can return a function that is called when unregistered
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditorListener.test.ts:102` test: updates the function on each call
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditorListener.test.ts:125` test: works when editable state changes

## `../lexical/packages/lexical/src/__tests__/unit/LexicalEditorState.test.ts`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditorState.test.ts:23` describe: LexicalEditorState tests
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditorState.test.ts:25` test: constructor
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditorState.test.ts:34` test: read()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditorState.test.ts:107` test: toJSON()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalEditorState.test.ts:123` test: ensure garbage collection works as expected

## `../lexical/packages/lexical/src/__tests__/unit/LexicalElementHelpers.test.ts`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical/src/__tests__/unit/LexicalElementHelpers.test.ts:15` describe: LexicalElementHelpers tests
- `../lexical/packages/lexical/src/__tests__/unit/LexicalElementHelpers.test.ts:16` describe: addClassNamesToElement() and removeClassNamesFromElement()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalElementHelpers.test.ts:17` test: basic
- `../lexical/packages/lexical/src/__tests__/unit/LexicalElementHelpers.test.ts:28` test: empty
- `../lexical/packages/lexical/src/__tests__/unit/LexicalElementHelpers.test.ts:44` test: multiple
- `../lexical/packages/lexical/src/__tests__/unit/LexicalElementHelpers.test.ts:55` test: space separated
- `../lexical/packages/lexical/src/__tests__/unit/LexicalElementHelpers.test.ts:67` test: multiple spaces

## `../lexical/packages/lexical/src/__tests__/unit/LexicalExtensionCore.test.ts`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical/src/__tests__/unit/LexicalExtensionCore.test.ts:18` describe: defineExtension
- `../lexical/packages/lexical/src/__tests__/unit/LexicalExtensionCore.test.ts:19` it: does not change identity
- `../lexical/packages/lexical/src/__tests__/unit/LexicalExtensionCore.test.ts:32` it: infers the expected type (base case)
- `../lexical/packages/lexical/src/__tests__/unit/LexicalExtensionCore.test.ts:37` it: infers the expected type (config inference)
- `../lexical/packages/lexical/src/__tests__/unit/LexicalExtensionCore.test.ts:42` it: infers the expected type (output inference)
- `../lexical/packages/lexical/src/__tests__/unit/LexicalExtensionCore.test.ts:54` it: can define an extension without config
- `../lexical/packages/lexical/src/__tests__/unit/LexicalExtensionCore.test.ts:59` it: infers the correct init type
- `../lexical/packages/lexical/src/__tests__/unit/LexicalExtensionCore.test.ts:71` describe: declarePeerDependency
- `../lexical/packages/lexical/src/__tests__/unit/LexicalExtensionCore.test.ts:72` it: validates the type argument

## `../lexical/packages/lexical/src/__tests__/unit/LexicalListPlugin.test.tsx`

category: portable
family: serialization-parsing / marks-inline
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-history/test; .tmp/slate-v2/playwright/integration/examples/richtext.test.ts

- `../lexical/packages/lexical/src/__tests__/unit/LexicalListPlugin.test.tsx:42` describe: @lexical/list tests
- `../lexical/packages/lexical/src/__tests__/unit/LexicalListPlugin.test.tsx:85` test: Toggle an empty list on/off
- `../lexical/packages/lexical/src/__tests__/unit/LexicalListPlugin.test.tsx:140` test: Can create a list and indent/outdent it
- `../lexical/packages/lexical/src/__tests__/unit/LexicalListPlugin.test.tsx:223` test: $setBlocksType does not cause invalid ListItemNode children - regression #7036

## `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:98` describe: LexicalNode tests
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:122` test: LexicalNode.constructor
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:138` test: LexicalNode.constructor: type change detected
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:151` test: LexicalNode.clone()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:160` test: LexicalNode.afterCloneFrom()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:227` test: LexicalNode.getType()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:236` test: LexicalNode.isAttached()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:253` test: LexicalNode.isSelected()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:278` test: LexicalNode.isSelected(): selected text node
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:296` test: LexicalNode.isSelected(): selected block node range
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:344` test: LexicalNode.isSelected(): with custom range selection
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:375` describe: LexicalNode.isSelected(): with inline decorator node
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:491` test: dynamic or multiline title
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:536` test: LexicalNode.getKey()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:540` test: LexicalNode.getParent()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:556` test: LexicalNode.getParentOrThrow()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:572` test: LexicalNode.getTopLevelElement()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:611` test: LexicalNode.getTopLevelElementOrThrow()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:632` test: LexicalNode.getParents()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:652` test: LexicalNode.getPreviousSibling()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:676` test: LexicalNode.getPreviousSiblings()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:715` test: LexicalNode.getNextSibling()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:736` test: LexicalNode.getNextSiblings()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:764` test: LexicalNode.getCommonAncestor()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:817` test: LexicalNode.isBefore()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:845` test: LexicalNode.isParentOf()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:860` test: LexicalNode.getNodesBetween()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:908` test: LexicalNode.isToken()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:928` test: LexicalNode.isSegmented()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:948` test: LexicalNode.isDirectionless()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:971` test: LexicalNode.getLatest()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:980` test: LexicalNode.getLatest(): garbage collected node
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1002` test: LexicalNode.getTextContent()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1016` test: LexicalNode.getTextContentSize()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1025` test: LexicalNode.createDOM()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1042` test: LexicalNode.updateDOM()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1052` test: LexicalNode.remove()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1078` test: LexicalNode.replace()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1088` test: LexicalNode.replace(): from another parent
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1117` test: LexicalNode.replace(): text
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1134` test: LexicalNode.replace(): token
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1151` test: LexicalNode.replace(): segmented
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1168` test: LexicalNode.replace(): directionless
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1186` test: LexicalNode.replace() within canBeEmpty: false
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1212` test: LexicalNode.insertAfter()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1223` test: LexicalNode.insertAfter(): text
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1240` test: LexicalNode.insertAfter(): token
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1257` test: LexicalNode.insertAfter(): segmented
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1274` test: LexicalNode.insertAfter(): directionless
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1292` test: LexicalNode.insertAfter() move blocks around
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1329` test: LexicalNode.insertAfter() move blocks around #2
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1372` test: LexicalNode.insertBefore()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1383` test: LexicalNode.insertBefore(): from another parent
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1404` test: LexicalNode.insertBefore(): text
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1421` test: LexicalNode.insertBefore(): token
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1438` test: LexicalNode.insertBefore(): segmented
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1455` test: LexicalNode.insertBefore(): directionless
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1472` test: LexicalNode.selectNext()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1488` test: LexicalNode.selectNext(): no next sibling
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1498` test: LexicalNode.selectNext(): non-text node
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1510` describe: LexicalNode.$config()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1511` test: importJSON() with no boilerplate
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1541` test: clone() with no boilerplate
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1622` describe: LexicalNode.$config() without registration
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNode.test.ts:1623` test: static getType() before registration

## `../lexical/packages/lexical/src/__tests__/unit/LexicalNodeState.test.ts`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical/src/__tests__/unit/LexicalNodeState.test.ts:117` describe: LexicalNode state
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNodeState.test.ts:129` test: state.$set() and state.$get() need to be inside an update
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNodeState.test.ts:148` test: \_\_state is not an enumerable property
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNodeState.test.ts:158` test: getState and setState
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNodeState.test.ts:181` test: import and export state
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNodeState.test.ts:201` test: states cannot be registered with the same key string
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNodeState.test.ts:222` test: nodeGetter() and nodeSetter()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNodeState.test.ts:240` test: flat config serialization round-trip
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNodeState.test.ts:269` test: default value should not be exported
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNodeState.test.ts:300` test: getState returns immutable values, setState require an Object literal
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNodeState.test.ts:336` test: setting state shouldn’t affect previous reconciled versions of the node
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNodeState.test.ts:386` describe: nodeStatesAreEquivalent
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNodeState.test.ts:387` test: undefined states are equivalent
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNodeState.test.ts:390` test: merges text nodes with different number of default state values
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNodeState.test.ts:430` test: TextNode merging only with equivalent state
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNodeState.test.ts:493` test: different versions of the same state are not equivalent
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNodeState.test.ts:589` describe: resetOnCopyNode
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNodeState.test.ts:590` test: state with resetOnCopyNode: true is reset when using $copyNode
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNodeState.test.ts:610` test: state with resetOnCopyNode: false is preserved when using $copyNode
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNodeState.test.ts:630` test: state without resetOnCopyNode option is preserved when using $copyNode
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNodeState.test.ts:649` test: multiple states with different resetOnCopyNode configurations

## `../lexical/packages/lexical/src/__tests__/unit/LexicalNormalization.test.tsx`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical/src/__tests__/unit/LexicalNormalization.test.tsx:24` describe: LexicalNormalization tests
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNormalization.test.tsx:26` describe: $normalizeSelection
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNormalization.test.tsx:33` test: paragraph to text nodes${reversedStr}
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNormalization.test.tsx:61` test: paragraph to text node + element${reversedStr}
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNormalization.test.tsx:89` test: paragraph to text node + decorator${reversedStr}
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNormalization.test.tsx:117` test: text + text node${reversedStr}
- `../lexical/packages/lexical/src/__tests__/unit/LexicalNormalization.test.tsx:145` test: paragraph to test element to text + text${reversedStr}

## `../lexical/packages/lexical/src/__tests__/unit/LexicalReconciler.test.ts`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical/src/__tests__/unit/LexicalReconciler.test.ts:21` describe: LexicalReconciler
- `../lexical/packages/lexical/src/__tests__/unit/LexicalReconciler.test.ts:23` test: Should set direction of root node children to auto if root node has no direction
- `../lexical/packages/lexical/src/__tests__/unit/LexicalReconciler.test.ts:43` test: Should not set direction of root node children if root node has direction
- `../lexical/packages/lexical/src/__tests__/unit/LexicalReconciler.test.ts:64` test: Should allow overriding direction of root node children when root node has no direction
- `../lexical/packages/lexical/src/__tests__/unit/LexicalReconciler.test.ts:96` test: Should allow overriding direction of root node children when root node has direction
- `../lexical/packages/lexical/src/__tests__/unit/LexicalReconciler.test.ts:119` test: Should update root children when root node direction changes

## `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts`

category: portable
family: selection-dom-mapping / void-atom
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-react/test/editable-behavior.test.tsx; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:55` describe: LexicalSelection tests
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:57` describe: Inserting text either side of inline elements
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:124` describe: Inserting text before inline elements
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:125` describe: Start-of-paragraph inline elements
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:153` test: Can insert text before a start-of-paragraph inline element, using insertText
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:160` test: Can insert text before a start-of-paragraph inline element, using insertNodes
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:167` describe: Mid-paragraph inline elements
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:194` test: Can insert text before a mid-paragraph inline element, using insertText
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:200` test: Can insert text before a mid-paragraph inline element, using insertNodes
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:207` describe: End-of-paragraph inline elements
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:234` test: Can insert text before an end-of-paragraph inline element, using insertText
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:240` test: Can insert text before an end-of-paragraph inline element, using insertNodes
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:248` describe: Inserting text after inline elements
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:249` describe: Start-of-paragraph inline elements
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:276` test: Can insert text after a start-of-paragraph inline element, using insertText
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:283` test: Can insert text after a start-of-paragraph inline element, using insertNodes
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:290` describe: Mid-paragraph inline elements
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:317` test: Can insert text after a mid-paragraph inline element, using insertText
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:324` test: Can insert text after a mid-paragraph inline element, using insertNodes
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:331` describe: End-of-paragraph inline elements
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:359` test: Can insert text after an end-of-paragraph inline element, using insertText
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:366` test: Can insert text after an end-of-paragraph inline element, using insertNodes
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:375` describe: insertText()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:376` test: inserts into existing paragraph node when selection is on parent of paragraph
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:395` describe: removeText
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:396` describe: with a leading TextNode and a trailing token TextNode
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:415` test: remove all text
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:438` test: remove initial TextNode
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:461` test: remove trailing token TextNode
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:486` test: remove initial TextNode and partial token TextNode
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:511` test: remove partial initial TextNode and partial token TextNode
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:539` describe: with a leading token TextNode and a trailing TextNode
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:557` test: remove all text
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:580` test: remove trailing TextNode
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:605` test: remove leading token TextNode
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:628` test: remove partial leading token TextNode and trailing TextNode
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:657` test: remove partial token TextNode and partial trailing TextNode
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:685` describe: with a leading TextNode and a trailing segmented TextNode
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:704` test: remove all text
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:727` test: remove initial TextNode
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:750` test: remove trailing segmented TextNode
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:775` test: remove initial TextNode and partial segmented TextNode
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:802` test: remove partial initial TextNode and partial segmented TextNode
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:844` describe: Regression tests for #6701
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:845` test: insertNodes fails an invariant when there is no Block ancestor
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:887` describe: getNodes()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:924` describe: $selectAll()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:925` test: with test document
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:952` test: with leading inline decorator
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:984` test: with trailing inline decorator
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1017` test: with leading empty inline element
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1053` test: with trailing empty inline element
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1090` test: after removing empty paragraph
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1124` test: Manual select all without normalization
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1149` test: Manual select all from first text to last empty paragraph
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1174` test: Manual select with focus collapsed between inline decorators
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1209` test: Manual select with focus collapsed after inline decorator
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1245` test: Manual select with focus between inline decorators
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1287` test: select only the paragraph (not normalized)
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1312` test: select around the paragraph (not normalized)
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1341` test: selection collapsed inside an empty element
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1353` test: select an empty ListItemNode (collapsed)
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1373` describe: extract()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1410` test: Manual select all without normalization
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1437` test: Manual select all from first text to last empty paragraph
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1464` test: select partial TextNode extracts paragraph text
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1479` test: select partial TextNode extracts link text
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1492` test: select multiple partial TextNode extracts text
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1509` test: select last offset TextNode as first node removes node
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1534` test: select 0 offset TextNode as last node removes node
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1558` describe: Regression #7081
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1560` test: Firefox selection & paste before linebreak
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1592` describe: Regression #7173
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1594` test: Can insertNodes of multiple blocks with a target of an initial empty block and the entire next block
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1618` describe: Regression #3181
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1620` test: Point.isBefore edge case with mixed TextNode & ElementNode and matching descendants
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1657` describe: Regression #8067
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1659` test: Formatting issue when replacing text with format
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1681` describe: Regression #8098
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSelection.test.ts:1683` test: Do not apply format and style when moving to different node

## `../lexical/packages/lexical/src/__tests__/unit/LexicalSerialization.test.ts`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical/src/__tests__/unit/LexicalSerialization.test.ts:104` describe: LexicalSerialization tests
- `../lexical/packages/lexical/src/__tests__/unit/LexicalSerialization.test.ts:106` test: serializes and deserializes from JSON

## `../lexical/packages/lexical/src/__tests__/unit/LexicalUpdateTags.test.ts`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical/src/__tests__/unit/LexicalUpdateTags.test.ts:31` describe: LexicalUpdateTags tests
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUpdateTags.test.ts:33` test: Built-in update tags work correctly
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUpdateTags.test.ts:52` test: $addUpdateTag and $hasUpdateTag work correctly
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUpdateTags.test.ts:62` test: Multiple update tags can be added
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUpdateTags.test.ts:75` test: Update tags via editor.update() options work
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUpdateTags.test.ts:88` test: Update tags are cleared after update
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUpdateTags.test.ts:103` test: Update tags affect editor behavior

## `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:44` describe: LexicalUtils tests
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:46` test: scheduleMicroTask(): native
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:62` test: scheduleMicroTask(): promise
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:82` test: emptyFunction()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:88` test: resetRandomKey()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:100` test: generateRandomKey()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:110` test: isArray()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:115` test: isSelectionWithinEditor()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:154` test: getTextDirection()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:187` test: isExactShortcutMatch() matches by event.key for single-letter
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:209` test: isExactShortcutMatch() matches to event.key for ASCII remapped layout (English (US) Dvorak)
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:237` test: isExactShortcutMatch() fallback to event.code for single-letter in event.key via non-English layout
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:259` test: isExactShortcutMatch() matches special keys
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:288` test: isExactShortcutMatch() matches optional keys
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:323` test: isTokenOrSegmented()
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:338` test: $getNodeByKey
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:361` test: $nodesOfType
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:390` describe: $onUpdate
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:391` test: deferred even when there are no dirty nodes
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:421` test: added fn runs after update, original onUpdate, and prior calls to $onUpdate
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:450` test: adding fn throws outside update
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:457` test: getCachedTypeToNodeMap
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:510` test: scrollIntoViewIfNeeded respects scroll-padding on document element
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:550` describe: $applyNodeReplacement
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:589` test: validates replace node configuration
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:615` test: validates replace node type withKlass
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:641` test: validates replace node type change
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:673` test: validates replace node key change
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:700` test: validates replace node configuration withKlass
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:726` test: validates nested replace node configuration
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:756` test: validates nested replace node configuration withKlass
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:789` test: nested replace node configuration works
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:826` describe: $copyNode
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:859` test: does not mark the original as dirty
- `../lexical/packages/lexical/src/__tests__/unit/LexicalUtils.test.ts:887` test: returns a shallow copy

## `../lexical/packages/lexical/src/__tests__/unit/mergeRegister.test.ts`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical/src/__tests__/unit/mergeRegister.test.ts:11` describe: mergeRegister
- `../lexical/packages/lexical/src/__tests__/unit/mergeRegister.test.ts:12` it: calls all of the clean-up functions
- `../lexical/packages/lexical/src/__tests__/unit/mergeRegister.test.ts:17` it: calls the clean-up functions in reverse order

## `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts`

category: portable
family: selection-dom-mapping / void-atom
target: .tmp/slate-v2/packages/slate/test; .tmp/slate-v2/packages/slate-react/test/editable-behavior.test.tsx; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:88` describe: LexicalCaret
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:90` describe: $getChildCaret
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:92` test: direction ${direction}
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:198` describe: $getSiblingCaret
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:200` test: direction ${direction}
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:439` describe: $caretRangeFromSelection
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:440` test: collapsed text point selection
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:499` test: full text node selection (${direction})
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:549` test: single text node non-empty selection
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:598` test: multiple text node non-empty selection (${direction})
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:694` describe: $removeTextFromCaretRange
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:696` describe: ported Headings e2e tests
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:697` test: Pressing return in the middle of a heading creates a new heading below
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:727` describe: ported File e2e tests
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:728` test: $selectAll() with nesting and a trailing decorator
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:758` describe: ported Table e2e tests
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:759` test: Can delete all with range selection anchored in table
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:795` describe: ported LexicalSelection tests
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:796` test: remove partial initial TextNode and partial segmented TextNode
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:857` describe: single block
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:869` test: remove second TextNode when wrapped in a LinkNode that will become empty
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:918` test: remove first TextNode with second in token mode
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:960` test: collapsed text point selection
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:1020` describe: full text node internal selection
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:1023` test: ${text} node (${direction})
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:1098` describe: full text node biased selection
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:1108` test: ${text} node (${direction} ${anchorBias} ${focusBias})
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:1253` describe: single text node non-empty partial selection
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:1258` test: ${direction} ${anchorEdgeOffset}:${-focusEdgeOffset}
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:1319` describe: multiple text node selection
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:1333` test: ${direction} ${texts[nodeIndexStart]} ${startFn.name} ${texts[nodeIndexEnd]} ${endFn.name}
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:1481` describe: multiple blocks
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:1495` describe: multiple text node selection
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:1509` test: ${direction} ${texts[nodeIndexStart]} ${startFn.name} ${texts[nodeIndexEnd]} ${endFn.name}
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:1652` test: remove range between list and nested list
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:1694` describe: Ordering
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:1732` describe: $comparePointCaretNext
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:1733` test: trivial caret checks
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:1764` test: TextPointCaret checks single origin
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:1822` test: TextPointCaret multiple origin
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:1848` describe: $getCommonAncestor
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:1849` test: trivial node checks
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:1896` test: dynamic or multiline title
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:1954` describe: LexicalSelectionHelpers
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:1956` describe: with a fully-selected text node preceded by an inline element
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:1957` test: a single text node
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:1994` describe: $splitAtPointCaretNext
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:1996` test: Does not split a TextNode at the beginning
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:2012` test: Splits a TextNode in the middle
- `../lexical/packages/lexical/src/caret/__tests__/unit/LexicalCaret.test.ts:2031` test: Splits a ParagraphNode

## `../lexical/packages/lexical/src/caret/__tests__/unit/docs-traversals.test.ts`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical/src/caret/__tests__/unit/docs-traversals.test.ts:32` describe: traversals.md
- `../lexical/packages/lexical/src/caret/__tests__/unit/docs-traversals.test.ts:34` describe: Traversal Strategies
- `../lexical/packages/lexical/src/caret/__tests__/unit/docs-traversals.test.ts:73` describe: Adjacent Caret Traversals
- `../lexical/packages/lexical/src/caret/__tests__/unit/docs-traversals.test.ts:74` test: $iterSiblings
- `../lexical/packages/lexical/src/caret/__tests__/unit/docs-traversals.test.ts:109` test: root has no siblings
- `../lexical/packages/lexical/src/caret/__tests__/unit/docs-traversals.test.ts:119` test: root has paragraph children
- `../lexical/packages/lexical/src/caret/__tests__/unit/docs-traversals.test.ts:144` test: iteration does not include the origin
- `../lexical/packages/lexical/src/caret/__tests__/unit/docs-traversals.test.ts:161` describe: Depth First Caret Traversals
- `../lexical/packages/lexical/src/caret/__tests__/unit/docs-traversals.test.ts:162` describe: $iterCaretsDepthFirst
- `../lexical/packages/lexical/src/caret/__tests__/unit/docs-traversals.test.ts:163` test: via generator
- `../lexical/packages/lexical/src/caret/__tests__/unit/docs-traversals.test.ts:214` test: via CaretRange
- `../lexical/packages/lexical/src/caret/__tests__/unit/docs-traversals.test.ts:249` describe: $iterNodesDepthFirst
- `../lexical/packages/lexical/src/caret/__tests__/unit/docs-traversals.test.ts:269` test: includes only wholly included nodes
- `../lexical/packages/lexical/src/caret/__tests__/unit/docs-traversals.test.ts:297` test: full traversal

## `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:35` describe: LexicalElementNode tests
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:100` describe: exportJSON()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:101` test: should return and object conforming to the expected schema
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:120` test: serializes only the first TextNode style and format
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:163` test: serializes the same way without a root element
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:181` describe: getChildren()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:182` test: no children
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:191` test: some children
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:199` describe: getAllTextNodes()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:200` test: basic
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:209` test: nested
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:240` describe: getFirstChild()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:241` test: basic
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:252` test: empty
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:260` describe: getLastChild()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:261` test: basic
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:272` test: empty
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:280` describe: getTextContent()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:281` test: basic
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:287` test: empty
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:294` test: nested
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:323` describe: getTextContentSize()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:324` test: basic
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:332` test: child node getTextContentSize() can be overridden and is then reflected when calling the same method on parent node
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:344` describe: splice
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:451` it: Plain text: ${testCase.name}
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:594` it: Nested elements: ${testCase.name}
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:657` it: Running transforms for inserted nodes, their previous siblings and new siblings
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:704` describe: getDOMSlot tests
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:755` test: can create wrapper
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:789` test: DOM selection uses getDOMSlot element for element selections
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:812` describe: indexPath
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:813` test: no path
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:817` test: only child
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:823` test: nested child
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalElementNode.test.tsx:831` test: nested child with siblings

## `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalGC.test.tsx`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalGC.test.tsx:25` describe: LexicalGC tests
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalGC.test.tsx:27` test: RootNode.clear() with a child and subchild
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalGC.test.tsx:41` test: RootNode.clear() with a child and three subchildren
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalGC.test.tsx:59` test: RootNode.clear() with a child and three subchildren, subchild ${i} removed first
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalGC.test.tsx:95` test: RootNode.clear() with a complex tree, nodes ${removeKeys.toString()} removed first

## `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalLineBreakNode.test.ts`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalLineBreakNode.test.ts:14` describe: LexicalLineBreakNode tests
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalLineBreakNode.test.ts:16` test: LineBreakNode.constructor
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalLineBreakNode.test.ts:27` test: LineBreakNode.exportJSON() should return and object conforming to the expected schema
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalLineBreakNode.test.ts:44` test: LineBreakNode.createDOM()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalLineBreakNode.test.ts:55` test: LineBreakNode.updateDOM()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalLineBreakNode.test.ts:65` test: LineBreakNode.$isLineBreakNode()

## `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalParagraphNode.test.ts`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalParagraphNode.test.ts:27` describe: LexicalParagraphNode tests
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalParagraphNode.test.ts:29` test: ParagraphNode.constructor
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalParagraphNode.test.ts:41` test: ParagraphNode.exportJSON() should return and object conforming to the expected schema
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalParagraphNode.test.ts:64` test: ParagraphNode.createDOM()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalParagraphNode.test.ts:82` test: ParagraphNode.updateDOM()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalParagraphNode.test.ts:103` test: ParagraphNode.insertNewAfter()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalParagraphNode.test.ts:128` test: $createParagraphNode()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalParagraphNode.test.ts:141` test: $isParagraphNode()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalParagraphNode.test.ts:151` test: ParagraphNode.importDOM handles both CSS text-align and legacy align attribute

## `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalRootNode.test.ts`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalRootNode.test.ts:30` describe: LexicalRootNode tests
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalRootNode.test.ts:61` test: RootNode.constructor
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalRootNode.test.ts:71` test: RootNode.exportJSON() should return and object conforming to the expected schema
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalRootNode.test.ts:92` test: RootNode.clone()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalRootNode.test.ts:99` test: RootNode.createDOM()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalRootNode.test.ts:104` test: RootNode.updateDOM()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalRootNode.test.ts:109` test: RootNode.isAttached()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalRootNode.test.ts:113` test: RootNode.isRootNode()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalRootNode.test.ts:117` test: Cached getTextContent with decorators
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalRootNode.test.ts:134` test: RootNode.clear() to handle selection update
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalRootNode.test.ts:164` test: RootNode is selected when its selected child is removed
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalRootNode.test.ts:194` test: RootNode is not selected when all children are removed with no selection
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalRootNode.test.ts:216` test: RootNode \_\_cachedText incremental update #8096
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalRootNode.test.ts:239` test: RootNode \_\_cachedText
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalRootNode.test.ts:292` test: RootNode \_\_cachedText (empty paragraph)
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalRootNode.test.ts:302` test: RootNode \_\_cachedText (inlines)

## `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTabNode.test.tsx`

category: portable
family: clipboard-paste / browser-engine
target: .tmp/slate-v2/packages/slate/test/clipboard-contract.ts; .tmp/slate-v2/packages/slate-dom/test/clipboard-boundary.test.ts; .tmp/slate-v2/playwright/integration/examples/paste-html.test.ts; .tmp/slate-v2/playwright/stress/generated-editing.test.ts

- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTabNode.test.tsx:44` describe: LexicalTabNode tests
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTabNode.test.tsx:56` test: can paste plain text with tabs and newlines in plain text
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTabNode.test.tsx:70` test: can paste plain text with tabs and newlines in rich text
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTabNode.test.tsx:85` test: can paste HTML with tabs and new lines #4429
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTabNode.test.tsx:104` test: can paste HTML with tabs and new lines (2)
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTabNode.test.tsx:122` test: element indents when selection at the start of the block
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTabNode.test.tsx:140` test: elements indent when selection spans across multiple blocks
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTabNode.test.tsx:175` test: element tabs when selection is not at the start (1)
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTabNode.test.tsx:191` test: element tabs when selection is not at the start (2)
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTabNode.test.tsx:210` test: element tabs when selection is not at the start (3)
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTabNode.test.tsx:229` test: elements tabs when selection is not at the start and overlaps another tab
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTabNode.test.tsx:252` test: can type between two (leaf nodes) canInsertBeforeAfter false
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTabNode.test.tsx:266` test: can be serialized and deserialized
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTabNode.test.tsx:291` describe: TabNode at selection boundaries with normal TextNode sibling (#7602)
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTabNode.test.tsx:298` test: dynamic or multiline title

## `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx`

category: portable
family: portable editor behavior
target: .tmp/slate-v2/packages/slate/test; add focused browser proof only when behavior depends on DOM/runtime transport

- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:74` describe: LexicalTextNode tests
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:133` describe: exportJSON()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:134` test: should return and object conforming to the expected schema
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:156` describe: root.getTextContent()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:157` test: writable nodes
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:185` test: prepend node
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:205` describe: setTextContent()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:206` test: writable nodes
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:232` test: getFormatFlags(${formatFlag})
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:248` test: predicate for ${formatFlag}
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:260` test: toggling for ${formatFlag}
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:284` test: setting subscript clears superscript
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:297` test: setting superscript clears subscript
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:310` test: clearing subscript does not set superscript
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:323` test: clearing superscript does not set subscript
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:336` test: capitalization formats are mutually exclusive
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:362` test: selectPrevious()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:384` test: selectNext()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:409` describe: select()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:454` describe: splitText()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:455` test: convert segmented node into plain text
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:499` test: splitText moves composition key to last node
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:627` test: with detached parent
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:639` test: copies state to all nodes
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:662` test: copies state to all nodes (segmented)
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:680` describe: createDOM()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:792` describe: has parent node
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:813` describe: updateDOM()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:914` describe: exportDOM()
- `../lexical/packages/lexical/src/nodes/__tests__/unit/LexicalTextNode.test.tsx:965` test: mergeWithSibling

---

### Editor Test Harvester Portabletext Test Index (`docs/editor-test-harvester/portabletext/test-index.md`)

# Portable Text Portable Test Index

Source: `../portabletext`
Generated: 2026-05-29
Indexed runnable portable/portable-mixed rows: 200
Line/name anchors: 1944

This index records every runnable portable and portable-mixed source file with extracted test names or feature/scenario names. It does not copy test bodies, fixtures, helpers, snapshots, or expected output blobs.

| # | Source | Category | Family | Anchor count | Extracted names |
| ---: | --- | --- | --- | ---: | --- |
| 1 | `packages/editor/gherkin-tests/block-objects.test.ts` | portable | PT-H03 | 13 | packages/editor/gherkin-spec/block-objects.feature:2 Feature: Block Objects<br>packages/editor/gherkin-spec/block-objects.feature:8 Scenario: Pressing ArrowUp on a lonely image<br>packages/editor/gherkin-spec/block-objects.feature:18 Scenario: Pressing ArrowDown on a lonely image<br>packages/editor/gherkin-spec/block-objects.feature:28 Scenario: Pressing ArrowDown on image at the bottom<br>packages/editor/gherkin-spec/block-objects.feature:39 Scenario: ArrowRight before an image selects it<br>packages/editor/gherkin-spec/block-objects.feature:50 Scenario: ArrowLeft after an image selects it<br>packages/editor/gherkin-spec/block-objects.feature:61 Scenario: Pressing Delete before an image<br>packages/editor/gherkin-spec/block-objects.feature:77 Scenario: Pressing Delete in an empty paragraph before an image<br>packages/editor/gherkin-spec/block-objects.feature:95 Scenario: Pressing Backspace after an image<br>packages/editor/gherkin-spec/block-objects.feature:111 Scenario: Pressing Backspace in an empty paragraph after an image<br>packages/editor/gherkin-spec/block-objects.feature:123 Scenario Outline: Deleting a lonely image<br>packages/editor/gherkin-spec/block-objects.feature:135 Scenario Outline: Deleting an image with text above<br>packages/editor/gherkin-spec/block-objects.feature:154 Scenario Outline: Deleting an image with text below |
| 2 | `packages/editor/gherkin-tests/delete.test.ts` | portable | PT-H05 | 15 | packages/editor/gherkin-spec/delete.feature:1 Feature: Delete<br>packages/editor/gherkin-spec/delete.feature:6 Scenario Outline: Deleting expanded selection<br>packages/editor/gherkin-spec/delete.feature:19 Scenario Outline: Deleting word<br>packages/editor/gherkin-spec/delete.feature:35 Scenario Outline: Deleting code points in complex scripts<br>packages/editor/gherkin-spec/delete.feature:51 Scenario Outline: Deleting line backward<br>packages/editor/gherkin-spec/delete.feature:66 Scenario: Deleting line backward at start of block merges blocks<br>packages/editor/gherkin-spec/delete.feature:83 Scenario: Cutting selected text<br>packages/editor/gherkin-spec/delete.feature:92 Scenario: Cutting across blocks<br>packages/editor/gherkin-spec/delete.feature:109 Scenario: Deleting word backward at block boundary merges blocks<br>packages/editor/gherkin-spec/delete.feature:126 Scenario: Deleting word forward at block boundary merges blocks<br>packages/editor/gherkin-spec/delete.feature:143 Scenario: Cutting with collapsed selection is a no-op<br>packages/editor/gherkin-spec/delete.feature:150 Scenario: Deleting line backward in empty block<br>packages/editor/gherkin-spec/delete.feature:156 Scenario: Deleting line backward only affects current block<br>packages/editor/gherkin-spec/delete.feature:177 Scenario Outline: Merging blocks preserves marks<br>packages/editor/gherkin-spec/delete.feature:194 Scenario Outline: Merging blocks triggers span normalization |
| 3 | `packages/editor/gherkin-tests/inline-objects.test.ts` | portable | PT-H03 | 7 | packages/editor/gherkin-spec/inline-objects.feature:2 Feature: Inline Objects<br>packages/editor/gherkin-spec/inline-objects.feature:8 Scenario: Writing after inserting an inline object<br>packages/editor/gherkin-spec/inline-objects.feature:17 Scenario: Pressing Delete before an inline object<br>packages/editor/gherkin-spec/inline-objects.feature:24 Scenario: Pressing Backspace after an inline object<br>packages/editor/gherkin-spec/inline-objects.feature:30 Scenario: Adding a decorator across an inline object<br>packages/editor/gherkin-spec/inline-objects.feature:36 Scenario: Adding an annotation across an inline object<br>packages/editor/gherkin-spec/inline-objects.feature:45 Scenario: Removing an annotation across an inline block |
| 4 | `packages/editor/gherkin-tests/insert.block.test.ts` | portable | PT-H04 | 25 | packages/editor/gherkin-spec/insert.block.feature:1 Feature: Insert Block<br>packages/editor/gherkin-spec/insert.block.feature:6 Scenario Outline: Inserting block object on an empty editor without selecting it<br>packages/editor/gherkin-spec/insert.block.feature:17 Scenario Outline: Inserting block object on an empty editor and selecting it<br>packages/editor/gherkin-spec/insert.block.feature:32 Scenario Outline: Inserting block object on an empty text block<br>packages/editor/gherkin-spec/insert.block.feature:52 Scenario Outline: Inserting block object on empty heading<br>packages/editor/gherkin-spec/insert.block.feature:63 Scenario Outline: Inserting block object on empty list item<br>packages/editor/gherkin-spec/insert.block.feature:74 Scenario Outline: Inserting and selecting block object on text selection<br>packages/editor/gherkin-spec/insert.block.feature:102 Scenario Outline: Inserting block object on text selection without selecting it<br>packages/editor/gherkin-spec/insert.block.feature:122 Scenario Outline: Inserting and selecting block object on cross-block selection<br>packages/editor/gherkin-spec/insert.block.feature:146 Scenario Outline: Inserting a block object on a cross-block selection without selecting it<br>packages/editor/gherkin-spec/insert.block.feature:162 Scenario Outline: Inserting text block on an empty editor<br>packages/editor/gherkin-spec/insert.block.feature:173 Scenario Outline: Inserting and selecting text block on an empty editor<br>packages/editor/gherkin-spec/insert.block.feature:191 Scenario Outline: Inserting and selecting text block on an empty selected editor<br>packages/editor/gherkin-spec/insert.block.feature:209 Scenario Outline: Inserting block object on block object<br>packages/editor/gherkin-spec/insert.block.feature:233 Scenario Outline: Inserting and selecting block object on block object<br>packages/editor/gherkin-spec/insert.block.feature:250 Scenario Outline: Inserting block object on block objects<br>packages/editor/gherkin-spec/insert.block.feature:272 Scenario Outline: Inserting block object on text block<br>packages/editor/gherkin-spec/insert.block.feature:294 Scenario Outline: Inserting text block on block object<br>packages/editor/gherkin-spec/insert.block.feature:306 Scenario Outline: Inserting text block on text block<br>packages/editor/gherkin-spec/insert.block.feature:325 Scenario Outline: Inserting and selecting text block on text block<br>packages/editor/gherkin-spec/insert.block.feature:363 Scenario Outline: Inserting text block on text selection<br>packages/editor/gherkin-spec/insert.block.feature:392 Scenario Outline: Inserting text block on cross-block text selection<br>packages/editor/gherkin-spec/insert.block.feature:424 Scenario Outline: Inserting inline object on block object<br>packages/editor/gherkin-spec/insert.block.feature:435 Scenario Outline: Inserting block object on inline object<br>packages/editor/gherkin-spec/insert.block.feature:446 Scenario Outline: Inserting text block on inline object |
| 5 | `packages/editor/gherkin-tests/insert.blocks.test.ts` | portable | PT-H04 | 8 | packages/editor/gherkin-spec/insert.blocks.feature:1 Feature: Insert Blocks<br>packages/editor/gherkin-spec/insert.blocks.feature:6 Scenario Outline: Inserting blocks on an empty editor<br>packages/editor/gherkin-spec/insert.blocks.feature:23 Scenario Outline: Inserting block objects an empty editor<br>packages/editor/gherkin-spec/insert.blocks.feature:33 Scenario Outline: Inserting blocks on a block object<br>packages/editor/gherkin-spec/insert.blocks.feature:42 Scenario: Inserting text blocks on a block object<br>packages/editor/gherkin-spec/insert.blocks.feature:52 Scenario Outline: Inserting blocks on a text block<br>packages/editor/gherkin-spec/insert.blocks.feature:81 Scenario: Pasting text blocks between two text blocks<br>packages/editor/gherkin-spec/insert.blocks.feature:96 Scenario Outline: Inserting text block with annotation |
| 6 | `packages/editor/gherkin-tests/insert.break.test.ts` | portable | PT-H04 | 6 | packages/editor/gherkin-spec/insert.break.feature:1 Feature: Insert Break<br>packages/editor/gherkin-spec/insert.break.feature:6 Scenario Outline: Breaking text block<br>packages/editor/gherkin-spec/insert.break.feature:21 Scenario Outline: Breaking second text block<br>packages/editor/gherkin-spec/insert.break.feature:43 Scenario: Breaking before inline object<br>packages/editor/gherkin-spec/insert.break.feature:55 Scenario: Pressing Enter when selecting the entire content<br>packages/editor/gherkin-spec/insert.break.feature:74 Scenario: Pressing Enter on a block object |
| 7 | `packages/editor/gherkin-tests/insert.child.test.ts` | portable | PT-H04 | 6 | packages/editor/gherkin-spec/insert.child.feature:1 Feature: Insert Child<br>packages/editor/gherkin-spec/insert.child.feature:6 Scenario Outline: Inserting span on span<br>packages/editor/gherkin-spec/insert.child.feature:23 Scenario: Inserting inline object in span<br>packages/editor/gherkin-spec/insert.child.feature:35 Scenario: Inserting span on block object<br>packages/editor/gherkin-spec/insert.child.feature:51 Scenario: Inserting span on block object without selection<br>packages/editor/gherkin-spec/insert.child.feature:67 Scenario: Inserting span on text block without selection |
| 8 | `packages/editor/gherkin-tests/insert.text.test.ts` | portable | PT-H04 | 2 | packages/editor/gherkin-spec/insert.text.feature:1 Feature: Insert text<br>packages/editor/gherkin-spec/insert.text.feature:6 Scenario Outline: Inserting text on expanded selection |
| 9 | `packages/editor/gherkin-tests/paste.test.ts` | portable-mixed | PT-H06 | 4 | packages/editor/gherkin-spec/paste.feature:1 Feature: Paste<br>packages/editor/gherkin-spec/paste.feature:6 Scenario Outline: Pasting text block into a text block<br>packages/editor/gherkin-spec/paste.feature:32 Scenario: Pasting text/plain into a text block<br>packages/editor/gherkin-spec/paste.feature:40 Scenario: Pasting text/html into a text block |
| 10 | `packages/editor/gherkin-tests/removing-blocks.test.ts` | portable | PT-H05 | 3 | packages/editor/gherkin-spec/removing-blocks.feature:1 Feature: Removing Blocks<br>packages/editor/gherkin-spec/removing-blocks.feature:7 Scenario: Pressing Delete in empty block with text below<br>packages/editor/gherkin-spec/removing-blocks.feature:28 Scenario: Pressing Backspace in empty block with text below |
| 11 | `packages/editor/gherkin-tests/selection-adjustment.test.ts` | portable | PT-H01 | 4 | packages/editor/gherkin-spec/selection-adjustment.feature:1 Feature: Selection Adjustment<br>packages/editor/gherkin-spec/selection-adjustment.feature:7 Scenario: Selection is kept if another editor inserts a line above<br>packages/editor/gherkin-spec/selection-adjustment.feature:16 Scenario: Selection is kept if another editor deletes the line above<br>packages/editor/gherkin-spec/selection-adjustment.feature:25 Scenario: Selection is kept if another editor backspace-deletes empty lines above |
| 12 | `packages/editor/gherkin-tests/selection.test.ts` | portable | PT-H01 | 5 | packages/editor/gherkin-spec/selection.feature:1 Feature: Selection<br>packages/editor/gherkin-spec/selection.feature:6 Scenario: Expanding collapsed selection backwards from empty line<br>packages/editor/gherkin-spec/selection.feature:14 Scenario: Expanding selection backwards, then forwards<br>packages/editor/gherkin-spec/selection.feature:30 Scenario: Reducing hanging selection<br>packages/editor/gherkin-spec/selection.feature:46 Scenario: Reducing selection hanging onto empty line |
| 13 | `packages/editor/gherkin-tests/splitting-blocks.test.ts` | portable | PT-H04 | 19 | packages/editor/gherkin-spec/splitting-blocks.feature:1 Feature: Splitting Blocks<br>packages/editor/gherkin-spec/splitting-blocks.feature:7 Scenario: Splitting block at the beginning<br>packages/editor/gherkin-spec/splitting-blocks.feature:17 Scenario: Splitting block in the middle<br>packages/editor/gherkin-spec/splitting-blocks.feature:31 Scenario: Splitting block at the end<br>packages/editor/gherkin-spec/splitting-blocks.feature:45 Scenario: Splitting empty block creates a new block below<br>packages/editor/gherkin-spec/splitting-blocks.feature:57 Scenario: Soft-splitting block at the beginning<br>packages/editor/gherkin-spec/splitting-blocks.feature:67 Scenario: Soft-splitting block in the middle<br>packages/editor/gherkin-spec/splitting-blocks.feature:77 Scenario: Soft-splitting block at the end<br>packages/editor/gherkin-spec/splitting-blocks.feature:87 Scenario: Splitting styled block at the beginning<br>packages/editor/gherkin-spec/splitting-blocks.feature:97 Scenario: Splitting styled block in the middle<br>packages/editor/gherkin-spec/splitting-blocks.feature:111 Scenario: Splitting styled block at the end<br>packages/editor/gherkin-spec/splitting-blocks.feature:125 Scenario: Soft-splitting styled block at the beginning<br>packages/editor/gherkin-spec/splitting-blocks.feature:135 Scenario: Soft-splitting styled block in the middle<br>packages/editor/gherkin-spec/splitting-blocks.feature:145 Scenario: Soft-splitting styled block at the end<br>packages/editor/gherkin-spec/splitting-blocks.feature:155 Scenario: Splitting decorated styled block at the beginning<br>packages/editor/gherkin-spec/splitting-blocks.feature:170 Scenario Outline: Splitting decorated styled block in the middle<br>packages/editor/gherkin-spec/splitting-blocks.feature:188 Scenario: Splitting decorated styled block at the end<br>packages/editor/gherkin-spec/splitting-blocks.feature:203 Scenario Outline: Splitting block with an expanded selection<br>packages/editor/gherkin-spec/splitting-blocks.feature:219 Scenario: Pressing Enter when selecting multiple block objects |
| 14 | `packages/editor/gherkin-tests/undo-redo.test.tsx` | portable | PT-H08 | 17 | packages/editor/gherkin-spec/undo-redo.feature:1 Feature: Undo/Redo<br>packages/editor/gherkin-spec/undo-redo.feature:6 Scenario: Undoing writing two words<br>packages/editor/gherkin-spec/undo-redo.feature:14 Scenario: Selection change does not affect the undo stack<br>packages/editor/gherkin-spec/undo-redo.feature:24 Scenario: Undoing annotation<br>packages/editor/gherkin-spec/undo-redo.feature:31 Scenario: Undoing the deletion of the last char of annotated text<br>packages/editor/gherkin-spec/undo-redo.feature:43 Scenario: Redoing the deletion of the last char of annotated text<br>packages/editor/gherkin-spec/undo-redo.feature:56 Scenario: Undoing inserting text after annotated text<br>packages/editor/gherkin-spec/undo-redo.feature:72 Scenario: Undoing and redoing inserting text after annotated text<br>packages/editor/gherkin-spec/undo-redo.feature:89 Scenario: Undoing the deletion of block with annotation at the end<br>packages/editor/gherkin-spec/undo-redo.feature:101 Scenario: Undoing deletion of annotated block<br>packages/editor/gherkin-spec/undo-redo.feature:112 Scenario: Undoing annotation across text blocks<br>packages/editor/gherkin-spec/undo-redo.feature:126 Scenario: Undoing action step<br>packages/editor/gherkin-spec/undo-redo.feature:136 Scenario: Consecutive undo after selection change<br>packages/editor/gherkin-spec/undo-redo.feature:145 Scenario: Undo after transform on expanded selection<br>packages/editor/gherkin-spec/undo-redo.feature:155 Scenario: Undoing break in the middle of text<br>packages/editor/gherkin-spec/undo-redo.feature:171 Scenario: Undoing delete backward across blocks<br>packages/editor/gherkin-spec/undo-redo.feature:191 Scenario: Undoing and redoing break |
| 15 | `packages/editor/src/behaviors/fit-blocks-to-destination.test.ts` | portable | PT-H04 | 8 | packages/editor/src/behaviors/fit-blocks-to-destination.test.ts:135 describe: fitBlocksToDestination.name<br>packages/editor/src/behaviors/fit-blocks-to-destination.test.ts:136 test: returns empty when input is empty<br>packages/editor/src/behaviors/fit-blocks-to-destination.test.ts:144 test: returns input unchanged when no selection<br>packages/editor/src/behaviors/fit-blocks-to-destination.test.ts:157 test: keeps a block whose type is accepted at the destination<br>packages/editor/src/behaviors/fit-blocks-to-destination.test.ts:165 test: keeps a block-object whose type is accepted at the destination<br>packages/editor/src/behaviors/fit-blocks-to-destination.test.ts:173 test: descends a table into a cell whose content accepts only blocks<br>packages/editor/src/behaviors/fit-blocks-to-destination.test.ts:209 test: drops a block-object that is not accepted and has no accepted descendants<br>packages/editor/src/behaviors/fit-blocks-to-destination.test.ts:241 test: filters a mixed payload to only blocks accepted at the destination |
| 16 | `packages/editor/src/editor/get-selection-state.test.ts` | portable | PT-H01 | 37 | packages/editor/src/editor/get-selection-state.test.ts:6 describe: getSelectionState.name<br>packages/editor/src/editor/get-selection-state.test.ts:7 test: returns defaults when selection is null<br>packages/editor/src/editor/get-selection-state.test.ts:18 describe: collapsed selection on a root text block span<br>packages/editor/src/editor/get-selection-state.test.ts:33 test: focused leaf is the span<br>packages/editor/src/editor/get-selection-state.test.ts:37 test: focused container is the text block<br>packages/editor/src/editor/get-selection-state.test.ts:43 test: selected leaves contain only the span<br>packages/editor/src/editor/get-selection-state.test.ts:49 test: selected containers contain only the text block<br>packages/editor/src/editor/get-selection-state.test.ts:56 describe: collapsed selection on a root void block object<br>packages/editor/src/editor/get-selection-state.test.ts:67 test: focused leaf is the image<br>packages/editor/src/editor/get-selection-state.test.ts:71 test: no focused container (image is root-level leaf)<br>packages/editor/src/editor/get-selection-state.test.ts:75 test: selected leaves contain the image<br>packages/editor/src/editor/get-selection-state.test.ts:81 test: no selected containers<br>packages/editor/src/editor/get-selection-state.test.ts:86 describe: collapsed selection on an inline object in a text block<br>packages/editor/src/editor/get-selection-state.test.ts:101 test: focused leaf is the inline object<br>packages/editor/src/editor/get-selection-state.test.ts:105 test: focused container is the text block<br>packages/editor/src/editor/get-selection-state.test.ts:112 describe: collapsed selection inside a table cell<br>packages/editor/src/editor/get-selection-state.test.ts:133 test: focused leaf is the span<br>packages/editor/src/editor/get-selection-state.test.ts:137 test: focused container is the nearest ancestor (text block)<br>packages/editor/src/editor/get-selection-state.test.ts:151 test: all container ancestors are in selectedContainerPaths<br>packages/editor/src/editor/get-selection-state.test.ts:180 test: the span is in selectedLeafPaths<br>packages/editor/src/editor/get-selection-state.test.ts:187 describe: collapsed selection on an inline object inside a table cell<br>packages/editor/src/editor/get-selection-state.test.ts:208 test: focused leaf is the inline object<br>packages/editor/src/editor/get-selection-state.test.ts:212 test: focused container is the nearest text block<br>packages/editor/src/editor/get-selection-state.test.ts:227 describe: expanded selection within a text block<br>packages/editor/src/editor/get-selection-state.test.ts:247 test: no focused leaf (selection is expanded)<br>packages/editor/src/editor/get-selection-state.test.ts:251 test: no focused container (selection is expanded)<br>packages/editor/src/editor/get-selection-state.test.ts:255 test: selected leaves include all three children of the text block<br>packages/editor/src/editor/get-selection-state.test.ts:269 test: selected containers include the text block<br>packages/editor/src/editor/get-selection-state.test.ts:276 describe: expanded selection across two root text blocks<br>packages/editor/src/editor/get-selection-state.test.ts:296 test: selected containers include both text blocks<br>packages/editor/src/editor/get-selection-state.test.ts:305 test: selected leaves include all children of both text blocks plus the image between them<br>packages/editor/src/editor/get-selection-state.test.ts:326 describe: expanded selection across table cells<br>packages/editor/src/editor/get-selection-state.test.ts:358 test: selected containers include the table, row, both cells, and text blocks in range<br>packages/editor/src/editor/get-selection-state.test.ts:412 test: selected leaves include spans and inline objects across both cells<br>packages/editor/src/editor/get-selection-state.test.ts:444 describe: backward selection across an inline object (shift+left from after inline)<br>packages/editor/src/editor/get-selection-state.test.ts:468 test: inline object between anchor and focus is in selectedLeafPaths<br>packages/editor/src/editor/get-selection-state.test.ts:482 test: text block is in selectedContainerPaths |
| 17 | `packages/editor/src/editor/resolve-element-drop-position.test.ts` | portable-mixed | PT-H07 | 6 | packages/editor/src/editor/resolve-element-drop-position.test.ts:4 describe: resolveElementDropPosition.name<br>packages/editor/src/editor/resolve-element-drop-position.test.ts:5 test: returns undefined when no drop position is active<br>packages/editor/src/editor/resolve-element-drop-position.test.ts:11 test: matches the drop target by full path<br>packages/editor/src/editor/resolve-element-drop-position.test.ts:25 test: returns undefined when the element is not the drop target<br>packages/editor/src/editor/resolve-element-drop-position.test.ts:33 test: does not match a deep block that shares a key with the drop target at root<br>packages/editor/src/editor/resolve-element-drop-position.test.ts:48 test: matches a deep block targeted by its full path |
| 18 | `packages/editor/src/editor/validate-selection-machine.test.ts` | portable | PT-H01 | 2 | packages/editor/src/editor/validate-selection-machine.test.ts:7 describe: validateSelectionMachine.id<br>packages/editor/src/editor/validate-selection-machine.test.ts:8 test: Scenario: Does not validate selection while the engine has pending operations |
| 19 | `packages/editor/src/engine/editor/unhang-range.test.ts` | portable | PT-H01 | 15 | packages/editor/src/engine/editor/unhang-range.test.ts:91 describe: unhangRange.name<br>packages/editor/src/engine/editor/unhang-range.test.ts:92 test: Returns the input range when collapsed<br>packages/editor/src/engine/editor/unhang-range.test.ts:99 test: Returns the input range when end is mid-text<br>packages/editor/src/engine/editor/unhang-range.test.ts:109 test: Returns the input range when end has a previous sibling<br>packages/editor/src/engine/editor/unhang-range.test.ts:145 test: Pulls a hanging focus back to the end of the previous block<br>packages/editor/src/engine/editor/unhang-range.test.ts:157 test: Pulls a hanging focus back across multiple text blocks<br>packages/editor/src/engine/editor/unhang-range.test.ts:168 test: Lands on an empty span when it is the last span before the end block<br>packages/editor/src/engine/editor/unhang-range.test.ts:181 test: Preserves the range when a void block sits between the endpoints<br>packages/editor/src/engine/editor/unhang-range.test.ts:191 test: Preserves the range when end is at offset 0 of a void block<br>packages/editor/src/engine/editor/unhang-range.test.ts:360 describe: ${expr} (container-aware)<br>packages/editor/src/engine/editor/unhang-range.test.ts:361 test: Preserves the range when an editable container sits between the endpoints<br>packages/editor/src/engine/editor/unhang-range.test.ts:368 test: Pulls a hanging focus back inside a container when both endpoints are inside it<br>packages/editor/src/engine/editor/unhang-range.test.ts:381 test: Pulls a hanging focus when end is inside a container and start is outside<br>packages/editor/src/engine/editor/unhang-range.test.ts:391 test: Pulls a hanging focus when start is inside a container and end is outside<br>packages/editor/src/engine/editor/unhang-range.test.ts:401 test: Preserves the range when multiple editable containers sit between endpoints |
| 20 | `packages/editor/src/engine/node/is-void-node.test.ts` | portable | PT-H03 | 26 | packages/editor/src/engine/node/is-void-node.test.ts:17 describe: isVoidNode.name<br>packages/editor/src/engine/node/is-void-node.test.ts:20 describe: root-level nodes<br>packages/editor/src/engine/node/is-void-node.test.ts:21 test: text block is not void<br>packages/editor/src/engine/node/is-void-node.test.ts:27 test: block object without container registration is void<br>packages/editor/src/engine/node/is-void-node.test.ts:33 test: block object with container registration is not void<br>packages/editor/src/engine/node/is-void-node.test.ts:39 test: code block with container registration is not void<br>packages/editor/src/engine/node/is-void-node.test.ts:46 describe: inline objects<br>packages/editor/src/engine/node/is-void-node.test.ts:47 test: inline object at root level is void<br>packages/editor/src/engine/node/is-void-node.test.ts:57 test: inline object inside container is void<br>packages/editor/src/engine/node/is-void-node.test.ts:74 describe: nested container nodes<br>packages/editor/src/engine/node/is-void-node.test.ts:75 test: row inside table is not void<br>packages/editor/src/engine/node/is-void-node.test.ts:85 test: cell inside table row is not void<br>packages/editor/src/engine/node/is-void-node.test.ts:98 describe: text nodes inside containers<br>packages/editor/src/engine/node/is-void-node.test.ts:99 test: text block inside container is not void<br>packages/editor/src/engine/node/is-void-node.test.ts:113 test: span inside container is not void<br>packages/editor/src/engine/node/is-void-node.test.ts:129 test: text block inside code block is not void<br>packages/editor/src/engine/node/is-void-node.test.ts:140 describe: block objects inside containers<br>packages/editor/src/engine/node/is-void-node.test.ts:226 test: image inside cell is void<br>packages/editor/src/engine/node/is-void-node.test.ts:240 test: text block inside cell is not void<br>packages/editor/src/engine/node/is-void-node.test.ts:255 describe: gallery with void-only children<br>packages/editor/src/engine/node/is-void-node.test.ts:298 test: gallery is not void<br>packages/editor/src/engine/node/is-void-node.test.ts:302 test: image inside gallery is void<br>packages/editor/src/engine/node/is-void-node.test.ts:308 test: root image and gallery image are both void<br>packages/editor/src/engine/node/is-void-node.test.ts:329 describe: empty containers<br>packages/editor/src/engine/node/is-void-node.test.ts:330 test: all object nodes are void when no containers are registered<br>packages/editor/src/engine/node/is-void-node.test.ts:347 test: text blocks are never void regardless of container registration |
| 21 | `packages/editor/src/engine/operation/inverse-operation.test.ts` | portable | PT-H11 | 9 | packages/editor/src/engine/operation/inverse-operation.test.ts:5 describe: inverseOperation.name<br>packages/editor/src/engine/operation/inverse-operation.test.ts:6 test: insert -> unset<br>packages/editor/src/engine/operation/inverse-operation.test.ts:20 test: unset (node removal) -> insert<br>packages/editor/src/engine/operation/inverse-operation.test.ts:39 test: unset (node removal) first child -> insert before<br>packages/editor/src/engine/operation/inverse-operation.test.ts:58 test: insert_text -> remove_text<br>packages/editor/src/engine/operation/inverse-operation.test.ts:73 test: remove_text -> insert_text<br>packages/editor/src/engine/operation/inverse-operation.test.ts:88 test: set with existing property inverts to set with old value<br>packages/editor/src/engine/operation/inverse-operation.test.ts:103 test: set with new property inverts to unset<br>packages/editor/src/engine/operation/inverse-operation.test.ts:121 test: unset (property removal) inverts to set with old value |
| 22 | `packages/editor/src/engine/path/compare-paths.test.ts` | portable | PT-H11 | 9 | packages/editor/src/engine/path/compare-paths.test.ts:7 describe: comparePaths.name<br>packages/editor/src/engine/path/compare-paths.test.ts:8 test: equal keyed paths return 0<br>packages/editor/src/engine/path/compare-paths.test.ts:18 test: equal numeric paths return 0<br>packages/editor/src/engine/path/compare-paths.test.ts:22 test: prefix paths return 0<br>packages/editor/src/engine/path/compare-paths.test.ts:39 test: numeric ordering<br>packages/editor/src/engine/path/compare-paths.test.ts:44 test: string ordering<br>packages/editor/src/engine/path/compare-paths.test.ts:54 test: keyed ordering with root<br>packages/editor/src/engine/path/compare-paths.test.ts:62 test: keyed ordering falls back to string comparison when keys are not in root<br>packages/editor/src/engine/path/compare-paths.test.ts:66 test: keyed ordering with root resolves out-of-order keys |
| 23 | `packages/editor/src/engine/path/parent-path.test.ts` | portable | PT-H11 | 6 | packages/editor/src/engine/path/parent-path.test.ts:4 describe: parentPath.name<br>packages/editor/src/engine/path/parent-path.test.ts:5 test: block path<br>packages/editor/src/engine/path/parent-path.test.ts:9 test: span path<br>packages/editor/src/engine/path/parent-path.test.ts:15 test: numeric child<br>packages/editor/src/engine/path/parent-path.test.ts:19 test: deep container path<br>packages/editor/src/engine/path/parent-path.test.ts:25 test: throws on empty path |
| 24 | `packages/editor/src/engine/path/path-levels.test.ts` | portable | PT-H11 | 7 | packages/editor/src/engine/path/path-levels.test.ts:4 describe: pathLevels.name<br>packages/editor/src/engine/path/path-levels.test.ts:5 test: empty path<br>packages/editor/src/engine/path/path-levels.test.ts:9 test: keyed block path<br>packages/editor/src/engine/path/path-levels.test.ts:13 test: keyed block and span<br>packages/editor/src/engine/path/path-levels.test.ts:21 test: numeric path<br>packages/editor/src/engine/path/path-levels.test.ts:25 test: mixed numeric and keyed<br>packages/editor/src/engine/path/path-levels.test.ts:33 test: string-only segments are skipped |
| 25 | `packages/editor/src/engine/path/sibling-path.test.ts` | portable | PT-H11 | 8 | packages/editor/src/engine/path/sibling-path.test.ts:4 describe: siblingPath.name<br>packages/editor/src/engine/path/sibling-path.test.ts:5 test: root-level sibling<br>packages/editor/src/engine/path/sibling-path.test.ts:9 test: span-level sibling inside text block<br>packages/editor/src/engine/path/sibling-path.test.ts:15 test: line sibling inside code-block<br>packages/editor/src/engine/path/sibling-path.test.ts:23 test: cell sibling inside nested table<br>packages/editor/src/engine/path/sibling-path.test.ts:32 test: throws on root path<br>packages/editor/src/engine/path/sibling-path.test.ts:38 test: throws when last segment is not keyed<br>packages/editor/src/engine/path/sibling-path.test.ts:44 test: throws when last segment is numeric |
| 26 | `packages/editor/src/engine/point/transform-point.test.ts` | portable | PT-H01 | 14 | packages/editor/src/engine/point/transform-point.test.ts:5 describe: transformPoint.name<br>packages/editor/src/engine/point/transform-point.test.ts:6 test: null point returns null<br>packages/editor/src/engine/point/transform-point.test.ts:16 test: insert_text adjusts offset forward<br>packages/editor/src/engine/point/transform-point.test.ts:33 test: insert_text before offset is no-op<br>packages/editor/src/engine/point/transform-point.test.ts:50 test: insert_text different path is no-op<br>packages/editor/src/engine/point/transform-point.test.ts:67 test: remove_text adjusts offset backward<br>packages/editor/src/engine/point/transform-point.test.ts:84 test: unset (node removal) at point returns null<br>packages/editor/src/engine/point/transform-point.test.ts:96 test: unset (node removal) ancestor of point returns null<br>packages/editor/src/engine/point/transform-point.test.ts:108 test: unset (node removal) different path is no-op<br>packages/editor/src/engine/point/transform-point.test.ts:123 test: insert is no-op<br>packages/editor/src/engine/point/transform-point.test.ts:140 test: set_selection is no-op<br>packages/editor/src/engine/point/transform-point.test.ts:159 test: set _key substitutes old key with new key<br>packages/editor/src/engine/point/transform-point.test.ts:180 test: set non-key property is no-op on path<br>packages/editor/src/engine/point/transform-point.test.ts:201 test: unset text collapses offset |
| 27 | `packages/editor/src/engine/range/ranges-overlap.test.ts` | portable | PT-H01 | 11 | packages/editor/src/engine/range/ranges-overlap.test.ts:23 describe: rangesOverlap.name<br>packages/editor/src/engine/range/ranges-overlap.test.ts:24 test: disjoint ranges in same span<br>packages/editor/src/engine/range/ranges-overlap.test.ts:40 test: disjoint ranges across blocks<br>packages/editor/src/engine/range/ranges-overlap.test.ts:56 test: touching at one endpoint<br>packages/editor/src/engine/range/ranges-overlap.test.ts:72 test: partial overlap<br>packages/editor/src/engine/range/ranges-overlap.test.ts:88 test: full containment<br>packages/editor/src/engine/range/ranges-overlap.test.ts:104 test: identical ranges<br>packages/editor/src/engine/range/ranges-overlap.test.ts:112 test: two collapsed ranges at the same point<br>packages/editor/src/engine/range/ranges-overlap.test.ts:126 test: two collapsed ranges at different points<br>packages/editor/src/engine/range/ranges-overlap.test.ts:142 test: collapsed range inside expanded range<br>packages/editor/src/engine/range/ranges-overlap.test.ts:158 test: backward range overlapping forward range |
| 28 | `packages/editor/src/internal-utils/__tests__/ranges.test.ts` | portable | PT-H01 | 2 | packages/editor/src/internal-utils/__tests__/ranges.test.ts:6 describe: moveRangeByOperation<br>packages/editor/src/internal-utils/__tests__/ranges.test.ts:7 it: should move range when inserting text in front of it |
| 29 | `packages/editor/src/internal-utils/__tests__/values.test.ts` | portable | PT-H11 | 4 | packages/editor/src/internal-utils/__tests__/values.test.ts:7 describe: toEngineBlock.name<br>packages/editor/src/internal-utils/__tests__/values.test.ts:8 it: given type is custom with no custom properties, should be a leaf node<br>packages/editor/src/internal-utils/__tests__/values.test.ts:23 it: given type is block<br>packages/editor/src/internal-utils/__tests__/values.test.ts:51 it: given type is block and has custom in children |
| 30 | `packages/editor/src/internal-utils/apply-selection.test.ts` | portable | PT-H01 | 9 | packages/editor/src/internal-utils/apply-selection.test.ts:7 describe: resolveSelection.name<br>packages/editor/src/internal-utils/apply-selection.test.ts:17 test: Scenario: Ambiguous offset inside text block<br>packages/editor/src/internal-utils/apply-selection.test.ts:69 test: Scenario: Offset right before inline object<br>packages/editor/src/internal-utils/apply-selection.test.ts:119 test: Scenario: Block object offset that doesn't exist<br>packages/editor/src/internal-utils/apply-selection.test.ts:153 test: Scenario: Child that doesn't exist<br>packages/editor/src/internal-utils/apply-selection.test.ts:196 test: Scenario: Span offset that doesn't exist<br>packages/editor/src/internal-utils/apply-selection.test.ts:238 test: Scenario: Inline object offset that doesn't exist<br>packages/editor/src/internal-utils/apply-selection.test.ts:286 test: Scenario: Block-level offset inside an editable container<br>packages/editor/src/internal-utils/apply-selection.test.ts:333 test: Scenario: Collapsed block-level offset inside an editable container |
| 31 | `packages/editor/src/internal-utils/build-index-maps.test.ts` | portable | PT-H11 | 15 | packages/editor/src/internal-utils/build-index-maps.test.ts:49 describe: buildIndexMaps.name<br>packages/editor/src/internal-utils/build-index-maps.test.ts:53 test: empty<br>packages/editor/src/internal-utils/build-index-maps.test.ts:62 test: single list item<br>packages/editor/src/internal-utils/build-index-maps.test.ts:74 test: single indented list item<br>packages/editor/src/internal-utils/build-index-maps.test.ts:90 test: two lists broken up by a paragraph<br>packages/editor/src/internal-utils/build-index-maps.test.ts:130 test: two lists broken up by an image<br>packages/editor/src/internal-utils/build-index-maps.test.ts:168 test: numbered lists broken up by a bulleted list<br>packages/editor/src/internal-utils/build-index-maps.test.ts:201 test: numbered list broken up by an indented bulleted list<br>packages/editor/src/internal-utils/build-index-maps.test.ts:229 test: numbered list broken up by a nested bulleted list<br>packages/editor/src/internal-utils/build-index-maps.test.ts:262 test: numbered list broken up by an inverse-indented bulleted list<br>packages/editor/src/internal-utils/build-index-maps.test.ts:295 test: simple indented list<br>packages/editor/src/internal-utils/build-index-maps.test.ts:331 test: reverse indented list<br>packages/editor/src/internal-utils/build-index-maps.test.ts:370 test: complex list<br>packages/editor/src/internal-utils/build-index-maps.test.ts:421 test: bulleted list with indented numbered list<br>packages/editor/src/internal-utils/build-index-maps.test.ts:447 test: indented numbered list broken up by outdented bulleted list |
| 32 | `packages/editor/src/internal-utils/get-unwrap-target.test.ts` | portable | PT-H11 | 11 | packages/editor/src/internal-utils/get-unwrap-target.test.ts:9 describe: getUnwrapTarget.name<br>packages/editor/src/internal-utils/get-unwrap-target.test.ts:10 test: stops at the origin when its parent accepts the payload<br>packages/editor/src/internal-utils/get-unwrap-target.test.ts:90 test: walks up through structural ancestors until root accepts the payload<br>packages/editor/src/internal-utils/get-unwrap-target.test.ts:228 test: no-ops when a non-lonely ancestor blocks the cascade<br>packages/editor/src/internal-utils/get-unwrap-target.test.ts:354 test: returns origin when it sits at the root<br>packages/editor/src/internal-utils/get-unwrap-target.test.ts:404 test: returns origin when its parent accepts a mixed payload directly<br>packages/editor/src/internal-utils/get-unwrap-target.test.ts:487 test: walks up to root when a mixed payload needs to escape a rejecting parent<br>packages/editor/src/internal-utils/get-unwrap-target.test.ts:568 test: no-ops when root does not accept every payload type<br>packages/editor/src/internal-utils/get-unwrap-target.test.ts:648 test: no-ops when the origin has a sibling at the same level<br>packages/editor/src/internal-utils/get-unwrap-target.test.ts:740 test: stops at an intermediate ancestor when its parent accepts the payload<br>packages/editor/src/internal-utils/get-unwrap-target.test.ts:846 test: no-ops when origin sits at the root and root rejects part of the payload |
| 33 | `packages/editor/src/internal-utils/is-hotkey.test.ts` | portable | PT-H11 | 1 | packages/editor/src/internal-utils/is-hotkey.test.ts:106 test: isHotkey.name |
| 34 | `packages/editor/src/internal-utils/operation-to-patches.test.ts` | portable | PT-H11 | 13 | packages/editor/src/internal-utils/operation-to-patches.test.ts:65 describe: insertNodePatch.name<br>packages/editor/src/internal-utils/operation-to-patches.test.ts:66 test: Scenario: Inserting block object on empty editor<br>packages/editor/src/internal-utils/operation-to-patches.test.ts:93 describe: operationToPatches<br>packages/editor/src/internal-utils/operation-to-patches.test.ts:99 it: produce correct insert block patch<br>packages/editor/src/internal-utils/operation-to-patches.test.ts:133 it: produce correct insert block patch with an empty editor<br>packages/editor/src/internal-utils/operation-to-patches.test.ts:167 test: produce correct insert child patch<br>packages/editor/src/internal-utils/operation-to-patches.test.ts:208 it: produce correct insert text patch<br>packages/editor/src/internal-utils/operation-to-patches.test.ts:244 it: returns empty patches when block is not a text block<br>packages/editor/src/internal-utils/operation-to-patches.test.ts:281 it: produces correct remove text patch<br>packages/editor/src/internal-utils/operation-to-patches.test.ts:318 describe: defensive setIfMissing patches<br>packages/editor/src/internal-utils/operation-to-patches.test.ts:324 describe: insertNodePatch.name<br>packages/editor/src/internal-utils/operation-to-patches.test.ts:325 test: includes setIfMissing before inserting a span into children<br>packages/editor/src/internal-utils/operation-to-patches.test.ts:353 test: includes setIfMissing before inserting an inline object into children |
| 35 | `packages/editor/src/internal-utils/transform-operation.test.ts` | portable | PT-H11 | 7 | packages/editor/src/internal-utils/transform-operation.test.ts:30 describe: transformOperation<br>packages/editor/src/internal-utils/transform-operation.test.ts:31 describe: insert patch at block level (path.length === 1)<br>packages/editor/src/internal-utils/transform-operation.test.ts:32 test: returns the operation unchanged (keyed paths are stable)<br>packages/editor/src/internal-utils/transform-operation.test.ts:69 describe: unset patch at block level (path.length === 1)<br>packages/editor/src/internal-utils/transform-operation.test.ts:70 test: drops operation targeting the same block that was removed<br>packages/editor/src/internal-utils/transform-operation.test.ts:90 test: preserves operation targeting a different block<br>packages/editor/src/internal-utils/transform-operation.test.ts:117 test: preserves set_selection operation (no path property) |
| 36 | `packages/editor/src/internal-utils/values.test.ts` | portable | PT-H11 | 12 | packages/editor/src/internal-utils/values.test.ts:6 describe: toEngineBlock.name<br>packages/editor/src/internal-utils/values.test.ts:7 describe: text block<br>packages/editor/src/internal-utils/values.test.ts:8 describe: with span<br>packages/editor/src/internal-utils/values.test.ts:9 test: with _type<br>packages/editor/src/internal-utils/values.test.ts:38 test: without _type<br>packages/editor/src/internal-utils/values.test.ts:67 test: wrong _type<br>packages/editor/src/internal-utils/values.test.ts:97 describe: with inline object<br>packages/editor/src/internal-utils/values.test.ts:98 test: known inline object _type<br>packages/editor/src/internal-utils/values.test.ts:131 test: unknown inline object _type<br>packages/editor/src/internal-utils/values.test.ts:163 describe: with inline object with text prop<br>packages/editor/src/internal-utils/values.test.ts:164 test: known inline object _type<br>packages/editor/src/internal-utils/values.test.ts:197 test: unknown inline object _type |
| 37 | `packages/editor/src/node-traversal/get-ancestor.test.ts` | portable | PT-H11 | 13 | packages/editor/src/node-traversal/get-ancestor.test.ts:8 describe: getAncestor.name<br>packages/editor/src/node-traversal/get-ancestor.test.ts:11 test: empty path returns undefined<br>packages/editor/src/node-traversal/get-ancestor.test.ts:15 test: top-level block returns undefined<br>packages/editor/src/node-traversal/get-ancestor.test.ts:21 test: find text block ancestor of span<br>packages/editor/src/node-traversal/get-ancestor.test.ts:31 test: find text block ancestor of span in cell<br>packages/editor/src/node-traversal/get-ancestor.test.ts:59 test: find cell ancestor of span in cell<br>packages/editor/src/node-traversal/get-ancestor.test.ts:85 test: find row ancestor of span in cell<br>packages/editor/src/node-traversal/get-ancestor.test.ts:105 test: find table ancestor of span in cell<br>packages/editor/src/node-traversal/get-ancestor.test.ts:125 test: no matching ancestor returns undefined<br>packages/editor/src/node-traversal/get-ancestor.test.ts:135 test: match receives path<br>packages/editor/src/node-traversal/get-ancestor.test.ts:159 test: does not check the node itself<br>packages/editor/src/node-traversal/get-ancestor.test.ts:179 test: find code block ancestor of code span<br>packages/editor/src/node-traversal/get-ancestor.test.ts:189 test: returns nearest matching ancestor |
| 38 | `packages/editor/src/node-traversal/get-ancestors-positional-same-type.test.ts` | portable | PT-H11 | 3 | packages/editor/src/node-traversal/get-ancestors-positional-same-type.test.ts:26 describe: getAncestors with same _type under different parents<br>packages/editor/src/node-traversal/get-ancestors-positional-same-type.test.ts:147 test: span path inside table.cell.content resolves all three ancestors<br>packages/editor/src/node-traversal/get-ancestors-positional-same-type.test.ts:164 test: span path inside diagram.cell.markers resolves all three ancestors |
| 39 | `packages/editor/src/node-traversal/get-ancestors.test.ts` | portable | PT-H11 | 11 | packages/editor/src/node-traversal/get-ancestors.test.ts:5 describe: getAncestors.name<br>packages/editor/src/node-traversal/get-ancestors.test.ts:8 test: empty path returns empty array<br>packages/editor/src/node-traversal/get-ancestors.test.ts:12 test: top-level block has no ancestors<br>packages/editor/src/node-traversal/get-ancestors.test.ts:16 test: span in text block has one ancestor<br>packages/editor/src/node-traversal/get-ancestors.test.ts:27 test: span in cell block has four ancestors<br>packages/editor/src/node-traversal/get-ancestors.test.ts:68 test: block in cell has three ancestors<br>packages/editor/src/node-traversal/get-ancestors.test.ts:97 test: cell has two ancestors<br>packages/editor/src/node-traversal/get-ancestors.test.ts:116 test: row has one ancestor<br>packages/editor/src/node-traversal/get-ancestors.test.ts:127 test: code span has two ancestors<br>packages/editor/src/node-traversal/get-ancestors.test.ts:142 test: code line has one ancestor<br>packages/editor/src/node-traversal/get-ancestors.test.ts:153 test: ancestors are ordered from nearest to furthest |
| 40 | `packages/editor/src/node-traversal/get-children-positional-same-type.test.ts` | portable | PT-H11 | 3 | packages/editor/src/node-traversal/get-children-positional-same-type.test.ts:28 describe: getChildren with same _type registered under different parents<br>packages/editor/src/node-traversal/get-children-positional-same-type.test.ts:164 test: getChildren of cell inside table resolves content array<br>packages/editor/src/node-traversal/get-children-positional-same-type.test.ts:177 test: getChildren of cell inside diagram resolves markers array |
| 41 | `packages/editor/src/node-traversal/get-children.test.ts` | portable | PT-H11 | 14 | packages/editor/src/node-traversal/get-children.test.ts:10 describe: getChildren.name<br>packages/editor/src/node-traversal/get-children.test.ts:13 test: root children<br>packages/editor/src/node-traversal/get-children.test.ts:23 test: text block children<br>packages/editor/src/node-traversal/get-children.test.ts:34 test: code block children (code lines)<br>packages/editor/src/node-traversal/get-children.test.ts:41 test: code line children<br>packages/editor/src/node-traversal/get-children.test.ts:52 test: table children (rows)<br>packages/editor/src/node-traversal/get-children.test.ts:59 test: row children (cells)<br>packages/editor/src/node-traversal/get-children.test.ts:74 test: cell with multiple blocks<br>packages/editor/src/node-traversal/get-children.test.ts:111 test: block inside cell children<br>packages/editor/src/node-traversal/get-children.test.ts:154 test: leaf node returns empty array<br>packages/editor/src/node-traversal/get-children.test.ts:160 test: block object without children returns empty array<br>packages/editor/src/node-traversal/get-children.test.ts:164 test: invalid path returns empty array<br>packages/editor/src/node-traversal/get-children.test.ts:168 test: non-editable code block returns empty array<br>packages/editor/src/node-traversal/get-children.test.ts:184 test: non-editable table returns empty array |
| 42 | `packages/editor/src/node-traversal/get-first-child.test.ts` | portable | PT-H11 | 9 | packages/editor/src/node-traversal/get-first-child.test.ts:9 describe: getFirstChild.name<br>packages/editor/src/node-traversal/get-first-child.test.ts:12 test: first descendant from root<br>packages/editor/src/node-traversal/get-first-child.test.ts:19 test: first descendant of text block<br>packages/editor/src/node-traversal/get-first-child.test.ts:26 test: first descendant of code block<br>packages/editor/src/node-traversal/get-first-child.test.ts:33 test: first descendant of table<br>packages/editor/src/node-traversal/get-first-child.test.ts:40 test: leaf node returns undefined<br>packages/editor/src/node-traversal/get-first-child.test.ts:46 test: void block object returns undefined<br>packages/editor/src/node-traversal/get-first-child.test.ts:50 test: invalid path returns undefined<br>packages/editor/src/node-traversal/get-first-child.test.ts:56 test: first of non-editable container returns undefined |
| 43 | `packages/editor/src/node-traversal/get-highest-object-node.test.ts` | portable | PT-H03 | 14 | packages/editor/src/node-traversal/get-highest-object-node.test.ts:5 describe: getHighestObjectNode.name<br>packages/editor/src/node-traversal/get-highest-object-node.test.ts:8 test: empty path returns undefined<br>packages/editor/src/node-traversal/get-highest-object-node.test.ts:12 test: text block returns undefined<br>packages/editor/src/node-traversal/get-highest-object-node.test.ts:18 test: span returns undefined<br>packages/editor/src/node-traversal/get-highest-object-node.test.ts:28 test: block object at path returns itself<br>packages/editor/src/node-traversal/get-highest-object-node.test.ts:34 test: inline object at path returns itself<br>packages/editor/src/node-traversal/get-highest-object-node.test.ts:44 test: editable container at path returns undefined<br>packages/editor/src/node-traversal/get-highest-object-node.test.ts:50 test: span inside cell returns undefined<br>packages/editor/src/node-traversal/get-highest-object-node.test.ts:66 test: cell block returns undefined<br>packages/editor/src/node-traversal/get-highest-object-node.test.ts:80 test: cell returns undefined<br>packages/editor/src/node-traversal/get-highest-object-node.test.ts:92 test: row returns undefined<br>packages/editor/src/node-traversal/get-highest-object-node.test.ts:102 test: code span returns undefined<br>packages/editor/src/node-traversal/get-highest-object-node.test.ts:114 test: inline object in cell returns itself<br>packages/editor/src/node-traversal/get-highest-object-node.test.ts:140 test: invalid path returns undefined |
| 44 | `packages/editor/src/node-traversal/get-last-child.test.ts` | portable | PT-H11 | 9 | packages/editor/src/node-traversal/get-last-child.test.ts:9 describe: getLastChild.name<br>packages/editor/src/node-traversal/get-last-child.test.ts:12 test: last descendant from root<br>packages/editor/src/node-traversal/get-last-child.test.ts:19 test: last descendant of text block<br>packages/editor/src/node-traversal/get-last-child.test.ts:26 test: last descendant of code block<br>packages/editor/src/node-traversal/get-last-child.test.ts:33 test: last descendant of table<br>packages/editor/src/node-traversal/get-last-child.test.ts:40 test: leaf node returns undefined<br>packages/editor/src/node-traversal/get-last-child.test.ts:46 test: void block object returns undefined<br>packages/editor/src/node-traversal/get-last-child.test.ts:50 test: invalid path returns undefined<br>packages/editor/src/node-traversal/get-last-child.test.ts:56 test: last of non-editable container returns undefined |
| 45 | `packages/editor/src/node-traversal/get-leaf.test.ts` | portable | PT-H11 | 14 | packages/editor/src/node-traversal/get-leaf.test.ts:5 describe: getLeaf.name<br>packages/editor/src/node-traversal/get-leaf.test.ts:8 test: first leaf from root (start edge)<br>packages/editor/src/node-traversal/get-leaf.test.ts:14 test: last leaf from root (end edge)<br>packages/editor/src/node-traversal/get-leaf.test.ts:30 test: first leaf from text block<br>packages/editor/src/node-traversal/get-leaf.test.ts:36 test: last leaf from text block<br>packages/editor/src/node-traversal/get-leaf.test.ts:42 test: span is already a leaf<br>packages/editor/src/node-traversal/get-leaf.test.ts:52 test: void block object is a leaf<br>packages/editor/src/node-traversal/get-leaf.test.ts:58 test: inline object is a leaf<br>packages/editor/src/node-traversal/get-leaf.test.ts:68 test: empty document returns undefined<br>packages/editor/src/node-traversal/get-leaf.test.ts:77 test: invalid path returns undefined<br>packages/editor/src/node-traversal/get-leaf.test.ts:90 test: first leaf from code block<br>packages/editor/src/node-traversal/get-leaf.test.ts:102 test: last leaf from code block<br>packages/editor/src/node-traversal/get-leaf.test.ts:114 test: first leaf from table<br>packages/editor/src/node-traversal/get-leaf.test.ts:130 test: last leaf from table |
| 46 | `packages/editor/src/node-traversal/get-node.test.ts` | portable | PT-H11 | 21 | packages/editor/src/node-traversal/get-node.test.ts:9 describe: getNode.name<br>packages/editor/src/node-traversal/get-node.test.ts:12 test: empty path<br>packages/editor/src/node-traversal/get-node.test.ts:16 test: text block<br>packages/editor/src/node-traversal/get-node.test.ts:22 test: span<br>packages/editor/src/node-traversal/get-node.test.ts:32 test: inline object<br>packages/editor/src/node-traversal/get-node.test.ts:42 test: block object<br>packages/editor/src/node-traversal/get-node.test.ts:48 test: second text block<br>packages/editor/src/node-traversal/get-node.test.ts:54 test: out of bounds<br>packages/editor/src/node-traversal/get-node.test.ts:58 test: code block<br>packages/editor/src/node-traversal/get-node.test.ts:64 test: code block -> first line<br>packages/editor/src/node-traversal/get-node.test.ts:74 test: code block -> second line<br>packages/editor/src/node-traversal/get-node.test.ts:84 test: code block -> line -> span<br>packages/editor/src/node-traversal/get-node.test.ts:102 test: table -> row<br>packages/editor/src/node-traversal/get-node.test.ts:112 test: table -> row -> first cell<br>packages/editor/src/node-traversal/get-node.test.ts:130 test: table -> row -> second cell<br>packages/editor/src/node-traversal/get-node.test.ts:148 test: cell -> first block<br>packages/editor/src/node-traversal/get-node.test.ts:170 test: cell -> second block<br>packages/editor/src/node-traversal/get-node.test.ts:192 test: span inside cell block<br>packages/editor/src/node-traversal/get-node.test.ts:218 test: inline object inside cell block<br>packages/editor/src/node-traversal/get-node.test.ts:244 test: second row<br>packages/editor/src/node-traversal/get-node.test.ts:254 test: node inside non-editable container returns undefined |
| 47 | `packages/editor/src/node-traversal/get-nodes.test.ts` | portable | PT-H11 | 38 | packages/editor/src/node-traversal/get-nodes.test.ts:17 describe: getNodes.name<br>packages/editor/src/node-traversal/get-nodes.test.ts:20 test: all nodes from root<br>packages/editor/src/node-traversal/get-nodes.test.ts:55 test: paths are correct<br>packages/editor/src/node-traversal/get-nodes.test.ts:172 test: from a subtree<br>packages/editor/src/node-traversal/get-nodes.test.ts:184 test: from a leaf returns empty<br>packages/editor/src/node-traversal/get-nodes.test.ts:194 test: reverse order<br>packages/editor/src/node-traversal/get-nodes.test.ts:208 test: skips non-editable container internals<br>packages/editor/src/node-traversal/get-nodes.test.ts:233 describe: match predicate<br>packages/editor/src/node-traversal/get-nodes.test.ts:234 test: filters by isSpan<br>packages/editor/src/node-traversal/get-nodes.test.ts:255 test: filters by isTextBlock<br>packages/editor/src/node-traversal/get-nodes.test.ts:275 test: filters with custom predicate on subtree<br>packages/editor/src/node-traversal/get-nodes.test.ts:292 test: match with reverse<br>packages/editor/src/node-traversal/get-nodes.test.ts:306 describe: from/to range<br>packages/editor/src/node-traversal/get-nodes.test.ts:307 test: range within flat blocks<br>packages/editor/src/node-traversal/get-nodes.test.ts:325 test: range within a single block<br>packages/editor/src/node-traversal/get-nodes.test.ts:341 test: range spanning into container<br>packages/editor/src/node-traversal/get-nodes.test.ts:358 test: range within container<br>packages/editor/src/node-traversal/get-nodes.test.ts:394 test: range spanning across cells<br>packages/editor/src/node-traversal/get-nodes.test.ts:435 test: range spanning across rows<br>packages/editor/src/node-traversal/get-nodes.test.ts:475 test: from at document start<br>packages/editor/src/node-traversal/get-nodes.test.ts:491 test: to at document end<br>packages/editor/src/node-traversal/get-nodes.test.ts:519 test: from equals to (single node)<br>packages/editor/src/node-traversal/get-nodes.test.ts:531 test: from equals to (single leaf node)<br>packages/editor/src/node-traversal/get-nodes.test.ts:543 test: from only (no to)<br>packages/editor/src/node-traversal/get-nodes.test.ts:560 test: to only (no from)<br>packages/editor/src/node-traversal/get-nodes.test.ts:578 describe: from/to with match<br>packages/editor/src/node-traversal/get-nodes.test.ts:579 test: range with span filter<br>packages/editor/src/node-traversal/get-nodes.test.ts:592 test: range with text block filter<br>packages/editor/src/node-traversal/get-nodes.test.ts:611 test: range within container with match<br>packages/editor/src/node-traversal/get-nodes.test.ts:640 describe: reverse with from/to<br>packages/editor/src/node-traversal/get-nodes.test.ts:641 test: reverse range within flat blocks<br>packages/editor/src/node-traversal/get-nodes.test.ts:660 test: reverse range within a single block<br>packages/editor/src/node-traversal/get-nodes.test.ts:677 test: reverse range spanning container<br>packages/editor/src/node-traversal/get-nodes.test.ts:695 test: reverse from equals to (single node)<br>packages/editor/src/node-traversal/get-nodes.test.ts:708 test: reverse with match<br>packages/editor/src/node-traversal/get-nodes.test.ts:728 test: reverse range within container<br>packages/editor/src/node-traversal/get-nodes.test.ts:766 describe: getNodeDescendants<br>packages/editor/src/node-traversal/get-nodes.test.ts:767 test: container with value field includes field name in paths |
| 48 | `packages/editor/src/node-traversal/get-parent.test.ts` | portable | PT-H11 | 9 | packages/editor/src/node-traversal/get-parent.test.ts:5 describe: getParent.name<br>packages/editor/src/node-traversal/get-parent.test.ts:8 test: parent of top-level block<br>packages/editor/src/node-traversal/get-parent.test.ts:12 test: parent of span<br>packages/editor/src/node-traversal/get-parent.test.ts:22 test: parent of row<br>packages/editor/src/node-traversal/get-parent.test.ts:32 test: parent of cell<br>packages/editor/src/node-traversal/get-parent.test.ts:44 test: parent of block inside cell<br>packages/editor/src/node-traversal/get-parent.test.ts:64 test: parent of span inside cell block<br>packages/editor/src/node-traversal/get-parent.test.ts:88 test: parent of code line<br>packages/editor/src/node-traversal/get-parent.test.ts:98 test: empty path returns undefined |
| 49 | `packages/editor/src/node-traversal/get-sibling.test.ts` | portable | PT-H11 | 22 | packages/editor/src/node-traversal/get-sibling.test.ts:5 describe: getSibling.name<br>packages/editor/src/node-traversal/get-sibling.test.ts:8 test: empty path returns undefined<br>packages/editor/src/node-traversal/get-sibling.test.ts:13 test: next sibling of first top-level block<br>packages/editor/src/node-traversal/get-sibling.test.ts:19 test: previous sibling of second top-level block<br>packages/editor/src/node-traversal/get-sibling.test.ts:25 test: next sibling of last top-level block returns undefined<br>packages/editor/src/node-traversal/get-sibling.test.ts:31 test: previous sibling of first top-level block returns undefined<br>packages/editor/src/node-traversal/get-sibling.test.ts:37 test: next sibling of span in text block<br>packages/editor/src/node-traversal/get-sibling.test.ts:47 test: previous sibling of last span in text block<br>packages/editor/src/node-traversal/get-sibling.test.ts:57 test: next sibling of last span in text block returns undefined<br>packages/editor/src/node-traversal/get-sibling.test.ts:67 test: previous sibling of first span in text block returns undefined<br>packages/editor/src/node-traversal/get-sibling.test.ts:77 test: next sibling of first block in cell<br>packages/editor/src/node-traversal/get-sibling.test.ts:103 test: previous sibling of second block in cell<br>packages/editor/src/node-traversal/get-sibling.test.ts:129 test: next sibling of last block in cell returns undefined<br>packages/editor/src/node-traversal/get-sibling.test.ts:147 test: next sibling of first cell in row<br>packages/editor/src/node-traversal/get-sibling.test.ts:163 test: previous sibling of second cell in row<br>packages/editor/src/node-traversal/get-sibling.test.ts:179 test: next sibling of first row in table<br>packages/editor/src/node-traversal/get-sibling.test.ts:189 test: previous sibling of second row in table<br>packages/editor/src/node-traversal/get-sibling.test.ts:199 test: next sibling of span inside cell block<br>packages/editor/src/node-traversal/get-sibling.test.ts:229 test: previous sibling of inline object inside cell block<br>packages/editor/src/node-traversal/get-sibling.test.ts:259 test: out of bounds path returns undefined<br>packages/editor/src/node-traversal/get-sibling.test.ts:268 test: next sibling of code line<br>packages/editor/src/node-traversal/get-sibling.test.ts:278 test: previous sibling of second code line |
| 50 | `packages/editor/src/node-traversal/get-text.test.ts` | portable | PT-H11 | 21 | packages/editor/src/node-traversal/get-text.test.ts:5 describe: getText.name<br>packages/editor/src/node-traversal/get-text.test.ts:8 test: text of a text block<br>packages/editor/src/node-traversal/get-text.test.ts:12 test: text of a span<br>packages/editor/src/node-traversal/get-text.test.ts:18 test: text of second span<br>packages/editor/src/node-traversal/get-text.test.ts:24 test: text of an inline object<br>packages/editor/src/node-traversal/get-text.test.ts:30 test: text of a block object with no children<br>packages/editor/src/node-traversal/get-text.test.ts:34 test: text of second text block<br>packages/editor/src/node-traversal/get-text.test.ts:38 test: text of code block<br>packages/editor/src/node-traversal/get-text.test.ts:44 test: text of code line<br>packages/editor/src/node-traversal/get-text.test.ts:50 test: text of code span<br>packages/editor/src/node-traversal/get-text.test.ts:62 test: text of cell block with inline object<br>packages/editor/src/node-traversal/get-text.test.ts:76 test: text of cell span<br>packages/editor/src/node-traversal/get-text.test.ts:92 test: text of second cell block<br>packages/editor/src/node-traversal/get-text.test.ts:106 test: text of cell block in second cell<br>packages/editor/src/node-traversal/get-text.test.ts:120 test: text of empty block<br>packages/editor/src/node-traversal/get-text.test.ts:134 test: text of empty span<br>packages/editor/src/node-traversal/get-text.test.ts:150 test: out of bounds returns undefined<br>packages/editor/src/node-traversal/get-text.test.ts:154 test: empty path returns undefined<br>packages/editor/src/node-traversal/get-text.test.ts:158 test: text of table includes all cell text<br>packages/editor/src/node-traversal/get-text.test.ts:162 test: text of row includes all cell text<br>packages/editor/src/node-traversal/get-text.test.ts:168 test: text of cell includes all block text |
| 51 | `packages/editor/src/node-traversal/get-value.test.ts` | portable | PT-H11 | 19 | packages/editor/src/node-traversal/get-value.test.ts:4 describe: getValue.name<br>packages/editor/src/node-traversal/get-value.test.ts:5 test: resolves root-level node by key<br>packages/editor/src/node-traversal/get-value.test.ts:12 test: resolves string property on a node<br>packages/editor/src/node-traversal/get-value.test.ts:21 test: resolves deep nested property<br>packages/editor/src/node-traversal/get-value.test.ts:30 test: resolves child in nested array by key<br>packages/editor/src/node-traversal/get-value.test.ts:39 test: resolves property on nested child<br>packages/editor/src/node-traversal/get-value.test.ts:48 test: resolves by numeric index<br>packages/editor/src/node-traversal/get-value.test.ts:54 test: returns undefined for missing key<br>packages/editor/src/node-traversal/get-value.test.ts:58 test: returns undefined for missing property<br>packages/editor/src/node-traversal/get-value.test.ts:64 test: returns undefined for property on missing intermediate<br>packages/editor/src/node-traversal/get-value.test.ts:70 test: returns null for property that is null<br>packages/editor/src/node-traversal/get-value.test.ts:76 test: returns null when walking through null intermediate<br>packages/editor/src/node-traversal/get-value.test.ts:82 test: returns undefined when walking through undefined intermediate<br>packages/editor/src/node-traversal/get-value.test.ts:88 test: resolves container depth path<br>packages/editor/src/node-traversal/get-value.test.ts:119 test: resolves deep property on a deeply nested node<br>packages/editor/src/node-traversal/get-value.test.ts:155 test: returns undefined for out-of-bounds numeric index<br>packages/editor/src/node-traversal/get-value.test.ts:159 test: returns undefined for keyed segment on non-array<br>packages/editor/src/node-traversal/get-value.test.ts:168 test: returns undefined for numeric segment on non-array<br>packages/editor/src/node-traversal/get-value.test.ts:174 test: returns undefined for empty path |
| 52 | `packages/editor/src/node-traversal/has-node.test.ts` | portable | PT-H11 | 5 | packages/editor/src/node-traversal/has-node.test.ts:5 describe: hasNode.name<br>packages/editor/src/node-traversal/has-node.test.ts:8 test: root level<br>packages/editor/src/node-traversal/has-node.test.ts:12 test: deep path<br>packages/editor/src/node-traversal/has-node.test.ts:28 test: out of bounds<br>packages/editor/src/node-traversal/has-node.test.ts:32 test: empty path |
| 53 | `packages/editor/src/paths/get-dirty-paths.test.ts` | portable | PT-H11 | 33 | packages/editor/src/paths/get-dirty-paths.test.ts:80 describe: getDirtyPaths.name<br>packages/editor/src/paths/get-dirty-paths.test.ts:81 describe: insert_text / remove_text<br>packages/editor/src/paths/get-dirty-paths.test.ts:82 test: insert_text returns path levels of the operation path<br>packages/editor/src/paths/get-dirty-paths.test.ts:100 test: remove_text returns path levels of the operation path<br>packages/editor/src/paths/get-dirty-paths.test.ts:118 test: insert_text inside callout text block returns path levels at each node boundary<br>packages/editor/src/paths/get-dirty-paths.test.ts:147 test: remove_text inside callout text block returns path levels at each node boundary<br>packages/editor/src/paths/get-dirty-paths.test.ts:177 describe: set<br>packages/editor/src/paths/get-dirty-paths.test.ts:178 test: root-level value replacement dirties root and all children<br>packages/editor/src/paths/get-dirty-paths.test.ts:218 test: single property set dirties node path levels<br>packages/editor/src/paths/get-dirty-paths.test.ts:235 test: _key change uses new key in dirty path<br>packages/editor/src/paths/get-dirty-paths.test.ts:252 test: full node replacement dirties node and descendants<br>packages/editor/src/paths/get-dirty-paths.test.ts:285 test: child array field replacement dirties new children<br>packages/editor/src/paths/get-dirty-paths.test.ts:321 test: root-level value replacement with container children dirties descendants<br>packages/editor/src/paths/get-dirty-paths.test.ts:357 test: property set inside callout dirties node path levels<br>packages/editor/src/paths/get-dirty-paths.test.ts:374 test: _key change inside callout uses new key in dirty path<br>packages/editor/src/paths/get-dirty-paths.test.ts:395 test: full node replacement inside callout dirties node and descendants<br>packages/editor/src/paths/get-dirty-paths.test.ts:435 test: child array replacement inside callout dirties new children<br>packages/editor/src/paths/get-dirty-paths.test.ts:475 test: property set inside table cell dirties node path levels<br>packages/editor/src/paths/get-dirty-paths.test.ts:516 describe: unset<br>packages/editor/src/paths/get-dirty-paths.test.ts:517 test: node removal with keyed last segment returns ancestor paths only<br>packages/editor/src/paths/get-dirty-paths.test.ts:533 test: property removal returns node path levels<br>packages/editor/src/paths/get-dirty-paths.test.ts:549 test: _key unset uses numeric index for keyless node<br>packages/editor/src/paths/get-dirty-paths.test.ts:582 test: numeric last segment returns ancestor paths<br>packages/editor/src/paths/get-dirty-paths.test.ts:598 test: node removal inside callout returns ancestor paths<br>packages/editor/src/paths/get-dirty-paths.test.ts:614 test: property removal inside callout returns node path levels<br>packages/editor/src/paths/get-dirty-paths.test.ts:630 test: _key unset inside callout uses numeric index for keyless node<br>packages/editor/src/paths/get-dirty-paths.test.ts:670 describe: insert<br>packages/editor/src/paths/get-dirty-paths.test.ts:671 test: insert span dirties ancestors and inserted node path<br>packages/editor/src/paths/get-dirty-paths.test.ts:694 test: insert block dirties ancestors, node path, and children<br>packages/editor/src/paths/get-dirty-paths.test.ts:729 test: insert container block dirties ancestors, node path, and nested descendants<br>packages/editor/src/paths/get-dirty-paths.test.ts:767 test: insert span inside callout text block dirties ancestors and inserted node path<br>packages/editor/src/paths/get-dirty-paths.test.ts:797 test: insert block inside callout content dirties ancestors, node path, and children<br>packages/editor/src/paths/get-dirty-paths.test.ts:833 test: insert block inside table cell content dirties ancestors, node path, and children |
| 54 | `packages/editor/src/paths/serialize-path.test.ts` | portable | PT-H11 | 16 | packages/editor/src/paths/serialize-path.test.ts:5 describe: serializePath.name<br>packages/editor/src/paths/serialize-path.test.ts:6 test: single key segment<br>packages/editor/src/paths/serialize-path.test.ts:10 test: block and span<br>packages/editor/src/paths/serialize-path.test.ts:16 test: container path<br>packages/editor/src/paths/serialize-path.test.ts:34 test: key with dot<br>packages/editor/src/paths/serialize-path.test.ts:41 describe: deserializePath.name<br>packages/editor/src/paths/serialize-path.test.ts:42 test: single key segment<br>packages/editor/src/paths/serialize-path.test.ts:46 test: block and span<br>packages/editor/src/paths/serialize-path.test.ts:54 test: container path<br>packages/editor/src/paths/serialize-path.test.ts:72 test: key with dot<br>packages/editor/src/paths/serialize-path.test.ts:81 describe: roundtrip<br>packages/editor/src/paths/serialize-path.test.ts:82 test: single key segment<br>packages/editor/src/paths/serialize-path.test.ts:87 test: block and span<br>packages/editor/src/paths/serialize-path.test.ts:92 test: container path<br>packages/editor/src/paths/serialize-path.test.ts:107 test: key with dot<br>packages/editor/src/paths/serialize-path.test.ts:112 test: key with special characters |
| 55 | `packages/editor/src/plugins/plugin.internal.auto-close-brackets.test.tsx` | portable-mixed | PT-H12 | 3 | packages/editor/src/plugins/plugin.internal.auto-close-brackets.test.tsx:7 describe: AutoCloseBracketsPlugin.name<br>packages/editor/src/plugins/plugin.internal.auto-close-brackets.test.tsx:8 test: One-character text insertion<br>packages/editor/src/plugins/plugin.internal.auto-close-brackets.test.tsx:40 test: Two-character text insertion |
| 56 | `packages/editor/src/priority/priority.sort.test.ts` | portable-mixed | PT-H12 | 16 | packages/editor/src/priority/priority.sort.test.ts:5 describe: sortByPriority.name<br>packages/editor/src/priority/priority.sort.test.ts:6 test: empty array<br>packages/editor/src/priority/priority.sort.test.ts:11 test: single item<br>packages/editor/src/priority/priority.sort.test.ts:17 test: two sets of priorities<br>packages/editor/src/priority/priority.sort.test.ts:65 test: sub-priorities<br>packages/editor/src/priority/priority.sort.test.ts:89 test: direct higher reference<br>packages/editor/src/priority/priority.sort.test.ts:106 test: direct lower reference<br>packages/editor/src/priority/priority.sort.test.ts:121 test: transitive references<br>packages/editor/src/priority/priority.sort.test.ts:141 test: transitive references #2<br>packages/editor/src/priority/priority.sort.test.ts:161 test: references to missing priorities<br>packages/editor/src/priority/priority.sort.test.ts:179 test: references to missing priorities #2<br>packages/editor/src/priority/priority.sort.test.ts:197 test: complex reference chains<br>packages/editor/src/priority/priority.sort.test.ts:225 test: complex reference chains #2<br>packages/editor/src/priority/priority.sort.test.ts:253 test: multiple independent chains<br>packages/editor/src/priority/priority.sort.test.ts:281 test: cyclic references<br>packages/editor/src/priority/priority.sort.test.ts:298 test: missing priorities |
| 57 | `packages/editor/src/renderers/renderer.types.test.tsx` | portable-mixed | PT-H12 | 18 | packages/editor/src/renderers/renderer.types.test.tsx:11 describe: defineContainer.name<br>packages/editor/src/renderers/renderer.types.test.tsx:12 test: returns the config with injected kind: "container"<br>packages/editor/src/renderers/renderer.types.test.tsx:28 test: rejects type: 'span' at compile time<br>packages/editor/src/renderers/renderer.types.test.tsx:38 test: rejects type: 'block' at compile time<br>packages/editor/src/renderers/renderer.types.test.tsx:49 describe: defineSpan.name<br>packages/editor/src/renderers/renderer.types.test.tsx:50 test: returns the config with injected kind: "span"<br>packages/editor/src/renderers/renderer.types.test.tsx:64 test: rejects type: 'block' at compile time<br>packages/editor/src/renderers/renderer.types.test.tsx:74 describe: defineBlockObject.name<br>packages/editor/src/renderers/renderer.types.test.tsx:75 test: returns the config with injected kind: "blockObject"<br>packages/editor/src/renderers/renderer.types.test.tsx:89 test: rejects type: 'block' at compile time<br>packages/editor/src/renderers/renderer.types.test.tsx:98 test: rejects type: 'span' at compile time<br>packages/editor/src/renderers/renderer.types.test.tsx:108 describe: defineInlineObject.name<br>packages/editor/src/renderers/renderer.types.test.tsx:109 test: returns the config with injected kind: "inlineObject"<br>packages/editor/src/renderers/renderer.types.test.tsx:123 test: rejects type: 'block' at compile time<br>packages/editor/src/renderers/renderer.types.test.tsx:132 test: rejects type: 'span' at compile time<br>packages/editor/src/renderers/renderer.types.test.tsx:142 describe: defineTextBlock.name<br>packages/editor/src/renderers/renderer.types.test.tsx:143 test: returns the config with injected kind: "textBlock"<br>packages/editor/src/renderers/renderer.types.test.tsx:157 test: rejects type: 'span' at compile time |
| 58 | `packages/editor/src/schema/get-block-object-schema.test.ts` | portable-mixed | PT-H02 | 4 | packages/editor/src/schema/get-block-object-schema.test.ts:9 describe: getBlockObjectSchema.name<br>packages/editor/src/schema/get-block-object-schema.test.ts:10 test: returns a root-level block-object definition when block is at the document root<br>packages/editor/src/schema/get-block-object-schema.test.ts:33 test: returns an inline-declared type definition when block is inside a container<br>packages/editor/src/schema/get-block-object-schema.test.ts:77 test: returns undefined when the type is unknown at the effective scope |
| 59 | `packages/editor/src/schema/resolve-containers.test.ts` | portable-mixed | PT-H02 | 14 | packages/editor/src/schema/resolve-containers.test.ts:70 describe: resolveNestedContainer.name<br>packages/editor/src/schema/resolve-containers.test.ts:82 test: pre-resolves a top-level container with no `of` overrides<br>packages/editor/src/schema/resolve-containers.test.ts:96 test: pre-resolves nested containers, attaching resolved fields at each level<br>packages/editor/src/schema/resolve-containers.test.ts:177 test: warns with chain context when a nested registration is unresolvable<br>packages/editor/src/schema/resolve-containers.test.ts:260 describe: resolveContainerByPath.name<br>packages/editor/src/schema/resolve-containers.test.ts:272 test: 6. immediate-parent: finds and matches<br>packages/editor/src/schema/resolve-containers.test.ts:310 test: 7. parent has no `of` match: falls back to top-level<br>packages/editor/src/schema/resolve-containers.test.ts:357 test: 8. nested-only chain: descent threads parent through ancestors<br>packages/editor/src/schema/resolve-containers.test.ts:454 test: 9. position-specific descent: same _type in two positions returns position-specific config<br>packages/editor/src/schema/resolve-containers.test.ts:570 test: 10. leaf-ancestor short-circuit: descendants of a leaf-resolved ancestor return undefined<br>packages/editor/src/schema/resolve-containers.test.ts:636 test: 11. path-driven top-level fallthrough: no container ancestor returns containers.get(_type)<br>packages/editor/src/schema/resolve-containers.test.ts:674 describe: descendToParent.name<br>packages/editor/src/schema/resolve-containers.test.ts:675 test: returns undefined when path has no container ancestor<br>packages/editor/src/schema/resolve-containers.test.ts:702 test: returns parent ContainerConfig and parentPath for nested node |
| 60 | `packages/editor/src/selectors/drag-selection.test.ts` | portable-mixed | PT-H07 | 16 | packages/editor/src/selectors/drag-selection.test.ts:8 describe: getDragSelection.name<br>packages/editor/src/selectors/drag-selection.test.ts:66 test: dragging one text block<br>packages/editor/src/selectors/drag-selection.test.ts:93 test: dragging one text block with an existing selection<br>packages/editor/src/selectors/drag-selection.test.ts:120 test: dragging one text block with a selection elsewhere<br>packages/editor/src/selectors/drag-selection.test.ts:156 test: dragging one block object with a selection elsewhere<br>packages/editor/src/selectors/drag-selection.test.ts:192 test: dragging one block object with an expanded selection elsewhere<br>packages/editor/src/selectors/drag-selection.test.ts:228 test: dragging a text block with an expanded selected<br>packages/editor/src/selectors/drag-selection.test.ts:264 test: dragging two text blocks with the top drag handle<br>packages/editor/src/selectors/drag-selection.test.ts:300 test: dragging two text blocks with the bottom drag handle<br>packages/editor/src/selectors/drag-selection.test.ts:336 test: dragging a block object with an expanded selected<br>packages/editor/src/selectors/drag-selection.test.ts:372 test: dragging inline object<br>packages/editor/src/selectors/drag-selection.test.ts:399 test: dragging inline object already selected<br>packages/editor/src/selectors/drag-selection.test.ts:435 test: dragging inline object with selection elsewhere<br>packages/editor/src/selectors/drag-selection.test.ts:471 test: dragging inline object with expanded selection elsewhere<br>packages/editor/src/selectors/drag-selection.test.ts:507 test: dragging inline object in an expanded selection<br>packages/editor/src/selectors/drag-selection.test.ts:543 test: dragging text block with inline object selected |
| 61 | `packages/editor/src/selectors/selector.get-applicable-schema.test.ts` | portable-mixed | PT-H02 | 9 | packages/editor/src/selectors/selector.get-applicable-schema.test.ts:80 describe: getApplicableSchema.name<br>packages/editor/src/selectors/selector.get-applicable-schema.test.ts:81 test: returns empty sets when the selection is null<br>packages/editor/src/selectors/selector.get-applicable-schema.test.ts:98 test: returns the focus block sub-schema when the caret is in a single text block<br>packages/editor/src/selectors/selector.get-applicable-schema.test.ts:129 test: returns the union of text-only categories across the selection<br>packages/editor/src/selectors/selector.get-applicable-schema.test.ts:171 test: returns empty text-only sets when the selection is on a void block<br>packages/editor/src/selectors/selector.get-applicable-schema.test.ts:198 describe: compareApplicableSchema.name<br>packages/editor/src/selectors/selector.get-applicable-schema.test.ts:199 test: returns true for byte-identical results<br>packages/editor/src/selectors/selector.get-applicable-schema.test.ts:211 test: returns true when sets contain the same names<br>packages/editor/src/selectors/selector.get-applicable-schema.test.ts:231 test: returns false when any set differs |
| 62 | `packages/editor/src/selectors/selector.get-caret-word-selection.test.ts` | portable | PT-H01 | 7 | packages/editor/src/selectors/selector.get-caret-word-selection.test.ts:20 describe: getCaretWordSelection.name<br>packages/editor/src/selectors/selector.get-caret-word-selection.test.ts:21 test: empty block<br>packages/editor/src/selectors/selector.get-caret-word-selection.test.ts:53 test: inline object<br>packages/editor/src/selectors/selector.get-caret-word-selection.test.ts:85 test: between inline objects<br>packages/editor/src/selectors/selector.get-caret-word-selection.test.ts:127 test: word between inline objects<br>packages/editor/src/selectors/selector.get-caret-word-selection.test.ts:178 test: no formatting<br>packages/editor/src/selectors/selector.get-caret-word-selection.test.ts:219 test: mixed formatting |
| 63 | `packages/editor/src/selectors/selector.get-fragment.test.ts` | portable-mixed | PT-H12 | 6 | packages/editor/src/selectors/selector.get-fragment.test.ts:76 describe: getFragment.name<br>packages/editor/src/selectors/selector.get-fragment.test.ts:77 test: returns empty when there is no selection<br>packages/editor/src/selectors/selector.get-fragment.test.ts:87 test: passes the envelope through unchanged when selection spans root siblings<br>packages/editor/src/selectors/selector.get-fragment.test.ts:107 test: unwraps a callout envelope when the selection is wholly inside it<br>packages/editor/src/selectors/selector.get-fragment.test.ts:139 test: unwraps a table cell envelope when the selection covers two text blocks inside one cell<br>packages/editor/src/selectors/selector.get-fragment.test.ts:256 test: keeps the table envelope when the selection spans two cells in one row |
| 64 | `packages/editor/src/selectors/selector.get-selected-blocks.test.ts` | portable-mixed | PT-H12 | 3 | packages/editor/src/selectors/selector.get-selected-blocks.test.ts:13 describe: getSelectedBlocks.name<br>packages/editor/src/selectors/selector.get-selected-blocks.test.ts:14 test: returns root-level blocks the selection covers<br>packages/editor/src/selectors/selector.get-selected-blocks.test.ts:52 test: returns the enclosing container when the selection is inside one |
| 65 | `packages/editor/src/selectors/selector.get-selected-spans.test.ts` | portable-mixed | PT-H12 | 10 | packages/editor/src/selectors/selector.get-selected-spans.test.ts:40 describe: getSelectedSpans.name<br>packages/editor/src/selectors/selector.get-selected-spans.test.ts:53 test: selecting a single span<br>packages/editor/src/selectors/selector.get-selected-spans.test.ts:75 test: selecting from start-span to start-span<br>packages/editor/src/selectors/selector.get-selected-spans.test.ts:97 test: selection from mid-span to mid-span<br>packages/editor/src/selectors/selector.get-selected-spans.test.ts:123 test: selecting from end-span to end-span<br>packages/editor/src/selectors/selector.get-selected-spans.test.ts:145 test: selecting from start-span to start-span across blocks<br>packages/editor/src/selectors/selector.get-selected-spans.test.ts:167 test: selecting from mid-span to mid-span across blocks<br>packages/editor/src/selectors/selector.get-selected-spans.test.ts:197 test: selecting from end-span to end-span across blocks<br>packages/editor/src/selectors/selector.get-selected-spans.test.ts:219 test: selecting from block object to empty span<br>packages/editor/src/selectors/selector.get-selected-spans.test.ts:252 test: selecting broken-up annotation |
| 66 | `packages/editor/src/selectors/selector.get-selected-text-blocks.test.ts` | portable-mixed | PT-H12 | 3 | packages/editor/src/selectors/selector.get-selected-text-blocks.test.ts:13 describe: getSelectedTextBlocks.name<br>packages/editor/src/selectors/selector.get-selected-text-blocks.test.ts:14 test: returns text blocks at the root when the selection is at the root<br>packages/editor/src/selectors/selector.get-selected-text-blocks.test.ts:52 test: returns text blocks from inside a container when the selection crosses a container boundary |
| 67 | `packages/editor/src/selectors/selector.get-selected-value.test.ts` | portable-mixed | PT-H12 | 24 | packages/editor/src/selectors/selector.get-selected-value.test.ts:89 describe: getSelectedValue.name<br>packages/editor/src/selectors/selector.get-selected-value.test.ts:90 test: sensible defaults<br>packages/editor/src/selectors/selector.get-selected-value.test.ts:115 test: slicing a single block<br>packages/editor/src/selectors/selector.get-selected-value.test.ts:151 test: slicing a single span<br>packages/editor/src/selectors/selector.get-selected-value.test.ts:192 test: starting and ending selection on a block object<br>packages/editor/src/selectors/selector.get-selected-value.test.ts:215 test: starting selection on a block object<br>packages/editor/src/selectors/selector.get-selected-value.test.ts:242 test: ending selection on a block object<br>packages/editor/src/selectors/selector.get-selected-value.test.ts:281 test: slicing across block object<br>packages/editor/src/selectors/selector.get-selected-value.test.ts:312 test: starting and ending mid-span<br>packages/editor/src/selectors/selector.get-selected-value.test.ts:362 test: starting mid-span and ending end-span<br>packages/editor/src/selectors/selector.get-selected-value.test.ts:411 test: starting on inline object<br>packages/editor/src/selectors/selector.get-selected-value.test.ts:447 test: ending on inline object<br>packages/editor/src/selectors/selector.get-selected-value.test.ts:483 test: starting and ending on inline object<br>packages/editor/src/selectors/selector.get-selected-value.test.ts:519 test: slicing text block with custom props<br>packages/editor/src/selectors/selector.get-selected-value.test.ts:562 test: slicing span with custom props<br>packages/editor/src/selectors/selector.get-selected-value.test.ts:611 test: filters out unused markDefs<br>packages/editor/src/selectors/selector.get-selected-value.test.ts:756 test: starts and ends in different blocks with same span _key<br>packages/editor/src/selectors/selector.get-selected-value.test.ts:842 describe: ${expr} with containers<br>packages/editor/src/selectors/selector.get-selected-value.test.ts:907 test: select-all across [text, callout{text}, text] preserves the callout whole<br>packages/editor/src/selectors/selector.get-selected-value.test.ts:927 test: selection starts inside callout, ends in trailing text block<br>packages/editor/src/selectors/selector.get-selected-value.test.ts:961 test: selection starts in leading text block, ends inside callout<br>packages/editor/src/selectors/selector.get-selected-value.test.ts:998 test: selection wholly inside a callout slices inner blocks only<br>packages/editor/src/selectors/selector.get-selected-value.test.ts:1032 test: infinite nesting: callout inside table cell<br>packages/editor/src/selectors/selector.get-selected-value.test.ts:1196 test: deep selection ending mid-annotation preserves the link and its markDefs |
| 68 | `packages/editor/src/selectors/selector.get-selection-text.test.ts` | portable | PT-H01 | 1 | packages/editor/src/selectors/selector.get-selection-text.test.ts:70 test: getSelectionText.name |
| 69 | `packages/editor/src/selectors/selector.is-overlapping-selection.test.ts` | portable | PT-H01 | 19 | packages/editor/src/selectors/selector.is-overlapping-selection.test.ts:28 describe: isOverlappingSelection.name<br>packages/editor/src/selectors/selector.is-overlapping-selection.test.ts:29 test: null<br>packages/editor/src/selectors/selector.is-overlapping-selection.test.ts:33 test: fully selected block object<br>packages/editor/src/selectors/selector.is-overlapping-selection.test.ts:47 test: block object inside selection<br>packages/editor/src/selectors/selector.is-overlapping-selection.test.ts:61 test: fully selected inline object<br>packages/editor/src/selectors/selector.is-overlapping-selection.test.ts:75 test: inline object inside selection<br>packages/editor/src/selectors/selector.is-overlapping-selection.test.ts:89 test: selection touching at start endpoint<br>packages/editor/src/selectors/selector.is-overlapping-selection.test.ts:103 test: selection overlapping from the start<br>packages/editor/src/selectors/selector.is-overlapping-selection.test.ts:117 test: selection touching at end endpoint<br>packages/editor/src/selectors/selector.is-overlapping-selection.test.ts:131 test: selection overlapping from the end<br>packages/editor/src/selectors/selector.is-overlapping-selection.test.ts:145 test: before inline object<br>packages/editor/src/selectors/selector.is-overlapping-selection.test.ts:159 test: after inline object<br>packages/editor/src/selectors/selector.is-overlapping-selection.test.ts:173 test: partial span selection<br>packages/editor/src/selectors/selector.is-overlapping-selection.test.ts:187 test: expanded selection touching at the end edge of span<br>packages/editor/src/selectors/selector.is-overlapping-selection.test.ts:201 test: collapsed selection at the end edge of span<br>packages/editor/src/selectors/selector.is-overlapping-selection.test.ts:215 test: expanded selection touching at the start edge of span<br>packages/editor/src/selectors/selector.is-overlapping-selection.test.ts:229 test: collapsed selection at the start edge of span<br>packages/editor/src/selectors/selector.is-overlapping-selection.test.ts:243 test: selecting entire span<br>packages/editor/src/selectors/selector.is-overlapping-selection.test.ts:289 test: unknown block |
| 70 | `packages/editor/src/selectors/selector.is-point-relative-to-selection.test.ts` | portable | PT-H01 | 6 | packages/editor/src/selectors/selector.is-point-relative-to-selection.test.ts:34 describe: isPointBeforeSelection.name<br>packages/editor/src/selectors/selector.is-point-relative-to-selection.test.ts:35 test: Scenario: a point in an earlier text block in a callout is before a selection in a later text block in the same callout<br>packages/editor/src/selectors/selector.is-point-relative-to-selection.test.ts:123 test: Scenario: a point in a later text block in a callout is not before a selection in an earlier text block in the same callout<br>packages/editor/src/selectors/selector.is-point-relative-to-selection.test.ts:212 describe: isPointAfterSelection.name<br>packages/editor/src/selectors/selector.is-point-relative-to-selection.test.ts:213 test: Scenario: a point in a later text block in a callout is after a selection in an earlier text block in the same callout<br>packages/editor/src/selectors/selector.is-point-relative-to-selection.test.ts:301 test: Scenario: a point in an earlier text block in a callout is not after a selection in a later text block in the same callout |
| 71 | `packages/editor/src/selectors/selector.is-selection-expanded.test.ts` | portable | PT-H01 | 4 | packages/editor/src/selectors/selector.is-selection-expanded.test.ts:5 describe: isSelectionExpanded.name<br>packages/editor/src/selectors/selector.is-selection-expanded.test.ts:6 test: no selection<br>packages/editor/src/selectors/selector.is-selection-expanded.test.ts:12 test: collapsed selection<br>packages/editor/src/selectors/selector.is-selection-expanded.test.ts:38 test: expanded selection |
| 72 | `packages/editor/src/traversal/get-path-sub-schema.test.ts` | portable-mixed | PT-H02 | 3 | packages/editor/src/traversal/get-path-sub-schema.test.ts:9 describe: getPathSubSchema.name<br>packages/editor/src/traversal/get-path-sub-schema.test.ts:10 test: returns root sub-schema when path is at root<br>packages/editor/src/traversal/get-path-sub-schema.test.ts:35 test: returns nested sub-schema inside a registered container |
| 73 | `packages/editor/src/traversal/get-union-schema.test.ts` | portable-mixed | PT-H02 | 5 | packages/editor/src/traversal/get-union-schema.test.ts:9 describe: getUnionSchema.name<br>packages/editor/src/traversal/get-union-schema.test.ts:10 test: returns the root schema when no containers are registered<br>packages/editor/src/traversal/get-union-schema.test.ts:24 test: merges container sub-schema members with root, deduped by name<br>packages/editor/src/traversal/get-union-schema.test.ts:111 test: does not include sub-schema for unregistered containers<br>packages/editor/src/traversal/get-union-schema.test.ts:142 test: excludes structural containers whose field does not accept text blocks |
| 74 | `packages/editor/src/utils/util.block-offset.test.ts` | portable | PT-H04 | 21 | packages/editor/src/utils/util.block-offset.test.ts:12 describe: blockOffsetToSpanSelectionPoint.name<br>packages/editor/src/utils/util.block-offset.test.ts:13 describe: simple text block<br>packages/editor/src/utils/util.block-offset.test.ts:31 describe: end of block<br>packages/editor/src/utils/util.block-offset.test.ts:32 test: direction forward<br>packages/editor/src/utils/util.block-offset.test.ts:51 test: direction backward<br>packages/editor/src/utils/util.block-offset.test.ts:71 describe: start of block<br>packages/editor/src/utils/util.block-offset.test.ts:72 test: direction forward<br>packages/editor/src/utils/util.block-offset.test.ts:91 test: direction backward<br>packages/editor/src/utils/util.block-offset.test.ts:112 describe: leading and trailing inline object<br>packages/editor/src/utils/util.block-offset.test.ts:134 describe: start of block<br>packages/editor/src/utils/util.block-offset.test.ts:135 test: direction forward<br>packages/editor/src/utils/util.block-offset.test.ts:154 test: direction backward<br>packages/editor/src/utils/util.block-offset.test.ts:174 describe: offset 1<br>packages/editor/src/utils/util.block-offset.test.ts:175 test: direction forward<br>packages/editor/src/utils/util.block-offset.test.ts:194 test: direction backward<br>packages/editor/src/utils/util.block-offset.test.ts:214 describe: end of block<br>packages/editor/src/utils/util.block-offset.test.ts:215 test: direction forward<br>packages/editor/src/utils/util.block-offset.test.ts:234 test: direction backward<br>packages/editor/src/utils/util.block-offset.test.ts:255 test: only inline objects<br>packages/editor/src/utils/util.block-offset.test.ts:310 test: block object<br>packages/editor/src/utils/util.block-offset.test.ts:335 test: text with formatting |
| 75 | `packages/editor/src/utils/util.slice-text-block.test.ts` | portable | PT-H04 | 6 | packages/editor/src/utils/util.slice-text-block.test.ts:50 describe: sliceTextBlock.name<br>packages/editor/src/utils/util.slice-text-block.test.ts:51 test: empty block<br>packages/editor/src/utils/util.slice-text-block.test.ts:73 test: middle<br>packages/editor/src/utils/util.slice-text-block.test.ts:105 describe: multiple children<br>packages/editor/src/utils/util.slice-text-block.test.ts:125 test: mid-span<br>packages/editor/src/utils/util.slice-text-block.test.ts:155 test: from end of span to end of block |
| 76 | `packages/editor/test-utils/boundary-equivalent.test.ts` | portable | PT-H01 | 9 | packages/editor/test-utils/boundary-equivalent.test.ts:8 describe: boundaryEquivalentSelections.name<br>packages/editor/test-utils/boundary-equivalent.test.ts:9 test: returns no variants when selection is null<br>packages/editor/test-utils/boundary-equivalent.test.ts:18 test: returns no variants when point is in middle of span<br>packages/editor/test-utils/boundary-equivalent.test.ts:42 test: returns no variants when point is at boundary but no sibling span<br>packages/editor/test-utils/boundary-equivalent.test.ts:63 test: returns next-span variant for collapsed selection at end of span<br>packages/editor/test-utils/boundary-equivalent.test.ts:91 test: returns previous-span variant for collapsed selection at start of span<br>packages/editor/test-utils/boundary-equivalent.test.ts:119 test: returns no variant when sibling is an inline object, not a span<br>packages/editor/test-utils/boundary-equivalent.test.ts:143 test: returns cartesian product for expanded selection with both endpoints at boundaries<br>packages/editor/test-utils/boundary-equivalent.test.ts:184 test: preserves backward flag in variants |
| 77 | `packages/editor/test-utils/selection-text.test.ts` | portable | PT-H01 | 1 | packages/editor/test-utils/selection-text.test.ts:6 test: getSelectionText.name |
| 78 | `packages/editor/test-utils/string-overlap.test.ts` | portable | PT-H01 | 1 | packages/editor/test-utils/string-overlap.test.ts:4 test: stringOverlap.name |
| 79 | `packages/editor/tests/PortableTextEditor.test.tsx` | portable-mixed | PT-H12 | 8 | packages/editor/tests/PortableTextEditor.test.tsx:19 describe: initialization<br>packages/editor/tests/PortableTextEditor.test.tsx:20 it: receives initial onChange events and has custom placeholder<br>packages/editor/tests/PortableTextEditor.test.tsx:41 it: takes value from props and confirms it by emitting value change event<br>packages/editor/tests/PortableTextEditor.test.tsx:70 it: takes initial selection from props<br>packages/editor/tests/PortableTextEditor.test.tsx:111 it: updates editor selection from new prop and keeps object equality in editor.getSelection()<br>packages/editor/tests/PortableTextEditor.test.tsx:157 it: handles empty array value<br>packages/editor/tests/PortableTextEditor.test.tsx:204 it: validates a non-initial value<br>packages/editor/tests/PortableTextEditor.test.tsx:272 it: doesn't crash when containing a invalid block somewhere inside the content |
| 80 | `packages/editor/tests/backspace-before-container.test.tsx` | portable-mixed | PT-H02 | 6 | packages/editor/tests/backspace-before-container.test.tsx:82 describe: Backspace before container<br>packages/editor/tests/backspace-before-container.test.tsx:83 test: Backspace at start of empty text block after callout lands at end of callout content<br>packages/editor/tests/backspace-before-container.test.tsx:135 test: Backspace at start of empty text block after callout with multi-block content lands at end of last block<br>packages/editor/tests/backspace-before-container.test.tsx:192 test: Backspace at start of empty text block after table lands at end of last cell content<br>packages/editor/tests/backspace-before-container.test.tsx:278 test: Backspace at start of empty text block after void block-object focuses the block-object<br>packages/editor/tests/backspace-before-container.test.tsx:318 test: Backspace at start of empty text block after table whose last cell ends in an image focuses the image |
| 81 | `packages/editor/tests/behavior-api.test.tsx` | portable-mixed | PT-H12 | 27 | packages/editor/tests/behavior-api.test.tsx:21 describe: Behavior API<br>packages/editor/tests/behavior-api.test.tsx:22 test: Scenario: Suppressing raised events while executing<br>packages/editor/tests/behavior-api.test.tsx:57 test: Scenario: Raising one custom event as the result of raising another<br>packages/editor/tests/behavior-api.test.tsx:100 test: Scenario: Sending custom events<br>packages/editor/tests/behavior-api.test.tsx:127 test: Scenario: Raised events default to their default action<br>packages/editor/tests/behavior-api.test.tsx:156 test: Scenario: `forward`ing all events<br>packages/editor/tests/behavior-api.test.tsx:182 test: Scenario: `forward`ing all events combined with an `effect`<br>packages/editor/tests/behavior-api.test.tsx:206 test: Scenario: `effect` can be combined with `forward` to not alter the chain of events<br>packages/editor/tests/behavior-api.test.tsx:259 test: Scenario: Empty action sets stop event propagation<br>packages/editor/tests/behavior-api.test.tsx:288 test: Scenario: `forward` forwards an event to succeeding Behaviors<br>packages/editor/tests/behavior-api.test.tsx:314 test: Scenario: `forward`ing twice<br>packages/editor/tests/behavior-api.test.tsx:342 test: Scenario: Empty actions cancel the chain of events<br>packages/editor/tests/behavior-api.test.tsx:369 test: Scenario: A lonely `forward` action does not alter the default action<br>packages/editor/tests/behavior-api.test.tsx:389 test: Scenario: `forward`ing a native event does not cancel it<br>packages/editor/tests/behavior-api.test.tsx:409 test: Scenario: no action set cancels a native event<br>packages/editor/tests/behavior-api.test.tsx:429 test: Scenario: no `forward` action cancels a native event<br>packages/editor/tests/behavior-api.test.tsx:473 test: Scenario: `effect` can be used to `send` a `focus` event<br>packages/editor/tests/behavior-api.test.tsx:530 test: Scenario: `effect` can be used to `send` a `blur` event<br>packages/editor/tests/behavior-api.test.tsx:577 test: Scenario: `execute` suppresses `raise`<br>packages/editor/tests/behavior-api.test.tsx:618 test: Scenario: `forward` triggering `execute`<br>packages/editor/tests/behavior-api.test.tsx:663 test: Scenario: Typing on expanded selection causes two `insert.text` event<br>packages/editor/tests/behavior-api.test.tsx:721 describe: `forward`<br>packages/editor/tests/behavior-api.test.tsx:722 test: Scenario: `forward` of a different event type<br>packages/editor/tests/behavior-api.test.tsx:760 test: Scenario: cross-type `forward` does not trigger user-defined Behaviors<br>packages/editor/tests/behavior-api.test.tsx:827 describe: Chained `delete` and `insert.block` from a custom event<br>packages/editor/tests/behavior-api.test.tsx:828 test: Scenario: Slash-command pattern inside an editable container lands the new block inside, not after<br>packages/editor/tests/behavior-api.test.tsx:934 test: Scenario: Replacing the entire span text inside an editable container in one batch lands the replacement in the surviving block |
| 82 | `packages/editor/tests/behavior.snapshot-leak.test.tsx` | portable-mixed | PT-H12 | 3 | packages/editor/tests/behavior.snapshot-leak.test.tsx:13 describe: Snapshot leak surface<br>packages/editor/tests/behavior.snapshot-leak.test.tsx:14 test: Scenario: guard receives a snapshot with the expected keys<br>packages/editor/tests/behavior.snapshot-leak.test.tsx:60 test: Scenario: action receives a snapshot with the expected keys |
| 83 | `packages/editor/tests/block-selectors-container.test.tsx` | portable-mixed | PT-H02 | 7 | packages/editor/tests/block-selectors-container.test.tsx:39 describe: block selectors (container awareness)<br>packages/editor/tests/block-selectors-container.test.tsx:40 test: getFocusBlock returns the innermost block when focus is inside a container<br>packages/editor/tests/block-selectors-container.test.tsx:119 test: getAnchorBlock and getAnchorTextBlock resolve at depth<br>packages/editor/tests/block-selectors-container.test.tsx:185 test: getNextBlock and getPreviousBlock walk container siblings and stay within scope<br>packages/editor/tests/block-selectors-container.test.tsx:272 test: getNextBlock returns undefined at the last line of a container (does not cross boundary)<br>packages/editor/tests/block-selectors-container.test.tsx:335 test: getFirstBlock and getLastBlock return the first/last block of the enclosing container<br>packages/editor/tests/block-selectors-container.test.tsx:422 test: getFirstBlock and getLastBlock fall back to document scope when focus is at root |
| 84 | `packages/editor/tests/child-selectors-container.test.tsx` | portable-mixed | PT-H02 | 4 | packages/editor/tests/child-selectors-container.test.tsx:36 describe: child and span selectors (container awareness)<br>packages/editor/tests/child-selectors-container.test.tsx:37 test: getFocusChild, getFocusSpan, and getAnchorChild resolve at depth<br>packages/editor/tests/child-selectors-container.test.tsx:107 test: getFocusInlineObject resolves an inline object inside a container line<br>packages/editor/tests/child-selectors-container.test.tsx:188 test: getNextSpan and getPreviousSpan walk within the focus text block at depth |
| 85 | `packages/editor/tests/click-lonely-block-object-container.test.tsx` | portable-mixed | PT-H02 | 3 | packages/editor/tests/click-lonely-block-object-container.test.tsx:29 describe: click above/below lonely block object in containers<br>packages/editor/tests/click-lonely-block-object-container.test.tsx:30 test: Scenario: clicking below a lonely block object inside a container inserts a text block after it<br>packages/editor/tests/click-lonely-block-object-container.test.tsx:110 test: Scenario: clicking above a lonely block object inside a container inserts a text block before it |
| 86 | `packages/editor/tests/code-block-registration.test.tsx` | portable-mixed | PT-H12 | 4 | packages/editor/tests/code-block-registration.test.tsx:140 describe: code-block resolution through normalisation<br>packages/editor/tests/code-block-registration.test.tsx:141 test: A: top-level `code-block` registration activates inside cell.content even though no container declares code-block in its `of`<br>packages/editor/tests/code-block-registration.test.tsx:197 test: B: registering `code-block` with a field the schema does not have warns at register time and the node renders as a non-editable placeholder<br>packages/editor/tests/code-block-registration.test.tsx:236 test: entry |
| 87 | `packages/editor/tests/code-block.navigation.test.tsx` | portable-mixed | PT-H12 | 3 | packages/editor/tests/code-block.navigation.test.tsx:34 describe: code block navigation<br>packages/editor/tests/code-block.navigation.test.tsx:35 test: ArrowRight moves the caret forward inside a code block line<br>packages/editor/tests/code-block.navigation.test.tsx:96 test: Backspace deletes one character inside a code block line |
| 88 | `packages/editor/tests/code-block.test.tsx` | portable-mixed | PT-H12 | 2 | packages/editor/tests/code-block.test.tsx:37 describe: code block<br>packages/editor/tests/code-block.test.tsx:38 test: clicking into a code block and typing a character |
| 89 | `packages/editor/tests/collaborative-editing.test.tsx` | portable | PT-H08 | 15 | packages/editor/tests/collaborative-editing.test.tsx:38 describe: Collaborative editing<br>packages/editor/tests/collaborative-editing.test.tsx:39 describe: Deferred normalization patches<br>packages/editor/tests/collaborative-editing.test.tsx:40 test: Scenario: Remote patches conflict with local held-back patches<br>packages/editor/tests/collaborative-editing.test.tsx:203 test: Scenario: Value sync discards local held-back patches<br>packages/editor/tests/collaborative-editing.test.tsx:314 test: Scenario: Remote patches on unrelated path do not discard local patches<br>packages/editor/tests/collaborative-editing.test.tsx:441 test: Scenario: Remote patches conflict with local held-back style normalization<br>packages/editor/tests/collaborative-editing.test.tsx:559 test: Scenario: Remote patches conflict with local held-back markDefs normalization<br>packages/editor/tests/collaborative-editing.test.tsx:711 test: Scenario: Remote patches on inline object do not conflict with sibling span normalization<br>packages/editor/tests/collaborative-editing.test.tsx:852 test: Scenario: Remote patch on parent path discards local patch on child path<br>packages/editor/tests/collaborative-editing.test.tsx:962 test: Scenario: Remote patch on child path does not discard local patch on parent path<br>packages/editor/tests/collaborative-editing.test.tsx:1089 test: Scenario: Multiple normalization patches, only conflicting ones discarded<br>packages/editor/tests/collaborative-editing.test.tsx:1219 test: Scenario: Remote patch on block replaces entire block, discards all local patches for that block<br>packages/editor/tests/collaborative-editing.test.tsx:1345 test: Scenario: Remote patches on different blocks do not conflict<br>packages/editor/tests/collaborative-editing.test.tsx:1511 describe: Unknown decorator normalization<br>packages/editor/tests/collaborative-editing.test.tsx:1512 test: Scenario: Setting a block with unknown decorators emits a patch to strip them |
| 90 | `packages/editor/tests/composition.test.ts` | portable | PT-H09 | 25 | packages/editor/tests/composition.test.ts:68 describe: Japanese IME<br>packages/editor/tests/composition.test.ts:69 test: type "すし" (sushi) into empty editor<br>packages/editor/tests/composition.test.ts:126 test: after existing text<br>packages/editor/tests/composition.test.ts:192 test: cancelled with Escape<br>packages/editor/tests/composition.test.ts:238 test: replacing selected text<br>packages/editor/tests/composition.test.ts:344 describe: Korean IME<br>packages/editor/tests/composition.test.ts:345 test: character-by-character building<br>packages/editor/tests/composition.test.ts:389 test: continuous recomposition "한국"<br>packages/editor/tests/composition.test.ts:459 describe: Composition with formatting<br>packages/editor/tests/composition.test.ts:460 test: at a format boundary<br>packages/editor/tests/composition.test.ts:558 test: before bold text<br>packages/editor/tests/composition.test.ts:662 test: with active decorators on empty block<br>packages/editor/tests/composition.test.ts:727 test: with multiple decorators<br>packages/editor/tests/composition.test.ts:830 test: replacing decorated text<br>packages/editor/tests/composition.test.ts:944 test: at decorator boundary<br>packages/editor/tests/composition.test.ts:1048 describe: Composition with annotations<br>packages/editor/tests/composition.test.ts:1049 test: inside annotation inherits mark<br>packages/editor/tests/composition.test.ts:1155 test: at annotation boundary has no mark<br>packages/editor/tests/composition.test.ts:1259 test: inside annotated bold text inherits both<br>packages/editor/tests/composition.test.ts:1365 test: at start of annotation<br>packages/editor/tests/composition.test.ts:1474 test: replacing text spanning annotation boundary<br>packages/editor/tests/composition.test.ts:1584 test: replacing single-char annotation preserves mark<br>packages/editor/tests/composition.test.ts:1688 describe: Composition sequences<br>packages/editor/tests/composition.test.ts:1689 test: after soft break<br>packages/editor/tests/composition.test.ts:1782 test: multiple sequential compositions |
| 91 | `packages/editor/tests/container-dual-type.test.tsx` | portable-mixed | PT-H02 | 2 | packages/editor/tests/container-dual-type.test.tsx:89 describe: same _type in two different lexical positions<br>packages/editor/tests/container-dual-type.test.tsx:90 test: shallow table and organism normalize all the way down to a cell holding an empty text block |
| 92 | `packages/editor/tests/container-enter-escape.test.tsx` | portable-mixed | PT-H02 | 3 | packages/editor/tests/container-enter-escape.test.tsx:28 describe: container Enter escape<br>packages/editor/tests/container-enter-escape.test.tsx:29 test: Scenario: Enter on empty last line with empty previous sibling escapes to editor root<br>packages/editor/tests/container-enter-escape.test.tsx:138 test: Scenario: Enter on empty last line with non-empty previous sibling does NOT escape |
| 93 | `packages/editor/tests/container-insert-block.test.tsx` | portable-mixed | PT-H02 | 6 | packages/editor/tests/container-insert-block.test.tsx:31 describe: insert.block inside a container<br>packages/editor/tests/container-insert-block.test.tsx:32 test: placement: after — inserts a sibling block AFTER the focused block inside the container<br>packages/editor/tests/container-insert-block.test.tsx:124 test: placement: before — inserts a sibling block BEFORE the focused block inside the container<br>packages/editor/tests/container-insert-block.test.tsx:218 test: placement: auto, collapsed caret at end of block — merges the inserted text block fragment into the existing one<br>packages/editor/tests/container-insert-block.test.tsx:308 test: placement: auto, empty target block — replaces the empty block inside the container<br>packages/editor/tests/container-insert-block.test.tsx:393 test: placement: auto, collapsed caret in middle of text block — splits block and inserts block object between |
| 94 | `packages/editor/tests/container-normalization.test.tsx` | portable-mixed | PT-H02 | 23 | packages/editor/tests/container-normalization.test.tsx:86 describe: container normalization<br>packages/editor/tests/container-normalization.test.tsx:87 test: top-level registration is inert at a position where schema declares the type without the registered arrayField<br>packages/editor/tests/container-normalization.test.tsx:139 test: container block normalizes to cursor-ready structure<br>packages/editor/tests/container-normalization.test.tsx:273 test: callout container normalizes to cursor-ready structure<br>packages/editor/tests/container-normalization.test.tsx:376 test: text block with missing children normalizes to have empty span<br>packages/editor/tests/container-normalization.test.tsx:413 test: incoming patch unsets container children restores structure<br>packages/editor/tests/container-normalization.test.tsx:573 test: container with text block missing children normalizes the block<br>packages/editor/tests/container-normalization.test.tsx:704 test: duplicate keys in container children are fixed<br>packages/editor/tests/container-normalization.test.tsx:803 test: incoming patch unsets container field and normalization restores it<br>packages/editor/tests/container-normalization.test.tsx:891 test: multiple containers in same document normalize independently<br>packages/editor/tests/container-normalization.test.tsx:976 test: container inserted via incoming patch normalizes<br>packages/editor/tests/container-normalization.test.tsx:1042 test: void container with empty child array is not normalized<br>packages/editor/tests/container-normalization.test.tsx:1087 test: deeply nested container block with missing children is normalized<br>packages/editor/tests/container-normalization.test.tsx:1180 test: removing last child from container triggers normalization<br>packages/editor/tests/container-normalization.test.tsx:1266 test: late container registration normalizes existing void container<br>packages/editor/tests/container-normalization.test.tsx:1343 test: container block with no `_key` gets a key via numeric index<br>packages/editor/tests/container-normalization.test.tsx:1437 test: non-block editable field produces warning and is excluded<br>packages/editor/tests/container-normalization.test.tsx:1522 test: three independent containers normalize without interference<br>packages/editor/tests/container-normalization.test.tsx:1715 test: full hierarchy normalizes all levels<br>packages/editor/tests/container-normalization.test.tsx:1813 test: shallow table normalizes to full cursor-ready structure<br>packages/editor/tests/container-normalization.test.tsx:1907 test: unregistering container reverts container to void<br>packages/editor/tests/container-normalization.test.tsx:2001 test: calling the unregister function returned from editor.registerNode reverts container to void<br>packages/editor/tests/container-normalization.test.tsx:2090 test: unmounting ContainerPlugin reverts container to void |
| 95 | `packages/editor/tests/container-permutations.test.tsx` | portable-mixed | PT-H02 | 8 | packages/editor/tests/container-permutations.test.tsx:200 describe: container archetype permutations<br>packages/editor/tests/container-permutations.test.tsx:205 test: code-block: toggle annotation across root + code-block only annotates root<br>packages/editor/tests/container-permutations.test.tsx:283 test: fact-box: toggle bold across root + fact-box bolds both<br>packages/editor/tests/container-permutations.test.tsx:348 test: fact-box: toggle numbered list across root + fact-box applies to both<br>packages/editor/tests/container-permutations.test.tsx:421 test: callout: toggle bullet across root + callout applies to both<br>packages/editor/tests/container-permutations.test.tsx:490 test: callout: toggle number across root + callout only applies at root (callout out of scope for number)<br>packages/editor/tests/container-permutations.test.tsx:559 test: table.cell + nested callout: toggle strong across root + cell + nested callout bolds all three<br>packages/editor/tests/container-permutations.test.tsx:680 test: table.cell + nested callout: toggle em applies to root + cell, NOT to nested callout (callout-in-cell narrows em out) |
| 96 | `packages/editor/tests/container-render-focused-selected.test.tsx` | portable-mixed | PT-H02 | 5 | packages/editor/tests/container-render-focused-selected.test.tsx:57 describe: container render focused, selected, and path<br>packages/editor/tests/container-render-focused-selected.test.tsx:58 test: Only the innermost container is focused; ancestors are selected<br>packages/editor/tests/container-render-focused-selected.test.tsx:141 test: A container is neither focused nor selected when the caret is in a different block<br>packages/editor/tests/container-render-focused-selected.test.tsx:200 test: selected cascades up nested containers; focused stays on the innermost<br>packages/editor/tests/container-render-focused-selected.test.tsx:308 test: An expanded selection across cells marks both as selected and none as focused |
| 97 | `packages/editor/tests/container-rendering.test.tsx` | portable-mixed | PT-H02 | 20 | packages/editor/tests/container-rendering.test.tsx:44 describe: container rendering<br>packages/editor/tests/container-rendering.test.tsx:45 test: callout renders with correct DOM structure<br>packages/editor/tests/container-rendering.test.tsx:137 test: node prop receives the raw node data<br>packages/editor/tests/container-rendering.test.tsx:202 describe: table with nested rows and cells<br>packages/editor/tests/container-rendering.test.tsx:272 test: renders three levels of nesting with correct DOM structure<br>packages/editor/tests/container-rendering.test.tsx:357 describe: container with non-editable fields<br>packages/editor/tests/container-rendering.test.tsx:388 test: only editable fields render in the DOM<br>packages/editor/tests/container-rendering.test.tsx:448 describe: positional block-leaf override<br>packages/editor/tests/container-rendering.test.tsx:449 test: block-leaf override in callout.of applies to text blocks inside the callout<br>packages/editor/tests/container-rendering.test.tsx:551 describe: container and renderer independence<br>packages/editor/tests/container-rendering.test.tsx:552 test: container without renderer falls back to default div<br>packages/editor/tests/container-rendering.test.tsx:625 test: renderer without container renders as void block object<br>packages/editor/tests/container-rendering.test.tsx:679 describe: code block container<br>packages/editor/tests/container-rendering.test.tsx:705 test: code block renders with correct DOM structure<br>packages/editor/tests/container-rendering.test.tsx:788 describe: gallery with void block objects<br>packages/editor/tests/container-rendering.test.tsx:818 test: gallery renders void block objects with correct DOM structure<br>packages/editor/tests/container-rendering.test.tsx:895 describe: cell with mixed content<br>packages/editor/tests/container-rendering.test.tsx:969 test: cell renders both text blocks and void block objects<br>packages/editor/tests/container-rendering.test.tsx:1103 describe: self-referential containers<br>packages/editor/tests/container-rendering.test.tsx:1151 test: list nested 3 levels deep renders all levels as containers |
| 98 | `packages/editor/tests/container-resolution-rules.test.tsx` | portable-mixed | PT-H02 | 8 | packages/editor/tests/container-resolution-rules.test.tsx:114 describe: Rule 1: registration is type-keyed, activation is position-gated<br>packages/editor/tests/container-resolution-rules.test.tsx:115 test: top-level registration of an inline-only type activates where the schema declares it<br>packages/editor/tests/container-resolution-rules.test.tsx:183 describe: Registration silent-skip behavior<br>packages/editor/tests/container-resolution-rules.test.tsx:184 test: top-level registration of an unknown type silently skips, other registrations unaffected<br>packages/editor/tests/container-resolution-rules.test.tsx:252 test: nested registration of an unknown type silently skips, chain-aware warn, parent still registers<br>packages/editor/tests/container-resolution-rules.test.tsx:324 test: registration with a arrayField that does not exist on the schema type silently skips<br>packages/editor/tests/container-resolution-rules.test.tsx:390 describe: Rule 2: container chains are rooted in the editor value array<br>packages/editor/tests/container-resolution-rules.test.tsx:391 test: registered type does not activate inside an unregistered object-node ancestor |
| 99 | `packages/editor/tests/container-typing.test.tsx` | portable-mixed | PT-H02 | 2 | packages/editor/tests/container-typing.test.tsx:34 describe: typing inside containers<br>packages/editor/tests/container-typing.test.tsx:35 test: multi-character keyboard input inside a container |
| 100 | `packages/editor/tests/cross-container-range-delete.test.tsx` | portable-mixed | PT-H02 | 25 | packages/editor/tests/cross-container-range-delete.test.tsx:92 describe: cross-container range delete<br>packages/editor/tests/cross-container-range-delete.test.tsx:93 test: root text block -> code-block line<br>packages/editor/tests/cross-container-range-delete.test.tsx:161 test: code-block line -> root text block below<br>packages/editor/tests/cross-container-range-delete.test.tsx:229 test: across three root siblings with a container in the middle merges outer text blocks (same parent)<br>packages/editor/tests/cross-container-range-delete.test.tsx:300 test: across two sibling containers (callout - code-block)<br>packages/editor/tests/cross-container-range-delete.test.tsx:381 test: within same container across two lines still merges (same-parent path unchanged)<br>packages/editor/tests/cross-container-range-delete.test.tsx:465 test: range selection covering a root void block merges outer text blocks (same parent)<br>packages/editor/tests/cross-container-range-delete.test.tsx:520 test: Backspace at start of an empty container line below a text block unwraps the line<br>packages/editor/tests/cross-container-range-delete.test.tsx:594 test: start inside multi-line callout removes trailing lines, leaves callout shell with leading content<br>packages/editor/tests/cross-container-range-delete.test.tsx:684 test: end inside multi-line callout removes leading lines, leaves callout shell with trailing content<br>packages/editor/tests/cross-container-range-delete.test.tsx:774 test: cross-parent selection removes fully-covered root sibling between containers<br>packages/editor/tests/cross-container-range-delete.test.tsx:866 test: hanging range across a callout removes the callout entirely<br>packages/editor/tests/cross-container-range-delete.test.tsx:1018 describe: cross-container range delete: deep structures<br>packages/editor/tests/cross-container-range-delete.test.tsx:1019 test: start mid-line in callout-in-cell-in-table, end in root text below table<br>packages/editor/tests/cross-container-range-delete.test.tsx:1183 test: start in root text, end mid-line in callout-in-cell-in-table<br>packages/editor/tests/cross-container-range-delete.test.tsx:1347 test: selection across cells in same row preserves intermediate cell shells with cleared content<br>packages/editor/tests/cross-container-range-delete.test.tsx:1492 test: selection across rows in same table preserves intermediate row shells with cells cleared<br>packages/editor/tests/cross-container-range-delete.test.tsx:1678 test: Selecting an entire empty table and pressing Delete unsets the table<br>packages/editor/tests/cross-container-range-delete.test.tsx:1858 test: Selecting only the first two of three empty cells in a row is a no-op<br>packages/editor/tests/cross-container-range-delete.test.tsx:1988 test: Selecting from the first cell to a middle cell of a 2x3 table preserves the trailing cells<br>packages/editor/tests/cross-container-range-delete.test.tsx:2186 test: selecting all the text in an editable container preserves the shell<br>packages/editor/tests/cross-container-range-delete.test.tsx:2240 test: inserting a block after fully clearing the text inside a callout lands the block inside<br>packages/editor/tests/cross-container-range-delete.test.tsx:2363 test: Cmd-A + Delete across two code-blocks removes both<br>packages/editor/tests/cross-container-range-delete.test.tsx:2439 test: Cmd-A + Delete via keyboard across code-block, callout and table removes all<br>packages/editor/tests/cross-container-range-delete.test.tsx:2553 test: positional-only nested containers: clears cell text in selection range |
| 101 | `packages/editor/tests/data-path.test.tsx` | portable | PT-H11 | 12 | packages/editor/tests/data-path.test.tsx:6 describe: data-pt-path attribute<br>packages/editor/tests/data-path.test.tsx:7 describe: initial rendering<br>packages/editor/tests/data-path.test.tsx:8 test: editor data-pt-path<br>packages/editor/tests/data-path.test.tsx:16 test: text block data-pt-path<br>packages/editor/tests/data-path.test.tsx:41 test: span data-pt-path<br>packages/editor/tests/data-path.test.tsx:68 test: block object data-pt-path<br>packages/editor/tests/data-path.test.tsx:101 test: inline object data-pt-path<br>packages/editor/tests/data-path.test.tsx:137 test: multiple text blocks<br>packages/editor/tests/data-path.test.tsx:186 test: `block.set` text block key<br>packages/editor/tests/data-path.test.tsx:229 test: `block.set` block object key<br>packages/editor/tests/data-path.test.tsx:279 test: remote patch updates text block key<br>packages/editor/tests/data-path.test.tsx:326 test: remote patch updates block object key |
| 102 | `packages/editor/tests/define-container-leaf-conflict.test.tsx` | portable-mixed | PT-H02 | 6 | packages/editor/tests/define-container-leaf-conflict.test.tsx:41 describe: defineContainer / defineBlockObject conflict resolution<br>packages/editor/tests/define-container-leaf-conflict.test.tsx:42 test: Same scope registered twice as container (different field) keeps the first registration<br>packages/editor/tests/define-container-leaf-conflict.test.tsx:82 test: Same scope registered twice as container (same field) warns and keeps the first<br>packages/editor/tests/define-container-leaf-conflict.test.tsx:118 test: Same scope registered twice as leaf warns and keeps the first<br>packages/editor/tests/define-container-leaf-conflict.test.tsx:154 test: Scope registered as container then leaf warns and rejects the leaf<br>packages/editor/tests/define-container-leaf-conflict.test.tsx:192 test: Scope registered as leaf then container warns and rejects the container |
| 103 | `packages/editor/tests/define-leaf-block-object-wrapper.test.tsx` | portable | PT-H03 | 3 | packages/editor/tests/define-leaf-block-object-wrapper.test.tsx:13 describe: defineBlockObject void block-object wrapper contract<br>packages/editor/tests/define-leaf-block-object-wrapper.test.tsx:14 test: consumer wrapping content with contentEditable=false + draggable on the inner wrapper preserves the spacer in editable context<br>packages/editor/tests/define-leaf-block-object-wrapper.test.tsx:59 test: Pressing Enter on a void block-object inserts a sibling text block when the leaf wraps content with contentEditable=false |
| 104 | `packages/editor/tests/define-leaf-inline-object-spacer.test.tsx` | portable | PT-H03 | 3 | packages/editor/tests/define-leaf-inline-object-spacer.test.tsx:19 describe: defineLeaf void spacer<br>packages/editor/tests/define-leaf-inline-object-spacer.test.tsx:20 test: the engine-emitted void spacer reaches the consumer through children for inline objects<br>packages/editor/tests/define-leaf-inline-object-spacer.test.tsx:64 test: the engine-emitted void spacer reaches the consumer through children for void block objects |
| 105 | `packages/editor/tests/define-textblock.test.tsx` | portable-mixed | PT-H12 | 3 | packages/editor/tests/define-textblock.test.tsx:22 test: TextBlockPlugin renders custom wrapper<br>packages/editor/tests/define-textblock.test.tsx:66 test: Without TextBlockPlugin, engine default renders<br>packages/editor/tests/define-textblock.test.tsx:97 test: Cross-map collision: text-block then container for same type warns and skips |
| 106 | `packages/editor/tests/delete-empty-container.test.tsx` | portable-mixed | PT-H02 | 13 | packages/editor/tests/delete-empty-container.test.tsx:31 describe: delete on empty container<br>packages/editor/tests/delete-empty-container.test.tsx:32 test: Backspace in empty callout with text block before unwraps to root<br>packages/editor/tests/delete-empty-container.test.tsx:93 test: Backspace in empty callout with text block after unwraps to root<br>packages/editor/tests/delete-empty-container.test.tsx:154 test: Backspace in empty callout that is the only block leaves a placeholder text block<br>packages/editor/tests/delete-empty-container.test.tsx:210 test: Delete in empty callout with text block after unwraps to root<br>packages/editor/tests/delete-empty-container.test.tsx:444 describe: delete on empty container - nested cascade<br>packages/editor/tests/delete-empty-container.test.tsx:445 test: Backspace in empty callout in permissive cell unwraps only the callout<br>packages/editor/tests/delete-empty-container.test.tsx:535 test: Backspace in empty callout in lonely structural cell cascades all the way to root<br>packages/editor/tests/delete-empty-container.test.tsx:597 test: Backspace in empty callout in lonely structural cell with text block before lands payload after that text block<br>packages/editor/tests/delete-empty-container.test.tsx:662 test: Backspace in empty callout in structural cell with sibling cells is a no-op<br>packages/editor/tests/delete-empty-container.test.tsx:760 describe: delete on empty container - nested block container<br>packages/editor/tests/delete-empty-container.test.tsx:802 test: Backspace inside empty fact-box with nested block container unwraps the fact-box<br>packages/editor/tests/delete-empty-container.test.tsx:860 test: Backspace at the start of a non-first text block inside fact-box merges with the previous block |
| 107 | `packages/editor/tests/dom-structure.test.tsx` | portable-mixed | PT-H02 | 9 | packages/editor/tests/dom-structure.test.tsx:17 describe: DOM structure<br>packages/editor/tests/dom-structure.test.tsx:18 test: 1. empty placeholder block<br>packages/editor/tests/dom-structure.test.tsx:67 test: 2. root text block with spans and inline objects<br>packages/editor/tests/dom-structure.test.tsx:162 test: 3. root void block object (image)<br>packages/editor/tests/dom-structure.test.tsx:240 test: 4. gallery container with void leaf children<br>packages/editor/tests/dom-structure.test.tsx:321 test: 5. deep nesting: table > row > cell > text block > inline<br>packages/editor/tests/dom-structure.test.tsx:480 test: 6. code block container with text blocks<br>packages/editor/tests/dom-structure.test.tsx:564 test: 7. container DOM does not contain any `data-slate-*` attributes<br>packages/editor/tests/dom-structure.test.tsx:646 test: 8. text block rendered via `defineTextBlock` inside a container emits `data-pt-block="text"`, not `data-slate-node="element"` |
| 108 | `packages/editor/tests/edge-selectors-container.test.tsx` | portable-mixed | PT-H02 | 4 | packages/editor/tests/edge-selectors-container.test.tsx:32 describe: edge selectors (container awareness)<br>packages/editor/tests/edge-selectors-container.test.tsx:33 test: comparePoints resolves document order across container lines<br>packages/editor/tests/edge-selectors-container.test.tsx:111 test: isPointBeforeSelection and isPointAfterSelection work across container lines<br>packages/editor/tests/edge-selectors-container.test.tsx:208 test: isOverlappingSelection detects overlap inside a container |
| 109 | `packages/editor/tests/editable-api.test.tsx` | portable-mixed | PT-H12 | 9 | packages/editor/tests/editable-api.test.tsx:9 describe: focusBlock<br>packages/editor/tests/editable-api.test.tsx:10 test: Returns the text block at the focus point<br>packages/editor/tests/editable-api.test.tsx:39 test: Returns the block object at the focus point<br>packages/editor/tests/editable-api.test.tsx:77 test: Returns undefined when no selection<br>packages/editor/tests/editable-api.test.tsx:99 describe: focusChild<br>packages/editor/tests/editable-api.test.tsx:100 test: Returns the span at the focus point<br>packages/editor/tests/editable-api.test.tsx:128 test: Returns the inline object at the focus point<br>packages/editor/tests/editable-api.test.tsx:166 test: Returns undefined for block objects<br>packages/editor/tests/editable-api.test.tsx:201 test: Returns undefined when no selection |
| 110 | `packages/editor/tests/editor-snapshot.test.tsx` | portable-mixed | PT-H12 | 4 | packages/editor/tests/editor-snapshot.test.tsx:9 describe: EditorSnapshot<br>packages/editor/tests/editor-snapshot.test.tsx:10 test: Scenario: A new snapshot is captured for each action set<br>packages/editor/tests/editor-snapshot.test.tsx:99 test: Scenario: Snapshot field references are stable between calls when state is unchanged<br>packages/editor/tests/editor-snapshot.test.tsx:136 test: Scenario: Snapshot selection reference changes after a selection change |
| 111 | `packages/editor/tests/event.block.set.test.tsx` | portable-mixed | PT-H12 | 12 | packages/editor/tests/event.block.set.test.tsx:11 describe: event.block.set<br>packages/editor/tests/event.block.set.test.tsx:12 test: Scenario: setting undefined block object property is a noop<br>packages/editor/tests/event.block.set.test.tsx:102 test: Scenario: setting defined block object property<br>packages/editor/tests/event.block.set.test.tsx:203 test: Scenario: updating block object _key<br>packages/editor/tests/event.block.set.test.tsx:293 test: Scenario: updating text block _key<br>packages/editor/tests/event.block.set.test.tsx:351 test: Scenario: updating block object _type is a noop<br>packages/editor/tests/event.block.set.test.tsx:427 test: Scenario: adding text block property<br>packages/editor/tests/event.block.set.test.tsx:556 test: Scenario: Undoing `set` of text block property<br>packages/editor/tests/event.block.set.test.tsx:642 test: Scenario: Text blocks don't accept undefined custom props<br>packages/editor/tests/event.block.set.test.tsx:695 test: Scenario: Text blocks accept defined custom props<br>packages/editor/tests/event.block.set.test.tsx:756 test: Scenario: Setting an annotation by raising<br>packages/editor/tests/event.block.set.test.tsx:864 test: Scenario: Setting an annotation by executing |
| 112 | `packages/editor/tests/event.block.unset.test.tsx` | portable-mixed | PT-H12 | 10 | packages/editor/tests/event.block.unset.test.tsx:8 describe: event.block.unset<br>packages/editor/tests/event.block.unset.test.tsx:9 test: Scenario: `unset`ing block object property removes it<br>packages/editor/tests/event.block.unset.test.tsx:98 test: Scenario: `unset`ing block object `_key` `set`s a new `_key`<br>packages/editor/tests/event.block.unset.test.tsx:188 test: Scenario: `unset`ing block object `_type` is a noop<br>packages/editor/tests/event.block.unset.test.tsx:276 test: Scenario: `unset`ing text block `markDefs` removes the annotation<br>packages/editor/tests/event.block.unset.test.tsx:344 test: Scenario: `unset`ing text block `style` `set`s the default style<br>packages/editor/tests/event.block.unset.test.tsx:450 test: Scenario: `unset`ing text block `listItem` and `level` removes them<br>packages/editor/tests/event.block.unset.test.tsx:510 test: Scenario: `unset`ing text block `_key` `set`s a new `_key`<br>packages/editor/tests/event.block.unset.test.tsx:551 test: Scenario: `unset`ing text block `_type` is a noop<br>packages/editor/tests/event.block.unset.test.tsx:632 test: Scenario: `unset`ing text block children removes them and normalization restores |
| 113 | `packages/editor/tests/event.child.set.test.tsx` | portable-mixed | PT-H12 | 6 | packages/editor/tests/event.child.set.test.tsx:8 describe: event.child.set<br>packages/editor/tests/event.child.set.test.tsx:9 test: Scenario: Setting properties on inline object<br>packages/editor/tests/event.child.set.test.tsx:95 test: Scenario: Patches when setting properties on inline object<br>packages/editor/tests/event.child.set.test.tsx:205 test: Scenario: Setting _key on inline object<br>packages/editor/tests/event.child.set.test.tsx:308 test: Scenario: Setting properties on span<br>packages/editor/tests/event.child.set.test.tsx:373 test: Scenario: Setting "text" field on inline object |
| 114 | `packages/editor/tests/event.child.unset.test.tsx` | portable-mixed | PT-H12 | 7 | packages/editor/tests/event.child.unset.test.tsx:10 describe: event.child.unset<br>packages/editor/tests/event.child.unset.test.tsx:11 test: Scenario: Unsetting span marks<br>packages/editor/tests/event.child.unset.test.tsx:80 test: Scenario: Unsetting span _key<br>packages/editor/tests/event.child.unset.test.tsx:138 test: Scenario: Unsetting span _type<br>packages/editor/tests/event.child.unset.test.tsx:199 test: Scenario: Unsetting span text<br>packages/editor/tests/event.child.unset.test.tsx:269 test: Scenario: Unsetting reserved properties on span<br>packages/editor/tests/event.child.unset.test.tsx:440 test: Scenario: Unsetting properties on inline object |
| 115 | `packages/editor/tests/event.delete.backward.test.tsx` | portable | PT-H05 | 14 | packages/editor/tests/event.delete.backward.test.tsx:26 describe: event.delete.backward<br>packages/editor/tests/event.delete.backward.test.tsx:27 test: Scenario: Deleting lonely block object<br>packages/editor/tests/event.delete.backward.test.tsx:117 test: Scenario: Executing delete.backward<br>packages/editor/tests/event.delete.backward.test.tsx:140 test: Scenario: Merging two text blocks<br>packages/editor/tests/event.delete.backward.test.tsx:245 describe: Scenario: Deleting word<br>packages/editor/tests/event.delete.backward.test.tsx:257 describe: with selection<br>packages/editor/tests/event.delete.backward.test.tsx:258 test: collapsed selection<br>packages/editor/tests/event.delete.backward.test.tsx:292 test: expanded selection<br>packages/editor/tests/event.delete.backward.test.tsx:324 describe: without selection<br>packages/editor/tests/event.delete.backward.test.tsx:325 test: collapsed selection<br>packages/editor/tests/event.delete.backward.test.tsx:353 test: expanded selection<br>packages/editor/tests/event.delete.backward.test.tsx:383 describe: Scenario: Deleting line<br>packages/editor/tests/event.delete.backward.test.tsx:384 test: with selection<br>packages/editor/tests/event.delete.backward.test.tsx:422 test: without selection |
| 116 | `packages/editor/tests/event.delete.block.test.tsx` | portable | PT-H05 | 3 | packages/editor/tests/event.delete.block.test.tsx:15 describe: event.delete.block<br>packages/editor/tests/event.delete.block.test.tsx:16 test: Scenario: Deleting lonely block object<br>packages/editor/tests/event.delete.block.test.tsx:108 test: Scenario: Deleting lonely text block creates a placeholder block |
| 117 | `packages/editor/tests/event.delete.forward.test.tsx` | portable | PT-H05 | 3 | packages/editor/tests/event.delete.forward.test.tsx:21 describe: event.delete.forward<br>packages/editor/tests/event.delete.forward.test.tsx:22 test: Scenario: Deleting lonely block object<br>packages/editor/tests/event.delete.forward.test.tsx:112 test: Scenario: Merging two text blocks |
| 118 | `packages/editor/tests/event.delete.matrix.test.tsx` | portable | PT-H05 | 15 | packages/editor/tests/event.delete.matrix.test.tsx:22 describe: event.delete \| unified primitives matrix<br>packages/editor/tests/event.delete.matrix.test.tsx:23 test: collapsed selection with default unit deletes one character forward<br>packages/editor/tests/event.delete.matrix.test.tsx:41 test: collapsed selection with backward direction deletes one character backward<br>packages/editor/tests/event.delete.matrix.test.tsx:59 test: collapsed selection with unit:word deletes the word backward<br>packages/editor/tests/event.delete.matrix.test.tsx:77 test: collapsed selection with unit:block unsets the block<br>packages/editor/tests/event.delete.matrix.test.tsx:102 test: collapsed selection on a void block unsets the void<br>packages/editor/tests/event.delete.matrix.test.tsx:121 test: expanded range within a single span trims the text<br>packages/editor/tests/event.delete.matrix.test.tsx:143 test: expanded range across two same-block spans with different marks keeps boundaries<br>packages/editor/tests/event.delete.matrix.test.tsx:169 test: expanded range across two text blocks merges the blocks<br>packages/editor/tests/event.delete.matrix.test.tsx:196 test: expanded range from offset 0 of start block preserves the end block key<br>packages/editor/tests/event.delete.matrix.test.tsx:233 test: expanded range with a void at the start unsets the void and trims the end<br>packages/editor/tests/event.delete.matrix.test.tsx:256 test: expanded range with a void at the end trims the start and unsets the void<br>packages/editor/tests/event.delete.matrix.test.tsx:278 test: expanded range from one void to another removes the entire region between<br>packages/editor/tests/event.delete.matrix.test.tsx:301 test: expanded range across more than two blocks removes the middle blocks<br>packages/editor/tests/event.delete.matrix.test.tsx:333 test: inline object inside a span range is removed |
| 119 | `packages/editor/tests/event.delete.test.tsx` | portable | PT-H05 | 26 | packages/editor/tests/event.delete.test.tsx:19 describe: event.delete<br>packages/editor/tests/event.delete.test.tsx:20 test: Scenario: Deleting collapsed selection<br>packages/editor/tests/event.delete.test.tsx:104 test: Scenario: Deleting entire editor<br>packages/editor/tests/event.delete.test.tsx:163 test: Scenario: Deleting selection hanging around a block object<br>packages/editor/tests/event.delete.test.tsx:213 test: Scenario: Deleting selection hanging around a block object #2<br>packages/editor/tests/event.delete.test.tsx:264 test: Scenario: Deleting selection hanging around a block object #3<br>packages/editor/tests/event.delete.test.tsx:314 describe: Scenario: Deleting backwards selection starting on a block object<br>packages/editor/tests/event.delete.test.tsx:349 describe: with trailing text block<br>packages/editor/tests/event.delete.test.tsx:350 test: without selection<br>packages/editor/tests/event.delete.test.tsx:383 test: with selection<br>packages/editor/tests/event.delete.test.tsx:433 test: without trailing text block<br>packages/editor/tests/event.delete.test.tsx:463 test: Scenario: Deleting block offset<br>packages/editor/tests/event.delete.test.tsx:539 test: Scenario: Deleting multiple blocks<br>packages/editor/tests/event.delete.test.tsx:591 test: Scenario: Deleting without selection<br>packages/editor/tests/event.delete.test.tsx:622 test: Scenario: Deleting before selection<br>packages/editor/tests/event.delete.test.tsx:670 test: Scenario: Deleting after selection<br>packages/editor/tests/event.delete.test.tsx:718 describe: unit: child<br>packages/editor/tests/event.delete.test.tsx:719 describe: Scenario: deleting text block children<br>packages/editor/tests/event.delete.test.tsx:739 test: end-to-end selection<br>packages/editor/tests/event.delete.test.tsx:768 test: mid-span to mid-span selection<br>packages/editor/tests/event.delete.test.tsx:797 test: partial span selection<br>packages/editor/tests/event.delete.test.tsx:828 test: inline object selection<br>packages/editor/tests/event.delete.test.tsx:858 test: Scenario: Deleting block object<br>packages/editor/tests/event.delete.test.tsx:888 test: Scenario: Deleting across block object<br>packages/editor/tests/event.delete.test.tsx:941 test: Scenario: Delete backward uses at location instead of selection<br>packages/editor/tests/event.delete.test.tsx:983 test: Scenario: Deleting lonely block object |
| 120 | `packages/editor/tests/event.drag.drop.self-drop.test.tsx` | portable-mixed | PT-H07 | 6 | packages/editor/tests/event.drag.drop.self-drop.test.tsx:8 describe: event.drag.drop self-drop semantics<br>packages/editor/tests/event.drag.drop.self-drop.test.tsx:9 test: Scenario: collapsed drop inside expanded drag origin is suppressed<br>packages/editor/tests/event.drag.drop.self-drop.test.tsx:84 test: Scenario: collapsed drop at start edge of expanded drag origin is suppressed<br>packages/editor/tests/event.drag.drop.self-drop.test.tsx:156 test: Scenario: collapsed drop at end edge of expanded drag origin is suppressed<br>packages/editor/tests/event.drag.drop.self-drop.test.tsx:228 test: Scenario: drop onto block-object inside drag origin is suppressed<br>packages/editor/tests/event.drag.drop.self-drop.test.tsx:315 test: Scenario: drop after the drag origin end is allowed |
| 121 | `packages/editor/tests/event.drag.drop.test.tsx` | portable-mixed | PT-H07 | 5 | packages/editor/tests/event.drag.drop.test.tsx:10 describe: event.drag.drop<br>packages/editor/tests/event.drag.drop.test.tsx:11 test: Scenario: Dragging inline object<br>packages/editor/tests/event.drag.drop.test.tsx:131 test: Scenario: Dragging block object<br>packages/editor/tests/event.drag.drop.test.tsx:238 test: Scenario: Dragging a block-object between cells of a multi-row table moves it (does not duplicate)<br>packages/editor/tests/event.drag.drop.test.tsx:532 test: Scenario: Dragging a multi-block selection (text + image + text) inside a cell drags the whole selection |
| 122 | `packages/editor/tests/event.focus.test.tsx` | portable | PT-H01 | 3 | packages/editor/tests/event.focus.test.tsx:10 describe: event.focus<br>packages/editor/tests/event.focus.test.tsx:11 test: Scenario: Immediate focus after decorator toggle<br>packages/editor/tests/event.focus.test.tsx:66 test: Scenario: Delayed focus after decorator toggle |
| 123 | `packages/editor/tests/event.history.redo.test.tsx` | portable-mixed | PT-H12 | 3 | packages/editor/tests/event.history.redo.test.tsx:8 describe: event.history.redo<br>packages/editor/tests/event.history.redo.test.tsx:9 test: Scenario: Redo after remote patches<br>packages/editor/tests/event.history.redo.test.tsx:65 test: Scenario: Simple redo without remote patches |
| 124 | `packages/editor/tests/event.history.undo.test.tsx` | portable-mixed | PT-H12 | 22 | packages/editor/tests/event.history.undo.test.tsx:18 describe: event.history.undo<br>packages/editor/tests/event.history.undo.test.tsx:19 test: Scenario: Undoing action sets<br>packages/editor/tests/event.history.undo.test.tsx:71 test: Scenario: Undoing one-action action sets<br>packages/editor/tests/event.history.undo.test.tsx:102 test: Scenario: Undoing `insert.text` after `delete`<br>packages/editor/tests/event.history.undo.test.tsx:168 test: Scenario: Undoing raised action sets<br>packages/editor/tests/event.history.undo.test.tsx:210 test: Scenario: Undoing recursive raises<br>packages/editor/tests/event.history.undo.test.tsx:251 test: Scenario: A lonely `forward` action does not squash the recursive undo stack<br>packages/editor/tests/event.history.undo.test.tsx:289 describe: Scenario Outline: Custom events<br>packages/editor/tests/event.history.undo.test.tsx:290 test: Scenario: execute<br>packages/editor/tests/event.history.undo.test.tsx:335 test: Scenario: forward<br>packages/editor/tests/event.history.undo.test.tsx:380 test: Scenario: raise<br>packages/editor/tests/event.history.undo.test.tsx:426 test: Scenario: `forward` in one step, `raise` in another<br>packages/editor/tests/event.history.undo.test.tsx:460 test: Scenario: `forward` twice in same step<br>packages/editor/tests/event.history.undo.test.tsx:488 test: Scenario: `forward` twice in separate steps<br>packages/editor/tests/event.history.undo.test.tsx:519 test: Scenario: two `forward`s in separate steps does not squash the undo stack<br>packages/editor/tests/event.history.undo.test.tsx:578 test: Scenario: Undo after moving cursor after ended Behavior<br>packages/editor/tests/event.history.undo.test.tsx:620 test: Scenario: Forwarding `insert.text` preserves undo batching<br>packages/editor/tests/event.history.undo.test.tsx:656 test: Scenario: Forwarding `insert.text` with side effect preserves undo batching<br>packages/editor/tests/event.history.undo.test.tsx:702 test: Scenario: Forwarding `insert.text` with `raise` preserves undo batching<br>packages/editor/tests/event.history.undo.test.tsx:754 test: Scenario: Undo after sending `select` after ended Behavior<br>packages/editor/tests/event.history.undo.test.tsx:815 test: Scenario: Undoing decorator add across a range<br>packages/editor/tests/event.history.undo.test.tsx:874 test: Scenario: Undoing annotation add across a range |
| 125 | `packages/editor/tests/event.input.test.tsx` | portable-mixed | PT-H12 | 6 | packages/editor/tests/event.input.test.tsx:11 describe: event.input.*<br>packages/editor/tests/event.input.test.tsx:12 test: Scenario: text/html equal to text/plain<br>packages/editor/tests/event.input.test.tsx:86 test: Scenario: only text/plain<br>packages/editor/tests/event.input.test.tsx:153 test: Scenario: multi-line text/plain falls through to deserialize<br>packages/editor/tests/event.input.test.tsx:231 test: Scenario: text/plain with soft break<br>packages/editor/tests/event.input.test.tsx:295 test: Scenario: multi-line text/html equal to text/plain falls through to deserialize |
| 126 | `packages/editor/tests/event.insert.block.test.tsx` | portable | PT-H04 | 38 | packages/editor/tests/event.insert.block.test.tsx:16 describe: event.insert.block<br>packages/editor/tests/event.insert.block.test.tsx:17 test: Scenario: Inserting block with custom _key<br>packages/editor/tests/event.insert.block.test.tsx:72 test: Scenario: Inserting two blocks with same custom _key<br>packages/editor/tests/event.insert.block.test.tsx:156 test: Scenario: Stripping unknown text block props<br>packages/editor/tests/event.insert.block.test.tsx:216 test: Scenario: Stripping unknown span props<br>packages/editor/tests/event.insert.block.test.tsx:271 test: Scenario: Inserting block in an empty editor<br>packages/editor/tests/event.insert.block.test.tsx:415 test: Scenario: Inserting block with lonely inline object<br>packages/editor/tests/event.insert.block.test.tsx:509 test: Scenario: Inserting block with two inline objects<br>packages/editor/tests/event.insert.block.test.tsx:608 test: Scenario: Inserting text block into empty heading replaces it<br>packages/editor/tests/event.insert.block.test.tsx:648 test: Scenario: Inserting text block into empty blockquote replaces it<br>packages/editor/tests/event.insert.block.test.tsx:694 describe: empty list item replacement<br>packages/editor/tests/event.insert.block.test.tsx:695 test: without selection, without `at` - list properties NOT inherited<br>packages/editor/tests/event.insert.block.test.tsx:743 test: with selection, without `at` - list properties inherited<br>packages/editor/tests/event.insert.block.test.tsx:801 test: without selection, with `at` - list properties inherited<br>packages/editor/tests/event.insert.block.test.tsx:856 test: with selection, with `at` - `at` takes precedence<br>packages/editor/tests/event.insert.block.test.tsx:941 test: Scenario: Inserting block after block object using at prop<br>packages/editor/tests/event.insert.block.test.tsx:1005 test: Scenario: Inserting block object in middle of text block with select=start<br>packages/editor/tests/event.insert.block.test.tsx:1099 test: Scenario: Inserting block object in middle of text block with select=end<br>packages/editor/tests/event.insert.block.test.tsx:1193 test: Scenario: Inserting block object with expanded selection covering entire block<br>packages/editor/tests/event.insert.block.test.tsx:1265 test: Scenario: Inserting block object with expanded selection starting at block start<br>packages/editor/tests/event.insert.block.test.tsx:1344 test: Scenario: Inserting block object with expanded selection ending at block end<br>packages/editor/tests/event.insert.block.test.tsx:1423 test: Scenario: Inserting text block with expanded selection in middle of block<br>packages/editor/tests/event.insert.block.test.tsx:1504 test: Scenario: Inserting block object with expanded selection in middle of block<br>packages/editor/tests/event.insert.block.test.tsx:1583 test: Scenario: Inserting block object with cross-block expanded selection<br>packages/editor/tests/event.insert.block.test.tsx:1671 test: Scenario: Inserting text block with expanded selection covering entire block<br>packages/editor/tests/event.insert.block.test.tsx:1757 test: Scenario: Inserting text block with expanded selection starting at block start<br>packages/editor/tests/event.insert.block.test.tsx:1843 test: Scenario: Inserting text block with expanded selection ending at block end<br>packages/editor/tests/event.insert.block.test.tsx:1929 test: Scenario: Inserting text block with cross-block expanded selection<br>packages/editor/tests/event.insert.block.test.tsx:2024 test: Scenario: Inserting text block with expanded selection and select=end<br>packages/editor/tests/event.insert.block.test.tsx:2110 test: Scenario: Inserting text block with placement=before<br>packages/editor/tests/event.insert.block.test.tsx:2200 test: Scenario: Inserting a sibling after a container block with explicit placement<br>packages/editor/tests/event.insert.block.test.tsx:2291 test: Scenario: Inserting a sibling before a container block with explicit placement<br>packages/editor/tests/event.insert.block.test.tsx:2382 test: Scenario: placement=auto with at pointing at a container resolves into the container<br>packages/editor/tests/event.insert.block.test.tsx:2471 test: Scenario: placement=after with expanded selection across container uses end block as anchor<br>packages/editor/tests/event.insert.block.test.tsx:2602 test: Scenario: placement=before with expanded selection across container uses start block as anchor<br>packages/editor/tests/event.insert.block.test.tsx:2733 test: Scenario: placement=after with expanded selection inside container uses inner end block<br>packages/editor/tests/event.insert.block.test.tsx:2850 test: Scenario: placement=auto with expanded selection across container deletes the range and inserts<br>packages/editor/tests/event.insert.block.test.tsx:2957 test: Scenario: placement=auto with selection across two separate containers |
| 127 | `packages/editor/tests/event.insert.blocks.test.tsx` | portable | PT-H04 | 58 | packages/editor/tests/event.insert.blocks.test.tsx:12 describe: event.insert.blocks<br>packages/editor/tests/event.insert.blocks.test.tsx:13 test: Scenario: Inserting text block with lonely inline object<br>packages/editor/tests/event.insert.blocks.test.tsx:75 describe: Scenario: Inserting blocks with duplicate _keys<br>packages/editor/tests/event.insert.blocks.test.tsx:206 test: target: empty text, placement: auto, select: end<br>packages/editor/tests/event.insert.blocks.test.tsx:243 test: target: empty text, placement: auto, select: end, useAtProp: true<br>packages/editor/tests/event.insert.blocks.test.tsx:281 test: target: empty text, placement: auto, select: start<br>packages/editor/tests/event.insert.blocks.test.tsx:318 test: target: empty text, placement: auto, select: start, useAtProp: true<br>packages/editor/tests/event.insert.blocks.test.tsx:356 test: target: empty text, placement: auto, select: none<br>packages/editor/tests/event.insert.blocks.test.tsx:383 test: target: empty text, placement: auto, select: none, useAtProp: true<br>packages/editor/tests/event.insert.blocks.test.tsx:411 test: target: empty text, placement: before, select: end<br>packages/editor/tests/event.insert.blocks.test.tsx:449 test: target: empty text, placement: before, select: end, useAtProp: true<br>packages/editor/tests/event.insert.blocks.test.tsx:488 test: target: empty text, placement: before, select: start<br>packages/editor/tests/event.insert.blocks.test.tsx:526 test: target: empty text, placement: before, select: start, useAtProp: true<br>packages/editor/tests/event.insert.blocks.test.tsx:565 test: target: empty text, placement: before, select: none<br>packages/editor/tests/event.insert.blocks.test.tsx:594 test: target: empty text, placement: before, select: none, useAtProp: true<br>packages/editor/tests/event.insert.blocks.test.tsx:623 test: target: empty text, placement: after, select: end<br>packages/editor/tests/event.insert.blocks.test.tsx:661 test: target: empty text, placement: after, select: end, useAtProp: true<br>packages/editor/tests/event.insert.blocks.test.tsx:700 test: target: empty text, placement: after, select: start<br>packages/editor/tests/event.insert.blocks.test.tsx:738 test: target: empty text, placement: after, select: start, useAtProp: true<br>packages/editor/tests/event.insert.blocks.test.tsx:777 test: target: empty text, placement: after, select: none<br>packages/editor/tests/event.insert.blocks.test.tsx:806 test: target: empty text, placement: after, select: none, useAtProp: true<br>packages/editor/tests/event.insert.blocks.test.tsx:835 test: target: block object, placement: auto, select: end<br>packages/editor/tests/event.insert.blocks.test.tsx:873 test: target: block object, placement: auto, select: end, useAtProp: true<br>packages/editor/tests/event.insert.blocks.test.tsx:912 test: target: block object, placement: auto, select: start<br>packages/editor/tests/event.insert.blocks.test.tsx:950 test: target: block object, placement: auto, select: start, useAtProp: true<br>packages/editor/tests/event.insert.blocks.test.tsx:989 test: target: block object, placement: auto, select: none<br>packages/editor/tests/event.insert.blocks.test.tsx:1027 test: target: block object, placement: auto, select: none, useAtProp: true<br>packages/editor/tests/event.insert.blocks.test.tsx:1056 test: target: block object, placement: before, select: end<br>packages/editor/tests/event.insert.blocks.test.tsx:1094 test: target: block object, placement: before, select: end, useAtProp: true<br>packages/editor/tests/event.insert.blocks.test.tsx:1133 test: target: block object, placement: before, select: start<br>packages/editor/tests/event.insert.blocks.test.tsx:1171 test: target: block object, placement: before, select: start, useAtProp: true<br>packages/editor/tests/event.insert.blocks.test.tsx:1210 test: target: block object, placement: before, select: none<br>packages/editor/tests/event.insert.blocks.test.tsx:1248 test: target: block object, placement: before, select: none, useAtProp: true<br>packages/editor/tests/event.insert.blocks.test.tsx:1277 test: target: block object, placement: after, select: end<br>packages/editor/tests/event.insert.blocks.test.tsx:1315 test: target: block object, placement: after, select: end, useAtProp: true<br>packages/editor/tests/event.insert.blocks.test.tsx:1354 test: target: block object, placement: after, select: start<br>packages/editor/tests/event.insert.blocks.test.tsx:1392 test: target: block object, placement: after, select: start, useAtProp: true<br>packages/editor/tests/event.insert.blocks.test.tsx:1431 test: target: block object, placement: after, select: none<br>packages/editor/tests/event.insert.blocks.test.tsx:1469 test: target: block object, placement: after, select: none, useAtProp: true<br>packages/editor/tests/event.insert.blocks.test.tsx:1498 test: target: text-start, placement: auto, select: end<br>packages/editor/tests/event.insert.blocks.test.tsx:1536 test: target: text-start, placement: auto, select: end, useAtProp: true<br>packages/editor/tests/event.insert.blocks.test.tsx:1575 test: target: text-start, placement: auto, select: start<br>packages/editor/tests/event.insert.blocks.test.tsx:1613 test: target: text-start, placement: auto, select: start, useAtProp: true<br>packages/editor/tests/event.insert.blocks.test.tsx:1652 test: target: text-start, placement: auto, select: none<br>packages/editor/tests/event.insert.blocks.test.tsx:1681 test: target: text-start, placement: auto, select: none, useAtProp: true<br>packages/editor/tests/event.insert.blocks.test.tsx:1710 test: target: text-end, placement: auto, select: end<br>packages/editor/tests/event.insert.blocks.test.tsx:1748 test: target: text-end, placement: auto, select: end, useAtProp: true<br>packages/editor/tests/event.insert.blocks.test.tsx:1787 test: target: text-end, placement: auto, select: start<br>packages/editor/tests/event.insert.blocks.test.tsx:1825 test: target: text-end, placement: auto, select: start, useAtProp: true<br>packages/editor/tests/event.insert.blocks.test.tsx:1864 test: target: text-end, placement: auto, select: none<br>packages/editor/tests/event.insert.blocks.test.tsx:1893 test: target: text-end, placement: auto, select: none, useAtProp: true<br>packages/editor/tests/event.insert.blocks.test.tsx:1922 test: target: text-mid, placement: auto, select: end<br>packages/editor/tests/event.insert.blocks.test.tsx:1978 test: target: text-mid, placement: auto, select: end, useAtProp: true<br>packages/editor/tests/event.insert.blocks.test.tsx:2035 test: target: text-mid, placement: auto, select: start<br>packages/editor/tests/event.insert.blocks.test.tsx:2091 test: target: text-mid, placement: auto, select: start, useAtProp: true<br>packages/editor/tests/event.insert.blocks.test.tsx:2148 test: target: text-mid, placement: auto, select: none<br>packages/editor/tests/event.insert.blocks.test.tsx:2195 test: target: text-mid, placement: auto, select: none, useAtProp: true<br>packages/editor/tests/event.insert.blocks.test.tsx:2243 test: Scenario: aborting `insert.block` of a specific block |
| 128 | `packages/editor/tests/event.insert.child.test.tsx` | portable | PT-H04 | 5 | packages/editor/tests/event.insert.child.test.tsx:12 describe: event.insert.child<br>packages/editor/tests/event.insert.child.test.tsx:13 test: Scenario: Carrying over an annotation<br>packages/editor/tests/event.insert.child.test.tsx:111 test: Scenario: Inserting span on inline object<br>packages/editor/tests/event.insert.child.test.tsx:173 test: Scenario: Inserting inline object on inline object<br>packages/editor/tests/event.insert.child.test.tsx:235 test: Scenario: Inserting inline object at the end of text block |
| 129 | `packages/editor/tests/event.insert.inline-object.test.tsx` | portable | PT-H04 | 4 | packages/editor/tests/event.insert.inline-object.test.tsx:11 describe: event.insert.inline object<br>packages/editor/tests/event.insert.inline-object.test.tsx:12 test: Scenario: Inserting inline object without any initial fields<br>packages/editor/tests/event.insert.inline-object.test.tsx:53 test: Scenario: Inserting and focusing inline object<br>packages/editor/tests/event.insert.inline-object.test.tsx:221 test: Scenario: Inserting inline object on block object |
| 130 | `packages/editor/tests/event.insert.span.test.tsx` | portable | PT-H04 | 8 | packages/editor/tests/event.insert.span.test.tsx:10 describe: event.insert.span<br>packages/editor/tests/event.insert.span.test.tsx:11 test: Scenario: Unknown decorators are filtered out<br>packages/editor/tests/event.insert.span.test.tsx:41 test: Scenario: Inserting span with annotation<br>packages/editor/tests/event.insert.span.test.tsx:69 test: Scenario: Unknown annotations are filtered out<br>packages/editor/tests/event.insert.span.test.tsx:117 test: Scenario: Forwarding the event<br>packages/editor/tests/event.insert.span.test.tsx:155 test: Scenario: Executing the event<br>packages/editor/tests/event.insert.span.test.tsx:193 test: Scenario: Inserting on block object<br>packages/editor/tests/event.insert.span.test.tsx:237 test: Scenario: Inserting on inline object |
| 131 | `packages/editor/tests/event.insert.test.tsx` | portable | PT-H04 | 2 | packages/editor/tests/event.insert.test.tsx:6 describe: event.insert<br>packages/editor/tests/event.insert.test.tsx:7 test: Scenario: insert a node into an array |
| 132 | `packages/editor/tests/event.insert.text.test.tsx` | portable | PT-H04 | 11 | packages/editor/tests/event.insert.text.test.tsx:15 describe: event.insert.text<br>packages/editor/tests/event.insert.text.test.tsx:16 test: Scenario: Consecutive `insert.text` events<br>packages/editor/tests/event.insert.text.test.tsx:56 test: Scenario: `insert.text` can trigger `insert.child` events<br>packages/editor/tests/event.insert.text.test.tsx:127 test: Scenario: executing `insert.text` events<br>packages/editor/tests/event.insert.text.test.tsx:164 test: Scenario: executing after annotation<br>packages/editor/tests/event.insert.text.test.tsx:228 test: Scenario: Ignoring `insert.child` events for spans using `forward`<br>packages/editor/tests/event.insert.text.test.tsx:276 test: Scenario: Ignoring `insert.child` events for spans using `execute`<br>packages/editor/tests/event.insert.text.test.tsx:324 test: Scenario: Inserting text without a selection<br>packages/editor/tests/event.insert.text.test.tsx:334 test: Scenario: Inserting text on a block object is a no-op<br>packages/editor/tests/event.insert.text.test.tsx:385 test: Scenario: Inserting text at an inline object<br>packages/editor/tests/event.insert.text.test.tsx:457 test: Scenario: `insert.text` at an explicit position |
| 133 | `packages/editor/tests/event.keyboard.keydown.test.tsx` | portable-mixed | PT-H12 | 3 | packages/editor/tests/event.keyboard.keydown.test.tsx:11 describe: event.keyboard.keydown<br>packages/editor/tests/event.keyboard.keydown.test.tsx:48 test: Scenario: `execute` overwrites the native event<br>packages/editor/tests/event.keyboard.keydown.test.tsx:128 test: Scenario: `raise` overwrites the native event |
| 134 | `packages/editor/tests/event.move.block.cross-container.test.tsx` | portable-mixed | PT-H02 | 4 | packages/editor/tests/event.move.block.cross-container.test.tsx:31 describe: event.move.block cross-container<br>packages/editor/tests/event.move.block.cross-container.test.tsx:32 test: Scenario: Moving a root block to a destination inside a container lands before the destination<br>packages/editor/tests/event.move.block.cross-container.test.tsx:97 test: Scenario: Moving a block out of a container to a root destination lands before the destination<br>packages/editor/tests/event.move.block.cross-container.test.tsx:180 test: Scenario: Moving a block between two containers lands before the destination |
| 135 | `packages/editor/tests/event.move.block.selection.test.tsx` | portable | PT-H01 | 5 | packages/editor/tests/event.move.block.selection.test.tsx:8 describe: event.move.block regression<br>packages/editor/tests/event.move.block.selection.test.tsx:9 test: Scenario: Moving a block down preserves selection on the moved block<br>packages/editor/tests/event.move.block.selection.test.tsx:54 test: Scenario: Moving a block up preserves selection on the moved block<br>packages/editor/tests/event.move.block.selection.test.tsx:98 test: Scenario: Undoing a move.block restores original order<br>packages/editor/tests/event.move.block.selection.test.tsx:147 test: Scenario: Moving block down and typing continues in the moved block |
| 136 | `packages/editor/tests/event.move.block.test.tsx` | portable-mixed | PT-H12 | 12 | packages/editor/tests/event.move.block.test.tsx:26 describe: event.move.block down<br>packages/editor/tests/event.move.block.test.tsx:27 test: Scenario: Moving block object down<br>packages/editor/tests/event.move.block.test.tsx:55 test: Scenario: Moving text block down<br>packages/editor/tests/event.move.block.test.tsx:84 describe: event.move.block up<br>packages/editor/tests/event.move.block.test.tsx:85 test: Scenario: Moving block object up<br>packages/editor/tests/event.move.block.test.tsx:113 test: Scenario: Moving text block up<br>packages/editor/tests/event.move.block.test.tsx:142 describe: event.move.block<br>packages/editor/tests/event.move.block.test.tsx:143 test: Scenario: Moving a block onto its own path is a no-op<br>packages/editor/tests/event.move.block.test.tsx:163 test: Scenario: Moving a block forward past multiple siblings<br>packages/editor/tests/event.move.block.test.tsx:184 test: Scenario: Moving a block backward past multiple siblings<br>packages/editor/tests/event.move.block.test.tsx:205 test: Scenario: Swapping two adjacent blocks via direct move forward<br>packages/editor/tests/event.move.block.test.tsx:225 test: Scenario: Swapping two adjacent blocks via direct move backward |
| 137 | `packages/editor/tests/event.mutation.test.tsx` | portable-mixed | PT-H12 | 4 | packages/editor/tests/event.mutation.test.tsx:19 describe: event.mutation<br>packages/editor/tests/event.mutation.test.tsx:20 test: Scenario: Deferring mutation events when read-only<br>packages/editor/tests/event.mutation.test.tsx:97 test: Scenario: Batching typing mutations<br>packages/editor/tests/event.mutation.test.tsx:138 test: Scenario: Flushing pending mutations when unmounting |
| 138 | `packages/editor/tests/event.paste.test.tsx` | portable-mixed | PT-H06 | 8 | packages/editor/tests/event.paste.test.tsx:13 describe: event.clipboard.paste<br>packages/editor/tests/event.paste.test.tsx:14 test: Scenario: Cut/paste block object<br>packages/editor/tests/event.paste.test.tsx:154 describe: Scenario Outline: Pasting text/html with an inline image<br>packages/editor/tests/event.paste.test.tsx:228 test: Scenario: `image` ObjectMatcher (block and inline)<br>packages/editor/tests/event.paste.test.tsx:263 test: Scenario: block-only image matcher<br>packages/editor/tests/event.paste.test.tsx:315 test: Scenario: No matchers<br>packages/editor/tests/event.paste.test.tsx:339 test: Scenario: Copy/pasting expanded selection<br>packages/editor/tests/event.paste.test.tsx:426 test: Scenario: Copying an inline object writes portable text to the clipboard |
| 139 | `packages/editor/tests/event.patch.test.tsx` | portable-mixed | PT-H12 | 15 | packages/editor/tests/event.patch.test.tsx:18 describe: event.patch<br>packages/editor/tests/event.patch.test.tsx:19 test: Scenario: Deleting empty block above non-empty text block<br>packages/editor/tests/event.patch.test.tsx:86 test: Scenario: Inserting two text blocks where the first one is empty<br>packages/editor/tests/event.patch.test.tsx:182 test: Scenario: Inserting block object on empty editor<br>packages/editor/tests/event.patch.test.tsx:262 describe: Scenario: Setting and unsetting the editor<br>packages/editor/tests/event.patch.test.tsx:263 test: regular text block<br>packages/editor/tests/event.patch.test.tsx:381 test: text block with custom field<br>packages/editor/tests/event.patch.test.tsx:500 describe: applying patches to remote value<br>packages/editor/tests/event.patch.test.tsx:501 describe: remote value: []<br>packages/editor/tests/event.patch.test.tsx:502 test: Scenario: Typing into empty editor<br>packages/editor/tests/event.patch.test.tsx:527 test: Scenario: Pasting into empty editor<br>packages/editor/tests/event.patch.test.tsx:569 describe: remote value: undefined<br>packages/editor/tests/event.patch.test.tsx:570 test: Scenario: Typing into empty editor<br>packages/editor/tests/event.patch.test.tsx:595 test: Scenario: Pasting into empty editor<br>packages/editor/tests/event.patch.test.tsx:638 test: Scenario: Deleting all text with annotation |
| 140 | `packages/editor/tests/event.patches.test.tsx` | portable-mixed | PT-H12 | 95 | packages/editor/tests/event.patches.test.tsx:21 describe: event.patches<br>packages/editor/tests/event.patches.test.tsx:22 describe: Scenario: `set`ing the entire value<br>packages/editor/tests/event.patches.test.tsx:23 test: more blocks<br>packages/editor/tests/event.patches.test.tsx:95 test: fewer blocks<br>packages/editor/tests/event.patches.test.tsx:168 test: Scenario: Consuming initial diffMatchPatch<br>packages/editor/tests/event.patches.test.tsx:234 test: Scenario: Consuming initial insert patch<br>packages/editor/tests/event.patches.test.tsx:324 test: Scenario: Splitting initial block<br>packages/editor/tests/event.patches.test.tsx:414 test: Scenario: Patching while syncing initial value<br>packages/editor/tests/event.patches.test.tsx:488 test: Scenario: Patching while syncing incoming value<br>packages/editor/tests/event.patches.test.tsx:572 test: Scenario: Merging spans<br>packages/editor/tests/event.patches.test.tsx:647 test: Scenario: `set` text block key<br>packages/editor/tests/event.patches.test.tsx:691 test: Scenario: `set` block object key<br>packages/editor/tests/event.patches.test.tsx:731 test: Scenario: `set` span properties<br>packages/editor/tests/event.patches.test.tsx:843 test: Scenario: `unset` span properties<br>packages/editor/tests/event.patches.test.tsx:913 test: Scenario: `unset` lonely block<br>packages/editor/tests/event.patches.test.tsx:997 test: Scenario: `set` initial block object property<br>packages/editor/tests/event.patches.test.tsx:1039 test: `set` block object properties<br>packages/editor/tests/event.patches.test.tsx:1107 test: `set` nested block object properties<br>packages/editor/tests/event.patches.test.tsx:1185 test: Scenario: `unset` block object properties<br>packages/editor/tests/event.patches.test.tsx:1261 test: Scenario: `unset` `listItem` and `level`<br>packages/editor/tests/event.patches.test.tsx:1305 test: Scenario: Inserting inline object<br>packages/editor/tests/event.patches.test.tsx:1342 test: Scenario: `set` inline object properties<br>packages/editor/tests/event.patches.test.tsx:1455 test: Scenario: `set` on `_key` of inline object<br>packages/editor/tests/event.patches.test.tsx:1512 test: Scenario: `set` on `_type` of inline object<br>packages/editor/tests/event.patches.test.tsx:1569 test: Scenario: `set`ing "text" field on inline object<br>packages/editor/tests/event.patches.test.tsx:1637 test: Scenario: `set`ing "text" field on span<br>packages/editor/tests/event.patches.test.tsx:1706 test: Scenario: `unset` inline object properties<br>packages/editor/tests/event.patches.test.tsx:1777 test: Scenario: `unset` on `_key` and `_type` of inline object<br>packages/editor/tests/event.patches.test.tsx:1863 test: Scenario: `set`ing `style` on text block<br>packages/editor/tests/event.patches.test.tsx:1906 test: Scenario: `set`ing deep inside text block<br>packages/editor/tests/event.patches.test.tsx:1988 test: Scenario: `unset`ing last text block and `insert`ing a new one<br>packages/editor/tests/event.patches.test.tsx:2041 describe: Feature: diffMatchPatch<br>packages/editor/tests/event.patches.test.tsx:2071 test: Scenario: Adding and removing text to an empty editor<br>packages/editor/tests/event.patches.test.tsx:2127 test: Scenario: Adding text<br>packages/editor/tests/event.patches.test.tsx:2167 test: Scenario: Removing text<br>packages/editor/tests/event.patches.test.tsx:2207 test: Scenario: Same text<br>packages/editor/tests/event.patches.test.tsx:2247 test: Scenario: Adding and removing text<br>packages/editor/tests/event.patches.test.tsx:2287 test: Scenario: Adding and removing text #2<br>packages/editor/tests/event.patches.test.tsx:2328 test: Scenario: Reverse line edits<br>packages/editor/tests/event.patches.test.tsx:2371 test: Scenario: Larger text differences<br>packages/editor/tests/event.patches.test.tsx:2412 test: Scenario: Offset text differences<br>packages/editor/tests/event.patches.test.tsx:2453 test: Scenario: diffMatchPatch inside callout<br>packages/editor/tests/event.patches.test.tsx:2559 test: Scenario: `set` block with new markDef<br>packages/editor/tests/event.patches.test.tsx:2645 describe: `insert`<br>packages/editor/tests/event.patches.test.tsx:2646 test: Scenario: Inserting block object on empty editor<br>packages/editor/tests/event.patches.test.tsx:2689 test: Scenario: Inserting text block on empty editor<br>packages/editor/tests/event.patches.test.tsx:2765 describe: Scenario Outline: Inserting two text blocks on empty editor<br>packages/editor/tests/event.patches.test.tsx:2766 test: Scenario: Both blocks are empty<br>packages/editor/tests/event.patches.test.tsx:2809 test: Scenario: First block is empty<br>packages/editor/tests/event.patches.test.tsx:2853 test: Scenario: Second block is empty<br>packages/editor/tests/event.patches.test.tsx:2896 test: Scenario: First block has no _key<br>packages/editor/tests/event.patches.test.tsx:2951 test: Scenario: `before` on numeric index 0 prepends to a non-empty array<br>packages/editor/tests/event.patches.test.tsx:3011 test: Scenario: `after` on a numeric index inserts after the indexed sibling<br>packages/editor/tests/event.patches.test.tsx:3071 test: Scenario: `before` on a numeric index inserts before the indexed sibling<br>packages/editor/tests/event.patches.test.tsx:3132 describe: `setIfMissing`<br>packages/editor/tests/event.patches.test.tsx:3133 test: Scenario: Setting empty array on non-empty editor is a noop<br>packages/editor/tests/event.patches.test.tsx:3169 test: Scenario: Setting empty array on empty editor is a noop<br>packages/editor/tests/event.patches.test.tsx:3203 test: Scenario: Setting missing text block property<br>packages/editor/tests/event.patches.test.tsx:3240 test: Scenario: Setting existing text block property is a noop<br>packages/editor/tests/event.patches.test.tsx:3278 test: Scenario: Setting nested text block property<br>packages/editor/tests/event.patches.test.tsx:3320 test: Scenario: Setting existing nested text block property is a noop<br>packages/editor/tests/event.patches.test.tsx:3357 test: Scenario: Setting markDef property<br>packages/editor/tests/event.patches.test.tsx:3408 test: Scenario: Setting existing markDef property is a noop<br>packages/editor/tests/event.patches.test.tsx:3460 test: Scenario: Setting nested markDef property<br>packages/editor/tests/event.patches.test.tsx:3512 test: Scenario: Setting existing nested markDef property is a noop<br>packages/editor/tests/event.patches.test.tsx:3559 test: Scenario: Setting missing block object property<br>packages/editor/tests/event.patches.test.tsx:3600 test: Scenario: Setting existing block object property is a noop<br>packages/editor/tests/event.patches.test.tsx:3637 test: Scenario: Setting block object property where existing value is 0 is a noop<br>packages/editor/tests/event.patches.test.tsx:3674 test: Scenario: Setting block object property where existing value is false is a noop<br>packages/editor/tests/event.patches.test.tsx:3711 test: Scenario: Setting block object property where existing value is null is a noop<br>packages/editor/tests/event.patches.test.tsx:3748 test: Scenario: Setting object property on block object<br>packages/editor/tests/event.patches.test.tsx:3791 test: Scenario: Setting array property on block object<br>packages/editor/tests/event.patches.test.tsx:3832 test: Scenario: Composing patches on block object<br>packages/editor/tests/event.patches.test.tsx:3879 test: Scenario: Setting nested block object property<br>packages/editor/tests/event.patches.test.tsx:3919 test: Scenario: Setting existing nested block object property is a noop<br>packages/editor/tests/event.patches.test.tsx:3954 test: Scenario: Setting missing span property<br>packages/editor/tests/event.patches.test.tsx:3992 test: Scenario: Setting existing span property is a noop<br>packages/editor/tests/event.patches.test.tsx:4027 test: Scenario: Setting span text is a noop<br>packages/editor/tests/event.patches.test.tsx:4060 test: Scenario: Setting nested span property<br>packages/editor/tests/event.patches.test.tsx:4100 test: Scenario: Setting existing nested span property is a noop<br>packages/editor/tests/event.patches.test.tsx:4142 test: Scenario: `unset` nested text block property<br>packages/editor/tests/event.patches.test.tsx:4187 test: Scenario: `set` text block with new `children`<br>packages/editor/tests/event.patches.test.tsx:4243 test: Scenario: `set` `children` array directly on text block<br>packages/editor/tests/event.patches.test.tsx:4291 test: Scenario: `set` `children` with lone inline object normalizes surrounding spans<br>packages/editor/tests/event.patches.test.tsx:4372 test: Scenario: `set` `children` with span missing `text` normalizes text<br>packages/editor/tests/event.patches.test.tsx:4436 test: Scenario: `set` deep property on block object in a single patch<br>packages/editor/tests/event.patches.test.tsx:4495 test: Scenario: `unset` deep property on block object<br>packages/editor/tests/event.patches.test.tsx:4556 test: Scenario: `unset` markDef property<br>packages/editor/tests/event.patches.test.tsx:4633 test: Scenario: `setIfMissing` deep property on block object<br>packages/editor/tests/event.patches.test.tsx:4718 test: Scenario: `unset` the entire value<br>packages/editor/tests/event.patches.test.tsx:4773 describe: container insert patches<br>packages/editor/tests/event.patches.test.tsx:4851 test: insert a block into a callout content field<br>packages/editor/tests/event.patches.test.tsx:4974 test: insert a span into a text block inside a callout<br>packages/editor/tests/event.patches.test.tsx:5082 test: insert a block into a table cell content field<br>packages/editor/tests/event.patches.test.tsx:5239 test: insert a block into an empty callout content field at numeric index 0 |
| 141 | `packages/editor/tests/event.ready.test.tsx` | portable-mixed | PT-H12 | 3 | packages/editor/tests/event.ready.test.tsx:6 describe: event.ready<br>packages/editor/tests/event.ready.test.tsx:7 test: emits for "undefined" initial value<br>packages/editor/tests/event.ready.test.tsx:17 test: emits for "[]" initial value |
| 142 | `packages/editor/tests/event.remove.text.test.tsx` | portable-mixed | PT-H12 | 2 | packages/editor/tests/event.remove.text.test.tsx:6 describe: event.remove.text<br>packages/editor/tests/event.remove.text.test.tsx:7 test: Scenario: remove.text at an explicit position |
| 143 | `packages/editor/tests/event.select.block.test.tsx` | portable-mixed | PT-H12 | 12 | packages/editor/tests/event.select.block.test.tsx:29 describe: event.select.previous block<br>packages/editor/tests/event.select.block.test.tsx:30 test: Scenario: No `select` property<br>packages/editor/tests/event.select.block.test.tsx:57 test: Scenario: `select` property is `start`<br>packages/editor/tests/event.select.block.test.tsx:84 test: Scenario: `select` property is `end`<br>packages/editor/tests/event.select.block.test.tsx:112 describe: event.select.next block<br>packages/editor/tests/event.select.block.test.tsx:113 test: Scenario: No `select` property<br>packages/editor/tests/event.select.block.test.tsx:140 test: Scenario: `select` property is `start`<br>packages/editor/tests/event.select.block.test.tsx:167 test: Scenario: `select` property is `end`<br>packages/editor/tests/event.select.block.test.tsx:195 describe: event.select.block<br>packages/editor/tests/event.select.block.test.tsx:196 test: Scenario: No `select` property<br>packages/editor/tests/event.select.block.test.tsx:238 test: Scenario: `select` property is `start`<br>packages/editor/tests/event.select.block.test.tsx:282 test: Scenario: `select` property is `end` |
| 144 | `packages/editor/tests/event.select.test.tsx` | portable-mixed | PT-H12 | 9 | packages/editor/tests/event.select.test.tsx:22 describe: event.select<br>packages/editor/tests/event.select.test.tsx:23 test: Scenario: Arrow navigation causes `select` event<br>packages/editor/tests/event.select.test.tsx:153 test: Scenario: No double-`select` event<br>packages/editor/tests/event.select.test.tsx:329 test: Scenario: Typing text does not raise `select` event<br>packages/editor/tests/event.select.test.tsx:402 test: Scenario: `focus` event raises `select` event<br>packages/editor/tests/event.select.test.tsx:462 test: Scenario: Overriding arrow navigation by raising `select` event<br>packages/editor/tests/event.select.test.tsx:590 test: Scenario: Preventing arrow navigation by swallowing the `select` event<br>packages/editor/tests/event.select.test.tsx:708 test: Scenario: Arrow navigation raises `select` event<br>packages/editor/tests/event.select.test.tsx:823 test: Scenario: Synthetic `insert.text` event does not raise `select` event |
| 145 | `packages/editor/tests/event.set.test.tsx` | portable-mixed | PT-H12 | 2 | packages/editor/tests/event.set.test.tsx:6 describe: event.set<br>packages/editor/tests/event.set.test.tsx:7 test: Scenario: set on a block property |
| 146 | `packages/editor/tests/event.split.test.tsx` | portable-mixed | PT-H12 | 8 | packages/editor/tests/event.split.test.tsx:10 describe: event.split<br>packages/editor/tests/event.split.test.tsx:11 test: Scenario: Splitting mid-block before inline object<br>packages/editor/tests/event.split.test.tsx:61 test: Scenario: Splitting text block with custom properties<br>packages/editor/tests/event.split.test.tsx:108 test: Scenario: Splitting inline object is a noop<br>packages/editor/tests/event.split.test.tsx:187 test: Scenario: Splitting block object is a noop<br>packages/editor/tests/event.split.test.tsx:239 test: Scenario: Splitting with an expanded selection starting on a block object<br>packages/editor/tests/event.split.test.tsx:329 test: Scenario: Splitting with an expanded selection ending on a block object<br>packages/editor/tests/event.split.test.tsx:403 test: Scenario: Splitting with an expanded selection from one span to another |
| 147 | `packages/editor/tests/event.unset.test.tsx` | portable-mixed | PT-H12 | 3 | packages/editor/tests/event.unset.test.tsx:6 describe: event.unset<br>packages/editor/tests/event.unset.test.tsx:7 test: Scenario: unset a property on a block<br>packages/editor/tests/event.unset.test.tsx:44 test: Scenario: unset removes a node from an array |
| 148 | `packages/editor/tests/event.update-value.container.test.tsx` | portable-mixed | PT-H02 | 15 | packages/editor/tests/event.update-value.container.test.tsx:60 describe: event.update value with containers<br>packages/editor/tests/event.update-value.container.test.tsx:61 test: Scenario: Update text inside a container line<br>packages/editor/tests/event.update-value.container.test.tsx:118 test: Scenario: Add a new line to a container<br>packages/editor/tests/event.update-value.container.test.tsx:188 test: Scenario: Remove a line from a container<br>packages/editor/tests/event.update-value.container.test.tsx:256 test: Scenario: Reorder lines within a container<br>packages/editor/tests/event.update-value.container.test.tsx:337 test: Scenario: Replace a container with a text block<br>packages/editor/tests/event.update-value.container.test.tsx:393 test: Scenario: Replace a text block with a container<br>packages/editor/tests/event.update-value.container.test.tsx:443 test: Scenario: Change a line inside a container (keyed diff)<br>packages/editor/tests/event.update-value.container.test.tsx:500 test: Scenario: Update non-block-array property on a container<br>packages/editor/tests/event.update-value.container.test.tsx:559 test: Scenario: Deep-nested update inside a table cell<br>packages/editor/tests/event.update-value.container.test.tsx:703 test: Scenario: Syncing the same container is a noop (equality check)<br>packages/editor/tests/event.update-value.container.test.tsx:743 test: Scenario: Selection is preserved when container lines change around it<br>packages/editor/tests/event.update-value.container.test.tsx:886 test: Scenario: Changing container type (same key, different _type)<br>packages/editor/tests/event.update-value.container.test.tsx:946 test: Scenario: Line key changes while editor has selection in that line (remote rewrite)<br>packages/editor/tests/event.update-value.container.test.tsx:1036 test: Scenario: Insert a block object INSIDE the container lines array (heterogeneous children) |
| 149 | `packages/editor/tests/event.update-value.test.tsx` | portable-mixed | PT-H12 | 28 | packages/editor/tests/event.update-value.test.tsx:8 describe: event.update value<br>packages/editor/tests/event.update-value.test.tsx:9 test: Scenario: Clearing placeholder value<br>packages/editor/tests/event.update-value.test.tsx:56 test: Scenario: Updating and then clearing placeholder value<br>packages/editor/tests/event.update-value.test.tsx:125 test: Scenario: updating block object property<br>packages/editor/tests/event.update-value.test.tsx:175 test: Scenario: Updating the text of an empty span<br>packages/editor/tests/event.update-value.test.tsx:227 test: Scenario: Updating before 'ready'<br>packages/editor/tests/event.update-value.test.tsx:277 test: Scenario: Adding blocks before existing block<br>packages/editor/tests/event.update-value.test.tsx:334 test: Scenario: Clearing lonely block object<br>packages/editor/tests/event.update-value.test.tsx:384 test: Scenario: Clearing lonely text block<br>packages/editor/tests/event.update-value.test.tsx:455 test: Scenario: Updating text while read-only<br>packages/editor/tests/event.update-value.test.tsx:504 test: Scenario: Updating with unknown block object<br>packages/editor/tests/event.update-value.test.tsx:556 test: Scenario: Updating span with reordered marks<br>packages/editor/tests/event.update-value.test.tsx:623 test: Scenario: Changing block type from text to block object (same key)<br>packages/editor/tests/event.update-value.test.tsx:680 test: Scenario: Changing child type from span to inline object (same key)<br>packages/editor/tests/event.update-value.test.tsx:746 test: Scenario: Syncing the same block object is a noop<br>packages/editor/tests/event.update-value.test.tsx:815 test: Scenario: Changing and adding text block children<br>packages/editor/tests/event.update-value.test.tsx:880 test: Scenario: Removing children from a block that is not the first block<br>packages/editor/tests/event.update-value.test.tsx:984 test: Scenario: Reordering children within a block (same keys, different positions)<br>packages/editor/tests/event.update-value.test.tsx:1063 test: Scenario: Updating inline object value (same key)<br>packages/editor/tests/event.update-value.test.tsx:1143 test: Scenario: Selection restoration when block type changes<br>packages/editor/tests/event.update-value.test.tsx:1241 test: Scenario: Removing a custom block property<br>packages/editor/tests/event.update-value.test.tsx:1300 test: Scenario: Adding new children to a text block (pure addition)<br>packages/editor/tests/event.update-value.test.tsx:1350 test: Scenario: Replacing all children with different keys<br>packages/editor/tests/event.update-value.test.tsx:1400 test: Scenario: Reordering children and modifying text simultaneously<br>packages/editor/tests/event.update-value.test.tsx:1448 test: Scenario: Reordering top-level blocks<br>packages/editor/tests/event.update-value.test.tsx:1512 test: Scenario: Multiple blocks with children changes in same update<br>packages/editor/tests/event.update-value.test.tsx:1577 test: Scenario: Removing blocks from the end (remote value has fewer blocks)<br>packages/editor/tests/event.update-value.test.tsx:1624 test: Scenario: Removing blocks from the middle (remote value drops a middle block) |
| 150 | `packages/editor/tests/event.value-changed.test.tsx` | portable-mixed | PT-H12 | 3 | packages/editor/tests/event.value-changed.test.tsx:6 describe: event.value changed<br>packages/editor/tests/event.value-changed.test.tsx:7 test: does not emit for "undefined" initial value<br>packages/editor/tests/event.value-changed.test.tsx:20 test: emits for "[]" initial value |
| 151 | `packages/editor/tests/focus.test.tsx` | portable | PT-H01 | 3 | packages/editor/tests/focus.test.tsx:8 describe: focus<br>packages/editor/tests/focus.test.tsx:9 test: Scenario: Focusing on an empty editor<br>packages/editor/tests/focus.test.tsx:63 test: Scenario: Focusing on a non-empty editor |
| 152 | `packages/editor/tests/history.preserving-keys.test.tsx` | portable-mixed | PT-H12 | 3 | packages/editor/tests/history.preserving-keys.test.tsx:5 describe: Feature: History (Preserving Keys)<br>packages/editor/tests/history.preserving-keys.test.tsx:36 test: Scenario: Preserving keys when undoing<br>packages/editor/tests/history.preserving-keys.test.tsx:61 test: Scenario: Preserving keys when redoing |
| 153 | `packages/editor/tests/initial-render-registration.test.tsx` | portable-mixed | PT-H12 | 2 | packages/editor/tests/initial-render-registration.test.tsx:9 describe: initial render<br>packages/editor/tests/initial-render-registration.test.tsx:10 test: legacy renderBlock is never called for a type registered as a container via NodePlugin |
| 154 | `packages/editor/tests/inline-object-contenteditable.test.tsx` | portable | PT-H03 | 3 | packages/editor/tests/inline-object-contenteditable.test.tsx:11 describe: inline-object void wrapper contenteditable<br>packages/editor/tests/inline-object-contenteditable.test.tsx:12 test: the consumer wrapper has `contenteditable="false"` when registered via `defineInlineObject`<br>packages/editor/tests/inline-object-contenteditable.test.tsx:60 test: the engine-rendered placeholder wrapper has `contenteditable="false"` inside a container without `defineInlineObject` |
| 155 | `packages/editor/tests/inline-objects.test.tsx` | portable | PT-H03 | 6 | packages/editor/tests/inline-objects.test.tsx:10 describe: Feature: Inline Objects<br>packages/editor/tests/inline-objects.test.tsx:11 test: Scenario: Deleting inline object with Backspace<br>packages/editor/tests/inline-objects.test.tsx:74 test: Scenario: Deleting inline object with Delete<br>packages/editor/tests/inline-objects.test.tsx:137 test: Scenario: Pressing Enter on an inline object<br>packages/editor/tests/inline-objects.test.tsx:204 test: Scenario: `insert.text` on inline object<br>packages/editor/tests/inline-objects.test.tsx:264 test: Scenario: Typing after ArrowRight past inline object inserted by behavior |
| 156 | `packages/editor/tests/inline-pipeline-mode-inheritance.test.tsx` | portable-mixed | PT-H12 | 5 | packages/editor/tests/inline-pipeline-mode-inheritance.test.tsx:48 describe: inline pipeline mode inherits from text block<br>packages/editor/tests/inline-pipeline-mode-inheritance.test.tsx:49 test: registered inline-object inside LEGACY text block keeps data-slate-* attributes on its wrapper<br>packages/editor/tests/inline-pipeline-mode-inheritance.test.tsx:94 test: registered span inside LEGACY text block keeps data-slate-* attributes on its wrapper<br>packages/editor/tests/inline-pipeline-mode-inheritance.test.tsx:132 test: registered inline-object inside REGISTERED text block emits clean data-pt-* on its wrapper<br>packages/editor/tests/inline-pipeline-mode-inheritance.test.tsx:183 test: registered span inside REGISTERED text block emits clean data-pt-* on its wrapper |
| 157 | `packages/editor/tests/insert-block.test.tsx` | portable-mixed | PT-H12 | 4 | packages/editor/tests/insert-block.test.tsx:11 describe: PortableTextEditor.insertBlock.name<br>packages/editor/tests/insert-block.test.tsx:12 test: Scenario: Inserting a custom block without a selection #1<br>packages/editor/tests/insert-block.test.tsx:85 test: Scenario: Inserting a custom block without a selection #2<br>packages/editor/tests/insert-block.test.tsx:160 test: Scenario: Replacing an empty text block with a custom block |
| 158 | `packages/editor/tests/insert-respects-sub-schema.test.tsx` | portable-mixed | PT-H02 | 13 | packages/editor/tests/insert-respects-sub-schema.test.tsx:68 describe: insert respects sub-schema<br>packages/editor/tests/insert-respects-sub-schema.test.tsx:69 test: Scenario: inserting an inline object whose type is allowed in the path sub-schema<br>packages/editor/tests/insert-respects-sub-schema.test.tsx:142 test: Scenario: inserting an inline object whose type is NOT in the path sub-schema is rejected<br>packages/editor/tests/insert-respects-sub-schema.test.tsx:217 test: Scenario: inserting a block object whose type is NOT in the path sub-schema is rejected<br>packages/editor/tests/insert-respects-sub-schema.test.tsx:294 test: Scenario: setting properties on an existing inline object whose type is NOT in the path sub-schema noops without throwing<br>packages/editor/tests/insert-respects-sub-schema.test.tsx:381 test: Scenario: `child.set` on an inline object inside a container filters undeclared fields against the path sub-schema<br>packages/editor/tests/insert-respects-sub-schema.test.tsx:459 test: Scenario: `block.set` on a block object inside a container filters undeclared fields against the path sub-schema<br>packages/editor/tests/insert-respects-sub-schema.test.tsx:510 test: Scenario: `decorator.add` of an allowed decorator inside a container applies the mark<br>packages/editor/tests/insert-respects-sub-schema.test.tsx:575 test: Scenario: `decorator.add` of a disallowed decorator inside a container does not apply the mark<br>packages/editor/tests/insert-respects-sub-schema.test.tsx:655 test: Scenario: `annotation.add` of an allowed annotation inside a container applies the mark and markDef<br>packages/editor/tests/insert-respects-sub-schema.test.tsx:749 test: Scenario: `annotation.add` of a disallowed annotation inside a container does not apply the mark<br>packages/editor/tests/insert-respects-sub-schema.test.tsx:837 test: Scenario: \`decorator.add\` of a decorator not declared at root does not apply the mark<br>packages/editor/tests/insert-respects-sub-schema.test.tsx:887 test: Scenario: \`annotation.add\` of an annotation not declared at root does not apply the mark |
| 159 | `packages/editor/tests/legacy-suppression.test.tsx` | portable-mixed | PT-H12 | 8 | packages/editor/tests/legacy-suppression.test.tsx:28 describe: legacy-suppression contract<br>packages/editor/tests/legacy-suppression.test.tsx:29 test: top-level defineTextBlock with unregistered inline-object child does not call legacy.renderChild<br>packages/editor/tests/legacy-suppression.test.tsx:77 test: top-level defineContainer with unregistered block-object child does not call legacy.renderBlock for that child<br>packages/editor/tests/legacy-suppression.test.tsx:144 test: top-level defineTextBlock with styled span DOES call legacy.renderDecorator<br>packages/editor/tests/legacy-suppression.test.tsx:186 test: top-level defineTextBlock with annotated span DOES call legacy.renderAnnotation<br>packages/editor/tests/legacy-suppression.test.tsx:229 test: top-level defineBlockObject value does not call legacy.renderBlock<br>packages/editor/tests/legacy-suppression.test.tsx:264 test: top-level defineInlineObject value does not call legacy.renderChild<br>packages/editor/tests/legacy-suppression.test.tsx:310 test: mixed pipeline: legacy block beside new-pipeline block - legacy hook fires for the legacy block, not for the registered one |
| 160 | `packages/editor/tests/normalization.test.tsx` | portable-mixed | PT-H12 | 14 | packages/editor/tests/normalization.test.tsx:8 describe: normalization<br>packages/editor/tests/normalization.test.tsx:9 test: Scenario: spans with the same marks are merged<br>packages/editor/tests/normalization.test.tsx:50 test: Scenario: marks equality is order independent<br>packages/editor/tests/normalization.test.tsx:91 test: Scenario: text blocks with no `children` get placeholder children<br>packages/editor/tests/normalization.test.tsx:175 test: Scenario: text blocks with empty `children` get placeholder children<br>packages/editor/tests/normalization.test.tsx:255 test: Scenario: span with no `_key` gets a key<br>packages/editor/tests/normalization.test.tsx:322 test: Scenario: block with no `_key` gets a key via numeric index<br>packages/editor/tests/normalization.test.tsx:403 test: Scenario: block object with no `_key` gets a key via numeric index<br>packages/editor/tests/normalization.test.tsx:474 test: Scenario: spans with missing text get empty text<br>packages/editor/tests/normalization.test.tsx:549 test: Scenario: lonely span with no `text` gets an empty string<br>packages/editor/tests/normalization.test.tsx:617 test: Scenario: selection is preserved when spans merge during normalization<br>packages/editor/tests/normalization.test.tsx:718 test: Scenario: duplicate block `_key` is fixed via numeric index<br>packages/editor/tests/normalization.test.tsx:800 test: Scenario: block with no `_type` gets the default block type<br>packages/editor/tests/normalization.test.tsx:860 test: Scenario: span with `_type` unset gets the span type |
| 161 | `packages/editor/tests/performance.test.tsx` | portable-mixed | PT-H12 | 12 | packages/editor/tests/performance.test.tsx:10 describe: Performance<br>packages/editor/tests/performance.test.tsx:11 describe: Baseline<br>packages/editor/tests/performance.test.tsx:12 test: Inserting 1000 blocks in an empty editor<br>packages/editor/tests/performance.test.tsx:39 test: Inserting 1000 blocks before an existing block<br>packages/editor/tests/performance.test.tsx:72 test: Inserting 1000 blocks after an existing block<br>packages/editor/tests/performance.test.tsx:106 describe: Containers<br>packages/editor/tests/performance.test.tsx:165 test: Inserting 1000 tables in an empty editor<br>packages/editor/tests/performance.test.tsx:195 test: Inserting 1000 tables before an existing block<br>packages/editor/tests/performance.test.tsx:231 test: Inserting 1000 tables after an existing block<br>packages/editor/tests/performance.test.tsx:268 describe: Deep nested containers<br>packages/editor/tests/performance.test.tsx:348 test: Setting progressively deeper nested list values<br>packages/editor/tests/performance.test.tsx:437 test: onChange is batched |
| 162 | `packages/editor/tests/placeholder-block.test.tsx` | portable-mixed | PT-H12 | 16 | packages/editor/tests/placeholder-block.test.tsx:19 describe: createPlaceholderBlock.name<br>packages/editor/tests/placeholder-block.test.tsx:20 test: Scenario: Initial value resembling placeholder block<br>packages/editor/tests/placeholder-block.test.tsx:78 test: Scenario: Initial value resembling placeholder block, but with different style<br>packages/editor/tests/placeholder-block.test.tsx:139 describe: Scenario: Placeholder removed by incoming patch<br>packages/editor/tests/placeholder-block.test.tsx:140 test: no foreign value<br>packages/editor/tests/placeholder-block.test.tsx:187 test: with foreign value<br>packages/editor/tests/placeholder-block.test.tsx:262 test: undoing placeholder insertion is a noop<br>packages/editor/tests/placeholder-block.test.tsx:329 test: Scenario: Lonely block object removed by incoming patch<br>packages/editor/tests/placeholder-block.test.tsx:428 test: Scenario: Lonely block object removed by updated value<br>packages/editor/tests/placeholder-block.test.tsx:518 test: Scenario: Adding and removing text in an empty editor<br>packages/editor/tests/placeholder-block.test.tsx:637 test: Scenario: Setting custom props on placeholder after clearing it<br>packages/editor/tests/placeholder-block.test.tsx:749 test: Scenario: Deleting lonely block object and typing<br>packages/editor/tests/placeholder-block.test.tsx:849 describe: Scenario: Placeholder can be represented by a custom React Node<br>packages/editor/tests/placeholder-block.test.tsx:850 test: no initial value<br>packages/editor/tests/placeholder-block.test.tsx:861 test: initial empty text block<br>packages/editor/tests/placeholder-block.test.tsx:881 test: initial empty heading does not render placeholder |
| 163 | `packages/editor/tests/plugin.document-title.test.tsx` | portable-mixed | PT-H12 | 1 | packages/editor/tests/plugin.document-title.test.tsx:72 test: DocumentTitlePlugin.name |
| 164 | `packages/editor/tests/positional-override-block-level.test.tsx` | portable-mixed | PT-H12 | 18 | packages/editor/tests/positional-override-block-level.test.tsx:90 describe: Block-level positional override: defineContainer<br>packages/editor/tests/positional-override-block-level.test.tsx:91 test: 1. Global container render fires when no positional override exists<br>packages/editor/tests/positional-override-block-level.test.tsx:131 test: 2. Positional `render: fn` in parent container `of` overrides global<br>packages/editor/tests/positional-override-block-level.test.tsx:202 test: 3b. Positional `render: (props) => props.renderDefault(props)` renders engine default at this position<br>packages/editor/tests/positional-override-block-level.test.tsx:273 test: 4. Positional `of: [...]` without `render` falls through to global<br>packages/editor/tests/positional-override-block-level.test.tsx:342 test: 5. Positional `of: [...]` without `render`, no global → engine default<br>packages/editor/tests/positional-override-block-level.test.tsx:404 describe: Block-level positional override: defineTextBlock<br>packages/editor/tests/positional-override-block-level.test.tsx:405 test: 1. Global text-block render fires when no positional override exists<br>packages/editor/tests/positional-override-block-level.test.tsx:441 test: 2. Positional `render: fn` in container `of` overrides global<br>packages/editor/tests/positional-override-block-level.test.tsx:507 test: 3b. Positional `render: (props) => props.renderDefault(props)` renders engine default at this position<br>packages/editor/tests/positional-override-block-level.test.tsx:570 test: 4. Positional `of: [...]` (no render) falls through to global<br>packages/editor/tests/positional-override-block-level.test.tsx:630 test: 5. Positional `of: [...]` no render, no global → engine default<br>packages/editor/tests/positional-override-block-level.test.tsx:683 describe: Block-level positional override: defineBlockObject<br>packages/editor/tests/positional-override-block-level.test.tsx:684 test: 1. Global block-object render fires when no positional override exists<br>packages/editor/tests/positional-override-block-level.test.tsx:711 test: 2. Positional `render: fn` in container `of` overrides global<br>packages/editor/tests/positional-override-block-level.test.tsx:763 test: 3b. Positional `render: (props) => props.renderDefault(props)` renders engine default at this position<br>packages/editor/tests/positional-override-block-level.test.tsx:816 test: 4. Positional `render` absent (no `of` to provide) falls through to global<br>packages/editor/tests/positional-override-block-level.test.tsx:869 test: 5. Positional no render, no global → engine default |
| 165 | `packages/editor/tests/positional-override-cross-scope.test.tsx` | portable-mixed | PT-H12 | 4 | packages/editor/tests/positional-override-cross-scope.test.tsx:38 describe: Cross-scope positional override<br>packages/editor/tests/positional-override-cross-scope.test.tsx:39 test: 11. Two text blocks side-by-side scope independently<br>packages/editor/tests/positional-override-cross-scope.test.tsx:136 test: 12. Top-level defineTextBlock.of applies globally<br>packages/editor/tests/positional-override-cross-scope.test.tsx:202 test: 13. Position-level defineTextBlock.of wins over global defineTextBlock.of at that position |
| 166 | `packages/editor/tests/positional-override-inline-level.test.tsx` | portable-mixed | PT-H12 | 12 | packages/editor/tests/positional-override-inline-level.test.tsx:83 describe: Inline-level positional override: defineInlineObject<br>packages/editor/tests/positional-override-inline-level.test.tsx:84 test: 1. Global render fires when no positional override exists<br>packages/editor/tests/positional-override-inline-level.test.tsx:108 test: 2. Positional render in text-block of overrides global<br>packages/editor/tests/positional-override-inline-level.test.tsx:159 test: 3b. Positional render: (props) => props.renderDefault(props) renders engine default at this position<br>packages/editor/tests/positional-override-inline-level.test.tsx:210 test: 4. Positional (no render) falls through to global<br>packages/editor/tests/positional-override-inline-level.test.tsx:251 test: 5. Positional (no render), no global -> engine default<br>packages/editor/tests/positional-override-inline-level.test.tsx:290 describe: Inline-level positional override: defineSpan<br>packages/editor/tests/positional-override-inline-level.test.tsx:291 test: 1. Global render fires when no positional override exists<br>packages/editor/tests/positional-override-inline-level.test.tsx:318 test: 2. Positional render in text-block of overrides global<br>packages/editor/tests/positional-override-inline-level.test.tsx:369 test: 3b. Positional render: (props) => props.renderDefault(props) renders engine default at this position<br>packages/editor/tests/positional-override-inline-level.test.tsx:423 test: 4. Positional (no render) falls through to global<br>packages/editor/tests/positional-override-inline-level.test.tsx:464 test: 5. Positional (no render), no global -> engine default |
| 167 | `packages/editor/tests/positional-override-isolation.test.tsx` | portable-mixed | PT-H12 | 3 | packages/editor/tests/positional-override-isolation.test.tsx:31 describe: Context isolation between block-level and inline-level dispatch<br>packages/editor/tests/positional-override-isolation.test.tsx:32 test: 18. Inline dispatch reads ParentTextBlockContext (not ParentContainerContext)<br>packages/editor/tests/positional-override-isolation.test.tsx:126 test: 19. Block dispatch does not consume ParentTextBlockContext |
| 168 | `packages/editor/tests/positional-override-negative.test.tsx` | portable-mixed | PT-H12 | 6 | packages/editor/tests/positional-override-negative.test.tsx:26 test: 14. defineContainer.of containing Span is a type error<br>packages/editor/tests/positional-override-negative.test.tsx:37 test: 15. defineContainer.of containing InlineObject is a type error<br>packages/editor/tests/positional-override-negative.test.tsx:48 test: 16. defineTextBlock.of containing Container is a type error<br>packages/editor/tests/positional-override-negative.test.tsx:58 test: 17. defineTextBlock.of containing BlockObject is a type error<br>packages/editor/tests/positional-override-negative.test.tsx:70 test: Container.of resolves to a block-only array type<br>packages/editor/tests/positional-override-negative.test.tsx:82 test: TextBlock.of resolves to an inline-only array type |
| 169 | `packages/editor/tests/pteWarningsSelfSolving.test.tsx` | portable-mixed | PT-H12 | 8 | packages/editor/tests/pteWarningsSelfSolving.test.tsx:9 describe: when PTE would display warnings, instead it self solves<br>packages/editor/tests/pteWarningsSelfSolving.test.tsx:10 it: when child at index is missing required _key in block with _key<br>packages/editor/tests/pteWarningsSelfSolving.test.tsx:71 it: self-solves missing .markDefs<br>packages/editor/tests/pteWarningsSelfSolving.test.tsx:131 it: adds missing .children<br>packages/editor/tests/pteWarningsSelfSolving.test.tsx:205 it: removes orphaned marks<br>packages/editor/tests/pteWarningsSelfSolving.test.tsx:266 it: removes orphaned marksDefs<br>packages/editor/tests/pteWarningsSelfSolving.test.tsx:333 it: allows undefined value<br>packages/editor/tests/pteWarningsSelfSolving.test.tsx:366 it: allows empty array of blocks |
| 170 | `packages/editor/tests/range-decorations.test.tsx` | portable | PT-H01 | 8 | packages/editor/tests/range-decorations.test.tsx:81 describe: RangeDecorations<br>packages/editor/tests/range-decorations.test.tsx:82 test: Scenario: Drawing a Range Decoration<br>packages/editor/tests/range-decorations.test.tsx:146 test: Scenario: Moving a Range Decoration<br>packages/editor/tests/range-decorations.test.tsx:238 test: Scenario: Drawing a collapsed Range Decoration<br>packages/editor/tests/range-decorations.test.tsx:296 it: only render range decorations as necessary<br>packages/editor/tests/range-decorations.test.tsx:500 test: Scenario: Range Decorations don't affect the caret position<br>packages/editor/tests/range-decorations.test.tsx:616 describe: RangeDecorations inside editable containers<br>packages/editor/tests/range-decorations.test.tsx:617 test: Scenario: Drawing a collapsed Range Decoration inside a callout |
| 171 | `packages/editor/tests/range-selectors-container.test.tsx` | portable-mixed | PT-H02 | 3 | packages/editor/tests/range-selectors-container.test.tsx:33 describe: range selectors (container awareness)<br>packages/editor/tests/range-selectors-container.test.tsx:34 test: range selectors resolve at correct depth when selection is inside a container<br>packages/editor/tests/range-selectors-container.test.tsx:147 test: getSelectedValue preserves the container when the selection is wholly inside it |
| 172 | `packages/editor/tests/recursive-schema.test.tsx` | portable-mixed | PT-H02 | 9 | packages/editor/tests/recursive-schema.test.tsx:173 describe: recursive schemas (lists in list-items in lists)<br>packages/editor/tests/recursive-schema.test.tsx:174 test: Scenario: renders all three nesting levels as containers<br>packages/editor/tests/recursive-schema.test.tsx:191 test: Scenario: incoming `set` patch on a deep span text applies correctly<br>packages/editor/tests/recursive-schema.test.tsx:256 test: Scenario: typing at a deep span emits patches that round-trip through applyAll<br>packages/editor/tests/recursive-schema.test.tsx:335 test: Scenario: Enter on empty trailing line in deepest list with empty previous sibling escapes one level out<br>packages/editor/tests/recursive-schema.test.tsx:519 test: Scenario: typing at a deep position appends to the deep span<br>packages/editor/tests/recursive-schema.test.tsx:580 test: Scenario: decorator toggle on a deep span emits a strong mark<br>packages/editor/tests/recursive-schema.test.tsx:641 test: Scenario: pressing Enter from the deepest list-item escapes one level per pair of presses, all the way to root<br>packages/editor/tests/recursive-schema.test.tsx:847 test: Scenario: pressing Enter from the middle list-item splits in place — escape only fires from the trailing block of a list-item |
| 173 | `packages/editor/tests/register-node-clean-dom.test.tsx` | portable-mixed | PT-H12 | 6 | packages/editor/tests/register-node-clean-dom.test.tsx:33 describe: register-node-clean-dom<br>packages/editor/tests/register-node-clean-dom.test.tsx:34 test: container subtree emits zero data-slate-* attrs<br>packages/editor/tests/register-node-clean-dom.test.tsx:81 test: text-block subtree emits zero data-slate-* attrs<br>packages/editor/tests/register-node-clean-dom.test.tsx:114 test: block-object subtree emits zero data-slate-* attrs<br>packages/editor/tests/register-node-clean-dom.test.tsx:142 test: inline-object subtree emits zero data-slate-* attrs<br>packages/editor/tests/register-node-clean-dom.test.tsx:186 test: span subtree emits zero data-slate-* attrs |
| 174 | `packages/editor/tests/render-block.test.tsx` | portable-mixed | PT-H12 | 6 | packages/editor/tests/render-block.test.tsx:19 describe: renderBlock<br>packages/editor/tests/render-block.test.tsx:20 test: Receives the updated value for text block changes<br>packages/editor/tests/render-block.test.tsx:157 test: Re-renders when a nested custom prop is patched<br>packages/editor/tests/render-block.test.tsx:265 test: Re-renders when a nested custom prop is unset<br>packages/editor/tests/render-block.test.tsx:336 test: Scenario: Stable across re-renders<br>packages/editor/tests/render-block.test.tsx:413 test: Keyless block receives a valid `_key` from normalization before render |
| 175 | `packages/editor/tests/render-child.test.tsx` | portable-mixed | PT-H12 | 5 | packages/editor/tests/render-child.test.tsx:10 describe: renderChild<br>packages/editor/tests/render-child.test.tsx:11 test: span focused and selected props<br>packages/editor/tests/render-child.test.tsx:122 test: inline object focused and selected props<br>packages/editor/tests/render-child.test.tsx:201 test: children with same keys across blocks<br>packages/editor/tests/render-child.test.tsx:335 test: container child paths |
| 176 | `packages/editor/tests/render-count-regression.test.tsx` | portable-mixed | PT-H12 | 4 | packages/editor/tests/render-count-regression.test.tsx:22 describe: Render count regression<br>packages/editor/tests/render-count-regression.test.tsx:94 test: Typing into one sibling re-renders constant work, not O(N) siblings<br>packages/editor/tests/render-count-regression.test.tsx:186 test: Mass unmount: deleting 100 blocks in one event does not crash<br>packages/editor/tests/render-count-regression.test.tsx:301 test: test |
| 177 | `packages/editor/tests/render-default-prop.test.tsx` | portable-mixed | PT-H12 | 17 | packages/editor/tests/render-default-prop.test.tsx:54 describe: renderDefault prop<br>packages/editor/tests/render-default-prop.test.tsx:55 test: Container: render receives renderDefault prop<br>packages/editor/tests/render-default-prop.test.tsx:97 test: TextBlock: render receives renderDefault prop<br>packages/editor/tests/render-default-prop.test.tsx:130 test: BlockObject: render receives renderDefault prop<br>packages/editor/tests/render-default-prop.test.tsx:155 test: InlineObject: render receives renderDefault prop<br>packages/editor/tests/render-default-prop.test.tsx:195 test: Span: render receives renderDefault prop<br>packages/editor/tests/render-default-prop.test.tsx:228 describe: renderDefault wraps default<br>packages/editor/tests/render-default-prop.test.tsx:229 test: Container: caller can wrap renderDefault output<br>packages/editor/tests/render-default-prop.test.tsx:268 test: Container: caller can modify props before delegating<br>packages/editor/tests/render-default-prop.test.tsx:309 describe: renderDefault for void objects renders [_type: _key] placeholder<br>packages/editor/tests/render-default-prop.test.tsx:310 test: BlockObject: omit render → renders [type: key] placeholder<br>packages/editor/tests/render-default-prop.test.tsx:327 test: BlockObject: render: (p) => p.renderDefault(p) → same placeholder<br>packages/editor/tests/render-default-prop.test.tsx:347 test: BlockObject: placeholder has userSelect: none, contentEditable=false, and draggable matching readOnly<br>packages/editor/tests/render-default-prop.test.tsx:373 test: InlineObject: omit render → renders [type: key] placeholder<br>packages/editor/tests/render-default-prop.test.tsx:402 test: InlineObject: render: (p) => p.renderDefault(p) → same placeholder<br>packages/editor/tests/render-default-prop.test.tsx:434 test: InlineObject: placeholder asymmetric contract - outer auto-has contentEditable=false, inner has draggable but no contentEditable<br>packages/editor/tests/render-default-prop.test.tsx:474 test: BlockObject: consumer can hide placeholder by ignoring renderDefault |
| 178 | `packages/editor/tests/schema-no-intermediate-row.test.tsx` | portable-mixed | PT-H02 | 4 | packages/editor/tests/schema-no-intermediate-row.test.tsx:26 describe: normalisation walks registered container chains to completion<br>packages/editor/tests/schema-no-intermediate-row.test.tsx:27 test: table > cell (no row in schema): empty cell.content gets a placeholder text block<br>packages/editor/tests/schema-no-intermediate-row.test.tsx:121 test: table > row > cell (schema has row): empty cell.content gets a placeholder text block<br>packages/editor/tests/schema-no-intermediate-row.test.tsx:239 test: schema has row, value skips it: cell directly under table.rows is not a registered container at this position |
| 179 | `packages/editor/tests/selection-after-remote-patches.test.tsx` | portable | PT-H08 | 9 | packages/editor/tests/selection-after-remote-patches.test.tsx:11 describe: Feature: Selection adjustment after remote patches<br>packages/editor/tests/selection-after-remote-patches.test.tsx:12 test: Scenario: Remote insert block before cursor<br>packages/editor/tests/selection-after-remote-patches.test.tsx:107 test: Scenario: Remote insert block after cursor<br>packages/editor/tests/selection-after-remote-patches.test.tsx:202 test: Scenario: Remote text edit in another block<br>packages/editor/tests/selection-after-remote-patches.test.tsx:252 test: Scenario: Remote delete of block before cursor<br>packages/editor/tests/selection-after-remote-patches.test.tsx:323 test: Scenario: Remote insert text in same block before cursor<br>packages/editor/tests/selection-after-remote-patches.test.tsx:374 test: Scenario: Remote insert span before cursor in same block<br>packages/editor/tests/selection-after-remote-patches.test.tsx:434 test: Scenario: Remote split of block where cursor is<br>packages/editor/tests/selection-after-remote-patches.test.tsx:508 test: Scenario: Remote unset of span before cursor |
| 180 | `packages/editor/tests/selection-emit-dedup.test.tsx` | portable | PT-H08 | 3 | packages/editor/tests/selection-emit-dedup.test.tsx:7 describe: selection emission dedup<br>packages/editor/tests/selection-emit-dedup.test.tsx:8 test: a remote patch that re-spreads the selection range does not emit a duplicate selection<br>packages/editor/tests/selection-emit-dedup.test.tsx:78 test: a genuine selection move still emits a selection |
| 181 | `packages/editor/tests/selection-emit-stability.test.tsx` | portable | PT-H08 | 4 | packages/editor/tests/selection-emit-stability.test.tsx:8 describe: selection emit stability<br>packages/editor/tests/selection-emit-stability.test.tsx:9 test: decorator.add on collapsed caret emits a single selection event<br>packages/editor/tests/selection-emit-stability.test.tsx:61 test: decorator.add on whole-span selection emits a single selection event<br>packages/editor/tests/selection-emit-stability.test.tsx:115 test: remote patches that do not move the caret emit no selection event |
| 182 | `packages/editor/tests/self-solving.test.tsx` | portable-mixed | PT-H12 | 8 | packages/editor/tests/self-solving.test.tsx:20 describe: Feature: Self-solving<br>packages/editor/tests/self-solving.test.tsx:21 test: Scenario: Missing .markDefs and .marks are added after the editor is made dirty<br>packages/editor/tests/self-solving.test.tsx:157 test: Scenario: Missing .style is added after the editor is made dirty<br>packages/editor/tests/self-solving.test.tsx:241 test: Scenario: Missing .style is added to inserted block<br>packages/editor/tests/self-solving.test.tsx:382 test: Scenario: Child keys on initial blocks are made unique<br>packages/editor/tests/self-solving.test.tsx:482 test: Scenario: Inserted child keys are made unique<br>packages/editor/tests/self-solving.test.tsx:588 test: Scenario: Initial block _keys are made unique<br>packages/editor/tests/self-solving.test.tsx:711 test: Scenario: Inserted block _keys are made unique |
| 183 | `packages/editor/tests/serialize-deserialize.test.tsx` | portable-mixed | PT-H12 | 5 | packages/editor/tests/serialize-deserialize.test.tsx:13 describe: Serialize/Deserialize<br>packages/editor/tests/serialize-deserialize.test.tsx:14 test: Scenario: Custom text/html deserializer<br>packages/editor/tests/serialize-deserialize.test.tsx:179 test: Scenario: Fallback on failing deserialization<br>packages/editor/tests/serialize-deserialize.test.tsx:330 test: Scenario: Executing deserialize<br>packages/editor/tests/serialize-deserialize.test.tsx:388 test: Scenario: Forwarding deserialize |
| 184 | `packages/editor/tests/setup.test.tsx` | portable-mixed | PT-H12 | 2 | packages/editor/tests/setup.test.tsx:14 describe: Setup<br>packages/editor/tests/setup.test.tsx:15 test: Scenario: Unknown block object |
| 185 | `packages/editor/tests/tables.test.tsx` | portable-mixed | PT-H12 | 18 | packages/editor/tests/tables.test.tsx:143 describe: tables<br>packages/editor/tests/tables.test.tsx:144 test: render<br>packages/editor/tests/tables.test.tsx:152 describe: incoming patches<br>packages/editor/tests/tables.test.tsx:153 test: set headerRows<br>packages/editor/tests/tables.test.tsx:172 test: set rows<br>packages/editor/tests/tables.test.tsx:215 test: set cells<br>packages/editor/tests/tables.test.tsx:257 test: set marks<br>packages/editor/tests/tables.test.tsx:313 test: unset rows<br>packages/editor/tests/tables.test.tsx:329 test: unset cells<br>packages/editor/tests/tables.test.tsx:347 test: unset content<br>packages/editor/tests/tables.test.tsx:372 test: unset children<br>packages/editor/tests/tables.test.tsx:408 describe: normalization<br>packages/editor/tests/tables.test.tsx:409 test: text blocks inside containers get missing .markDefs<br>packages/editor/tests/tables.test.tsx:479 test: text blocks inside containers get missing .style<br>packages/editor/tests/tables.test.tsx:547 test: spans inside containers get missing .marks<br>packages/editor/tests/tables.test.tsx:618 test: duplicate keys inside containers are fixed<br>packages/editor/tests/tables.test.tsx:716 test: empty text blocks inside containers get a span inserted<br>packages/editor/tests/tables.test.tsx:780 test: text blocks with missing children inside containers get restored |
| 186 | `packages/editor/tests/test-editor.test.tsx` | portable-mixed | PT-H12 | 1 | packages/editor/tests/test-editor.test.tsx:21 test: returns a locator scoped to the rendered editor |
| 187 | `packages/editor/tests/text-edge-selectors-container.test.tsx` | portable-mixed | PT-H02 | 4 | packages/editor/tests/text-edge-selectors-container.test.tsx:32 describe: text-edge selectors (container awareness)<br>packages/editor/tests/text-edge-selectors-container.test.tsx:33 test: getBlockTextBefore and getBlockTextAfter read text in the container line<br>packages/editor/tests/text-edge-selectors-container.test.tsx:85 test: getSelectionText returns text of a selection spanning container lines<br>packages/editor/tests/text-edge-selectors-container.test.tsx:157 test: getCaretWordSelection finds the word under the caret inside a container |
| 188 | `packages/editor/tests/to-engine-range.test.tsx` | portable | PT-H01 | 5 | packages/editor/tests/to-engine-range.test.tsx:8 describe: toEngineRange<br>packages/editor/tests/to-engine-range.test.tsx:9 test: Scenario: Collapsed selection inside a span<br>packages/editor/tests/to-engine-range.test.tsx:43 test: Scenario: Expanded selection across two spans in one block<br>packages/editor/tests/to-engine-range.test.tsx:81 test: Scenario: Expanded selection across two text blocks<br>packages/editor/tests/to-engine-range.test.tsx:122 test: Scenario: Selection from text into a void block keeps the void in range |
| 189 | `packages/editor/tests/undo-merge-blocks.test.tsx` | portable-mixed | PT-H12 | 2 | packages/editor/tests/undo-merge-blocks.test.tsx:10 describe: merge blocks + undo emits well-formed patches<br>packages/editor/tests/undo-merge-blocks.test.tsx:11 test: Backspace merge at root + undo does not emit malformed patches |
| 190 | `packages/editor/tests/undo-redo-collaboration.test.tsx` | portable | PT-H08 | 6 | packages/editor/tests/undo-redo-collaboration.test.tsx:31 describe: Undo/Redo Collaboration (hand-coded)<br>packages/editor/tests/undo-redo-collaboration.test.tsx:32 test: will let editor A undo their change after B did an unrelated change (multi-line block)<br>packages/editor/tests/undo-redo-collaboration.test.tsx:217 test: undoing out-of-order<br>packages/editor/tests/undo-redo-collaboration.test.tsx:314 test: editor A undo their change after B did an unrelated change (single-line, emoji)<br>packages/editor/tests/undo-redo-collaboration.test.tsx:376 test: editor A undo their change after B did an unrelated change (multi-line block, emoji)<br>packages/editor/tests/undo-redo-collaboration.test.tsx:459 test: editor A undo their change after B did an unrelated change (multi-line block, kanji) |
| 191 | `packages/editor/tests/unique-sibling-keys.test.tsx` | portable-mixed | PT-H12 | 7 | packages/editor/tests/unique-sibling-keys.test.tsx:14 describe: unique sibling `_key`s<br>packages/editor/tests/unique-sibling-keys.test.tsx:15 test: splitting span with a decorator<br>packages/editor/tests/unique-sibling-keys.test.tsx:63 test: splitting span with an annotation<br>packages/editor/tests/unique-sibling-keys.test.tsx:111 test: splitting a block with Enter<br>packages/editor/tests/unique-sibling-keys.test.tsx:174 test: merging blocks with Backspace<br>packages/editor/tests/unique-sibling-keys.test.tsx:239 test: splitting and merging annotated block<br>packages/editor/tests/unique-sibling-keys.test.tsx:333 test: moving a block |
| 192 | `packages/editor/tests/upload-images-on-paste.test.tsx` | portable-mixed | PT-H06 | 3 | packages/editor/tests/upload-images-on-paste.test.tsx:35 test: Scenario: Pasting image files<br>packages/editor/tests/upload-images-on-paste.test.tsx:177 test: Scenario: Uploading images embedded in HTML<br>packages/editor/tests/upload-images-on-paste.test.tsx:310 test: Scenario: Pasting image files that exist both in HTML and as a file |
| 193 | `packages/editor/tests/validation.test.tsx` | portable-mixed | PT-H12 | 5 | packages/editor/tests/validation.test.tsx:9 describe: Value validation<br>packages/editor/tests/validation.test.tsx:10 test: Initial value with `null` child results in a validation error<br>packages/editor/tests/validation.test.tsx:41 test: Scenario: Initial value with `null` child in second block results in a validation error<br>packages/editor/tests/validation.test.tsx:79 test: Scenario: Setting child to `null` results in a validation error<br>packages/editor/tests/validation.test.tsx:153 test: Scenario: New block with `null` child results in a validation error |
| 194 | `packages/editor/tests/valueNormalization.test.tsx` | portable-mixed | PT-H12 | 2 | packages/editor/tests/valueNormalization.test.tsx:9 describe: values: normalization<br>packages/editor/tests/valueNormalization.test.tsx:10 it: accepts incoming value with blocks without a style or markDefs prop, but doesn't leave them without them when editing them |
| 195 | `packages/editor/tests/withEditableAPIDelete.test.tsx` | portable | PT-H05 | 5 | packages/editor/tests/withEditableAPIDelete.test.tsx:44 describe: plugin:withEditableAPI: .delete()<br>packages/editor/tests/withEditableAPIDelete.test.tsx:45 it: deletes block<br>packages/editor/tests/withEditableAPIDelete.test.tsx:101 it: deletes all the blocks, but leaves a placeholder block<br>packages/editor/tests/withEditableAPIDelete.test.tsx:158 it: deletes children<br>packages/editor/tests/withEditableAPIDelete.test.tsx:237 it: deletes selected |
| 196 | `packages/editor/tests/withEditableAPIGetFragment.test.tsx` | portable-mixed | PT-H12 | 3 | packages/editor/tests/withEditableAPIGetFragment.test.tsx:50 describe: plugin:withEditableAPI: .getFragment()<br>packages/editor/tests/withEditableAPIGetFragment.test.tsx:51 it: can get a Portable Text fragment of the current selection in a single block<br>packages/editor/tests/withEditableAPIGetFragment.test.tsx:104 it: can get a Portable Text fragment of the current selection in multiple blocks |
| 197 | `packages/editor/tests/withEditableAPIInsert.test.tsx` | portable | PT-H04 | 9 | packages/editor/tests/withEditableAPIInsert.test.tsx:57 describe: plugin:withEditableAPI: .insertChild()<br>packages/editor/tests/withEditableAPIInsert.test.tsx:58 it: inserts child nodes correctly<br>packages/editor/tests/withEditableAPIInsert.test.tsx:189 describe: plugin:withEditableAPI: .insertBlock()<br>packages/editor/tests/withEditableAPIInsert.test.tsx:190 it: should not add empty blank blocks: empty block<br>packages/editor/tests/withEditableAPIInsert.test.tsx:264 it: should not add empty blank blocks: non-empty block<br>packages/editor/tests/withEditableAPIInsert.test.tsx:326 it: should be inserted before if focus is on start of block<br>packages/editor/tests/withEditableAPIInsert.test.tsx:391 it: should not add empty blank blocks: non text block<br>packages/editor/tests/withEditableAPIInsert.test.tsx:458 it: should not add empty blank blocks: in between blocks<br>packages/editor/tests/withEditableAPIInsert.test.tsx:523 it: should not add empty blank blocks: in new empty text block |
| 198 | `packages/editor/tests/withEditableAPISelectionsOverlapping.test.tsx` | portable | PT-H01 | 5 | packages/editor/tests/withEditableAPISelectionsOverlapping.test.tsx:26 describe: plugin:withEditableAPI: .isSelectionsOverlapping<br>packages/editor/tests/withEditableAPISelectionsOverlapping.test.tsx:27 it: returns true if the selections are partially overlapping<br>packages/editor/tests/withEditableAPISelectionsOverlapping.test.tsx:64 it: returns true if the selections are fully overlapping<br>packages/editor/tests/withEditableAPISelectionsOverlapping.test.tsx:101 it: return true if selection is fully inside another selection<br>packages/editor/tests/withEditableAPISelectionsOverlapping.test.tsx:138 it: returns false if the selections are not overlapping |
| 199 | `packages/editor/tests/withPortableTextMarkModel.test.tsx` | portable-mixed | PT-H12 | 11 | packages/editor/tests/withPortableTextMarkModel.test.tsx:15 describe: plugin:withPortableTextMarksModel<br>packages/editor/tests/withPortableTextMarkModel.test.tsx:16 describe: normalization<br>packages/editor/tests/withPortableTextMarkModel.test.tsx:17 it: toggles marks on children with annotation marks correctly<br>packages/editor/tests/withPortableTextMarkModel.test.tsx:115 it: merges blocks correctly when containing links<br>packages/editor/tests/withPortableTextMarkModel.test.tsx:246 it: resets markDefs when splitting a block in the beginning<br>packages/editor/tests/withPortableTextMarkModel.test.tsx:374 describe: selection<br>packages/editor/tests/withPortableTextMarkModel.test.tsx:375 it: should emit a new selection object when toggling marks, even though the value is the same<br>packages/editor/tests/withPortableTextMarkModel.test.tsx:441 it: should return active marks that cover the whole selection<br>packages/editor/tests/withPortableTextMarkModel.test.tsx:491 it: should return active annotation types that cover the whole selection<br>packages/editor/tests/withPortableTextMarkModel.test.tsx:548 describe: removing nodes<br>packages/editor/tests/withPortableTextMarkModel.test.tsx:549 it: should not insert a new block if we have more blocks available |
| 200 | `packages/editor/tests/withPortableTextSelections.test.tsx` | portable | PT-H01 | 2 | packages/editor/tests/withPortableTextSelections.test.tsx:39 describe: plugin:withPortableTextSelections<br>packages/editor/tests/withPortableTextSelections.test.tsx:40 it: will report that a selection is made backward |

---

--- METRICS ---
- Files Extracted: 96
- Estimated Token Budget: ~180526 tokens
- Canonical Reference: https://codewiki.google/github.com/udecode/plate
