<!-- GENERATED by scripts/build-llms.mjs from scripts/fixtures/component-inventory.json — do not edit this file. -->

# Migrating to `lr-*`

Migration decisions come from the pinned, schema-validated component inventory. A matching name
does not by itself prove API compatibility. The codemod changes only `exact` and `rewritten`
mappings; `warning-required`, `conceptual-only`, `unsupported`, and unknown tags stay unchanged
and receive location-aware warnings.

The version-matched CLI ships with the package and runs without a repository checkout.
Replace `<version>` with the installed Lyra major/minor/patch you are targeting:

```bash
npx --package @aceshooting/lyra-ui@<version> lyra-ui-migrate --check --report=lyra-migration.json src
```

`--check` never writes source files and exits nonzero while rewrites or warnings remain, which
makes it suitable for CI after an applied migration.

The supported upstream identities are `@awesome.me/webawesome` and `@awesome.me/webawesome-pro`
for Web Awesome, plus `@shoelace-style/shoelace`. The tool scans HTML, standalone CSS,
JavaScript, TypeScript, JSX, Vue, Svelte, MDX, and Markdown. It rewrites inventory-declared
tags, members, defaults, and supported side-effect registration imports.
Imports with bindings remain manual because exported names cannot be inferred safely. An
aliased component value that uses a rewritten member blocks that mapping across the scanned
target set, preventing a registration import from changing while an old member remains. A root
Web Awesome or Shoelace registration import changes only when that package identity and tier
prove the registration closure and no manual component use exists anywhere in the scanned target
set. Root-included targets use `@aceshooting/lyra-ui/all.js`; root-excluded targets receive granular registration imports.
An automatic-looking tag with no matching side-effect registration in the scanned target set
stays unchanged with `REGISTRATION_CLOSURE_REQUIRED`; include the registration-owning entry file
in the scan instead of accepting an inert `lr-*` result.
Targets with optional runtime peers also emit an `OPTIONAL_PEER_REQUIRED` report entry naming
each package that must be installed.
Migrated Web Awesome and Shoelace icon tags emit `BEHAVIOR_REVIEW_REQUIRED` because Lyra's
dependency-free default library contains only `add`, `check`, `close`, `search`, `menu`,
`chevron-left`, `chevron-right`, `chevron-down`, `calendar`, `command`, and `trash`.
Replace other names explicitly or provide their vocabulary with
`registerIconLibrary('default', { resolver })`.
Re-running the tool is idempotent; comments, prose, partial strings, and unrelated packages are
left alone.

The JSON migration report records every rewrite and warning with its file, line, column,
origin, tag/member, action, target, and warning code. Run without `--check` only after inspecting
that report and the target component reference in `llms/components/<tag>.md`.

`dir` and `lang` are platform-global HTML passthrough attributes, not component-member drift.
Web Awesome's `did-ssr` is its runtime hydration marker, not an authored member to recreate or
rename on a Lyra component. The inventory records these exclusions explicitly.

## Migrating Lyra 7 defaults

The local defaults profile is opt-in and separate from Web Awesome/Shoelace migration. It never
renames an `lr-*` tag or import; it only inserts an absent attribute that preserves a changed
Lyra 7 default. Boolean `true` is emitted as canonical attribute presence, including the positive
inverse `without-arrow` spelling.

```bash
npx --package @aceshooting/lyra-ui@<version> lyra-ui-migrate --origin=lyra-v7 --check --report=lyra-v7-migration.json src
```

Opaque framework spreads and DOM aliases block that component profile across the scanned target
set with a warning. Expand or classify them before applying, then rerun to verify byte idempotence.

| Origin | Component | Inserted only when absent |
|---|---|---|
| `lyra-v7` | `<lr-popover>` | `placement="bottom-start"`, `distance="4"`, presence `without-arrow` |
| `lyra-v7` | `<lr-popup>` | `strategy="fixed"`, `placement="bottom-start"`, `distance="4"`, presence `flip`, presence `shift` |
| `lyra-v7` | `<lr-tooltip>` | `distance="6"`, presence `without-arrow` |

## Classification summary

| Ecosystem | Exact | Rewritten | Warning required | Conceptual only | Unsupported | Automatic | Manual |
|---|---:|---:|---:|---:|---:|---:|---:|
| Web Awesome | 34 | 38 | 15 | 0 | 0 | 72 | 15 |
| Shoelace | 18 | 28 | 12 | 0 | 0 | 46 | 12 |
| **Total** | **52** | **66** | **27** | **0** | **0** | **118** | **27** |

## Web Awesome (87)

The pinned Web Awesome manifest is authoritative for this inventory; only rows marked automatic are codemod inputs.

| From | Lyra target or candidate | Classification | Disposition |
|---|---|---|---|
| `<wa-accordion>` | `<lr-accordion>` | `warning-required` | Manual: Lyra snapshots each expand/collapse event detail into a frozen readonly value at dispatch time rather than exposing a live mutable item reference; migrated handlers that mutate the event detail in place must be reviewed. |
| `<wa-accordion-item>` | `<lr-accordion-item>` | `exact` | Automatic: tag and supported side-effect registration import. Native disclosure and coordinated accordion panels. |
| `<wa-animated-image>` | `<lr-animated-image>` | `rewritten` | Automatic: tag/import plus events: wa-error → lr-error; events: wa-load → lr-load. |
| `<wa-animation>` | `<lr-animation>` | `rewritten` | Automatic: tag/import plus events: wa-cancel → lr-cancel; events: wa-finish → lr-finish; events: wa-start → lr-start. |
| `<wa-avatar>` | `<lr-avatar>` | `rewritten` | Automatic: tag/import plus events: wa-error → lr-error. |
| `<wa-badge>` | `<lr-badge>` | `rewritten` | Automatic: tag/import plus insert appearance=accent; insert variant=brand. |
| `<wa-bar-chart>` | `<lr-bar-chart>` | `exact` | Automatic: tag and supported side-effect registration import. Typed `<lr-chart>` subclasses with tag-specific defaults and the full writable `LyraChartType` vocabulary — same optional peer deps as `<lr-chart>`. |
| `<wa-breadcrumb>` | `<lr-breadcrumb>` | `warning-required` | Manual: lr-breadcrumb's `label` accepts an accessible-name override; it is now optional with no declared default (was `string = ''`) so an explicit empty string can suppress the localized fallback without a never-set value doing the same. The rename carries no attribute/property name change, only this default-value divergence. |
| `<wa-breadcrumb-item>` | `<lr-breadcrumb-item>` | `exact` | Automatic: tag and supported side-effect registration import. Responsive navigation trail. |
| `<wa-bubble-chart>` | `<lr-bubble-chart>` | `exact` | Automatic: tag and supported side-effect registration import. Typed `<lr-chart>` subclasses with tag-specific defaults and the full writable `LyraChartType` vocabulary — same optional peer deps as `<lr-chart>`. |
| `<wa-button>` | `<lr-button>` | `rewritten` | Automatic: tag/import plus events: wa-invalid → lr-invalid. Equivalent surface representation: name defaults null ≡ ; no source rewrite. |
| `<wa-button-group>` | `<lr-button-group>` | `exact` | Automatic: tag and supported side-effect registration import. Responsive semantic grouping for related action controls. |
| `<wa-callout>` | `<lr-callout>` | `exact` | Automatic: tag and supported side-effect registration import. Dismissible inline status, warning, and error message surface. |
| `<wa-card>` | `<lr-card>` | `exact` | Automatic: tag and supported side-effect registration import. Generic bordered content container (`header`/`media`/`footer`/`actions` slots) — a direct `<lr-*>` counterpart to `wa-card`. |
| `<wa-carousel>` | `<lr-carousel>` | `warning-required` | Manual: Lyra accepts arbitrary HTMLElement slides, so its slide-change detail is wider than the upstream carousel-item class; in v9 the slides member is a read-only live composition count rather than a writable reflected attribute. Migrated handlers that rely on item-specific members or write slides require review. |
| `<wa-carousel-item>` | `<lr-carousel-item>` | `exact` | Automatic: tag and supported side-effect registration import. Optional semantic slide wrapper for carousel content. |
| `<wa-chart>` | `<lr-chart>` | `exact` | Automatic: tag and supported side-effect registration import. Core Chart.js wrapper (`LyraChartSeries`-based, plus raw `config` passthrough) with bounded `appendData()` streaming and `exportData('csv'. |
| `<wa-checkbox>` | `<lr-checkbox>` | `rewritten` | Automatic: tag/import plus events: wa-invalid → lr-invalid. Equivalent surface representation: name defaults null ≡ ; no source rewrite. |
| `<wa-checkbox-group>` | `<lr-checkbox-group>` | `exact` | Automatic: tag and supported side-effect registration import. Form-associated group of checkboxes with array values and group validation. |
| `<wa-color-picker>` | `<lr-color-picker>` | `rewritten` | Automatic: tag/import plus events: wa-after-hide → lr-after-hide; events: wa-after-show → lr-after-show; events: wa-hide → lr-hide; events: wa-invalid → lr-invalid; events: wa-show → lr-show. Equivalent surface representation: name defaults null ≡ ; no source rewrite. |
| `<wa-combobox>` | `<lr-combobox>` | `warning-required` | Manual: Lyra snapshots each input/change event's value into a frozen readonly value at dispatch time, and since 16.0.0 narrows it through the picker value generic, so the detail reads as string when multiple is false rather than the upstream union; migrated handlers that mutate the event detail in place, or that rely on the union being present on a single-select combobox, must be reviewed. |
| `<wa-comparison>` | `<lr-image-comparer>` | `exact` | Automatic: tag and supported side-effect registration import. Before/after slotted surfaces with a keyboard-accessible range divider. |
| `<wa-copy-button>` | `<lr-copy-button>` | `rewritten` | Automatic: tag/import plus events: wa-copy → lr-copy; events: wa-error → lr-error. |
| `<wa-data-grid>` | `<lr-data-grid>` | `warning-required` | Manual: Lyra snapshots collection inputs and event details synchronously into frozen readonly values, and removes the redundant wa-data-request alias in favor of the typed request event. Migrated code that mutates arrays or event details in place, assigns derived collections, or listens for the removed alias must be reviewed. |
| `<wa-date-input>` | `<lr-date-input>` | `rewritten` | Automatic: tag/import plus events: wa-after-hide → lr-after-hide; events: wa-after-show → lr-after-show; events: wa-clear → lr-clear; events: wa-hide → lr-hide; events: wa-invalid → lr-invalid; events: wa-show → lr-show. |
| `<wa-date-picker>` | `<lr-date-picker>` | `rewritten` | Automatic: tag/import plus events: wa-focus-day → lr-focus-day; events: wa-view-change → lr-view-change. |
| `<wa-details>` | `<lr-details>` | `rewritten` | Automatic: tag/import plus events: wa-after-hide → lr-after-hide; events: wa-after-show → lr-after-show; events: wa-hide → lr-hide; events: wa-show → lr-show. |
| `<wa-dialog>` | `<lr-dialog>` | `rewritten` | Automatic: tag/import plus events: wa-after-hide → lr-after-hide; events: wa-after-show → lr-after-show; events: wa-hide → lr-hide; events: wa-show → lr-show. |
| `<wa-divider>` | `<lr-divider>` | `exact` | Automatic: tag and supported side-effect registration import. Horizontal or vertical semantic separator. |
| `<wa-doughnut-chart>` | `<lr-doughnut-chart>` | `exact` | Automatic: tag and supported side-effect registration import. Typed `<lr-chart>` subclasses with tag-specific defaults and the full writable `LyraChartType` vocabulary — same optional peer deps as `<lr-chart>`. |
| `<wa-drawer>` | `<lr-drawer>` | `rewritten` | Automatic: tag/import plus events: wa-after-hide → lr-after-hide; events: wa-after-show → lr-after-show; events: wa-hide → lr-hide; events: wa-show → lr-show. |
| `<wa-dropdown>` | `<lr-dropdown>` | `rewritten` | Automatic: tag/import plus events: wa-after-hide → lr-after-hide; events: wa-after-show → lr-after-show; events: wa-hide → lr-hide; events: wa-select → lr-select; events: wa-show → lr-show. |
| `<wa-dropdown-item>` | `<lr-dropdown-item>` | `rewritten` | Automatic: tag/import plus attributes: submenuOpen → submenu-open. |
| `<wa-file-input>` | `<lr-file-input>` | `warning-required` | Manual: Lyra exposes dragging and fileCount as getter-only derived state. Migrated code that assigned either upstream field must instead drive them through drag interaction or the selected-files input contract. |
| `<wa-format-bytes>` | `<lr-format-bytes>` | `exact` | Automatic: tag and supported side-effect registration import. |
| `<wa-format-date>` | `<lr-format-date>` | `exact` | Automatic: tag and supported side-effect registration import. |
| `<wa-format-number>` | `<lr-format-number>` | `exact` | Automatic: tag and supported side-effect registration import. |
| `<wa-icon>` | `<lr-icon>` | `rewritten` | Automatic: tag/import plus events: wa-error → lr-error; events: wa-load → lr-load. |
| `<wa-include>` | `<lr-include>` | `warning-required` | Manual: Lyra intentionally sanitizes included markup and keeps a same-origin default; uses that depend on cross-origin or script-executing behavior require an explicit security warning rather than a silent rename. |
| `<wa-input>` | `<lr-input>` | `rewritten` | Automatic: tag/import plus events: wa-clear → lr-clear; events: wa-invalid → lr-invalid. Equivalent surface representation: name defaults null ≡ ; no source rewrite. |
| `<wa-intersection-observer>` | `<lr-intersection-observer>` | `rewritten` | Automatic: tag/import plus events: wa-intersect → lr-intersect. |
| `<wa-known-date>` | `<lr-known-date>` | `rewritten` | Automatic: tag/import plus events: wa-invalid → lr-invalid. |
| `<wa-line-chart>` | `<lr-line-chart>` | `exact` | Automatic: tag and supported side-effect registration import. Typed `<lr-chart>` subclasses with tag-specific defaults and the full writable `LyraChartType` vocabulary — same optional peer deps as `<lr-chart>`. |
| `<wa-markdown>` | `<lr-markdown>` | `warning-required` | Manual: The source and target light-DOM Markdown content models and optional-peer runtime requirements are not mechanically equivalent; migration leaves the use unchanged and reports the required review. |
| `<wa-mutation-observer>` | `<lr-mutation-observer>` | `rewritten` | Automatic: tag/import plus events: wa-mutation → lr-mutation. |
| `<wa-number-input>` | `<lr-number-input>` | `rewritten` | Automatic: tag/import plus events: wa-invalid → lr-invalid. Equivalent surface representation: name defaults null ≡ ; no source rewrite. |
| `<wa-option>` | `<lr-option>` | `exact` | Automatic: tag and supported side-effect registration import. Filterable single/multi select, form-associated; options separate live `selected` from attribute-backed/reset `defaultSelected`; `xs`–`xl` sizing; async rich rows and retained selection payloads via `source`/`selectedRows`; virtual scrolling with `max-render`. |
| `<wa-otp-input>` | `<lr-otp-input>` | `rewritten` | Automatic: tag/import plus events: wa-clear → lr-clear; events: wa-complete → lr-complete; events: wa-invalid → lr-invalid. Equivalent surface representation: name defaults null ≡ ; no source rewrite. |
| `<wa-page>` | `<lr-page>` | `warning-required` | Manual: Lyra returns a finite 0 for null and for an element in a detached document with no viewport; Web Awesome 3.11 returns null for null and measures detached-document geometry against the ambient page viewport. |
| `<wa-pagination>` | `<lr-pagination>` | `warning-required` | Manual: The page-change events are covered by deterministic member rewrites. `label` is now optional with no declared default (was `string = ''`) so an explicit empty string can suppress the localized fallback without a never-set value doing the same -- a default-value divergence with no rewrite rule to express it, so migrating consumers get a warning instead of a silent rename. |
| `<wa-pie-chart>` | `<lr-pie-chart>` | `exact` | Automatic: tag and supported side-effect registration import. Typed `<lr-chart>` subclasses with tag-specific defaults and the full writable `LyraChartType` vocabulary — same optional peer deps as `<lr-chart>`. |
| `<wa-polar-area-chart>` | `<lr-polar-area-chart>` | `exact` | Automatic: tag and supported side-effect registration import. Typed `<lr-chart>` subclasses with tag-specific defaults and the full writable `LyraChartType` vocabulary — same optional peer deps as `<lr-chart>`. |
| `<wa-popover>` | `<lr-popover>` | `rewritten` | Automatic: tag/import plus events: wa-after-hide → lr-after-hide; events: wa-after-show → lr-after-show; events: wa-hide → lr-hide; events: wa-show → lr-show. Equivalent surface representation: for defaults null ≡ ; no source rewrite. |
| `<wa-popup>` | `<lr-popup>` | `rewritten` | Automatic: tag/import plus events: wa-reposition → lr-reposition. Equivalent surface representation: autoSizeBoundary is analyzer-inferred for property-only autoSizeBoundary; flipBoundary is analyzer-inferred for property-only flipBoundary; shiftBoundary is analyzer-inferred for property-only shiftBoundary; no source rewrite. |
| `<wa-progress-bar>` | `<lr-progress-bar>` | `exact` | Automatic: tag and supported side-effect registration import. Determinate or indeterminate progress indicators. |
| `<wa-progress-ring>` | `<lr-progress-ring>` | `exact` | Automatic: tag and supported side-effect registration import. Determinate or indeterminate progress indicators. |
| `<wa-qr-code>` | `<lr-qr-code>` | `exact` | Automatic: tag and supported side-effect registration import. Canvas QR renderer; needs the optional peer `qrcode`. |
| `<wa-radar-chart>` | `<lr-radar-chart>` | `exact` | Automatic: tag and supported side-effect registration import. Typed `<lr-chart>` subclasses with tag-specific defaults and the full writable `LyraChartType` vocabulary — same optional peer deps as `<lr-chart>`. |
| `<wa-radio>` | `<lr-radio>` | `exact` | Automatic: tag and supported side-effect registration import. Equivalent surface representation: name defaults null ≡ ; no source rewrite. Form-associated single-choice controls with roving arrow-key navigation and group validation; Lyra's group `name` defaults empty while Shoelace defaults to `option`, so the codemod inserts `name="option"` (set it for a manual rename). |
| `<wa-radio-group>` | `<lr-radio-group>` | `rewritten` | Automatic: tag/import plus events: wa-invalid → lr-invalid. Equivalent surface representation: name defaults null ≡ ; no source rewrite. |
| `<wa-random-content>` | `<lr-random-content>` | `warning-required` | Manual: Lyra returns frozen readonly selection snapshots instead of mutable arrays. The migrator also reports the exercised behavior differences: host and multi-item layout, bounded unique selection, forwarded-slot candidates, and autoplay semantics. |
| `<wa-rating>` | `<lr-rating>` | `rewritten` | Automatic: tag/import plus events: wa-hover → lr-hover; events: wa-invalid → lr-invalid. Equivalent surface representation: name defaults null ≡ ; getSymbol is analyzer-inferred for property-only getSymbol; no source rewrite. |
| `<wa-relative-time>` | `<lr-relative-time>` | `exact` | Automatic: tag and supported side-effect registration import. Locale-aware formatting primitives. |
| `<wa-resize-observer>` | `<lr-resize-observer>` | `warning-required` | Manual: Lyra freezes the entries array into an immutable snapshot at dispatch time; migrated code that mutates the array in place must create its own copy. |
| `<wa-scatter-chart>` | `<lr-scatter-chart>` | `exact` | Automatic: tag and supported side-effect registration import. Typed `<lr-chart>` subclasses with tag-specific defaults and the full writable `LyraChartType` vocabulary — same optional peer deps as `<lr-chart>`. |
| `<wa-scroller>` | `<lr-scroller>` | `exact` | Automatic: tag and supported side-effect registration import. Responsive overflow surface with optional navigation controls. |
| `<wa-select>` | `<lr-select>` | `rewritten` | Automatic: tag/import plus events: wa-after-hide → lr-after-hide; events: wa-after-show → lr-after-show; events: wa-clear → lr-clear; events: wa-hide → lr-hide; events: wa-invalid → lr-invalid; events: wa-show → lr-show. |
| `<wa-skeleton>` | `<lr-skeleton>` | `exact` | Automatic: tag and supported side-effect registration import. Loading placeholder (pulse/sheen). |
| `<wa-slider>` | `<lr-slider>` | `rewritten` | Automatic: tag/import plus events: wa-invalid → lr-invalid. |
| `<wa-sparkline>` | `<lr-sparkline>` | `exact` | Automatic: tag and supported side-effect registration import. Zero-dependency inline SVG. |
| `<wa-spinner>` | `<lr-spinner>` | `exact` | Automatic: tag and supported side-effect registration import. Localized indeterminate busy indicator with reduced-motion support. |
| `<wa-split-panel>` | `<lr-split-panel>` | `rewritten` | Automatic: tag/import plus events: wa-reposition → lr-reposition. |
| `<wa-switch>` | `<lr-switch>` | `rewritten` | Automatic: tag/import plus events: wa-invalid → lr-invalid. Equivalent surface representation: name defaults null ≡ ; no source rewrite. |
| `<wa-tab>` | `<lr-tab>` | `exact` | Automatic: tag and supported side-effect registration import. Tab strip with `placement` (logical `start`/`end` turn it vertical) and `activation="auto"`/`"manual"`; composed from the upstream `<lr-tab>`/`<lr-tab-panel>` child pairs. |
| `<wa-tab-group>` | `<lr-tab-group>` | `rewritten` | Automatic: tag/import plus events: wa-tab-hide → lr-tab-hide; events: wa-tab-show → lr-tab-show. |
| `<wa-tab-panel>` | `<lr-tab-panel>` | `exact` | Automatic: tag and supported side-effect registration import. Tab strip with `placement` (logical `start`/`end` turn it vertical) and `activation="auto"`/`"manual"`; composed from the upstream `<lr-tab>`/`<lr-tab-panel>` child pairs. |
| `<wa-tag>` | `<lr-tag>` | `rewritten` | Automatic: tag/import plus events: wa-remove → lr-remove. |
| `<wa-textarea>` | `<lr-textarea>` | `rewritten` | Automatic: tag/import plus events: wa-invalid → lr-invalid. Equivalent surface representation: name defaults null ≡ ; no source rewrite. |
| `<wa-time-input>` | `<lr-time-input>` | `rewritten` | Automatic: tag/import plus events: wa-after-hide → lr-after-hide; events: wa-after-show → lr-after-show; events: wa-clear → lr-clear; events: wa-hide → lr-hide; events: wa-invalid → lr-invalid; events: wa-show → lr-show. |
| `<wa-toast>` | `<lr-toast>` | `warning-required` | Manual: Lyra's create() overloads reference the Lyra*-prefixed LyraToastOptions/LyraToastCreateOptions type names (renamed from the unprefixed spellings in 9.0.0) instead of the upstream's own ToastCreateOptions text; the method's actual parameter count, order, and runtime shape are unchanged, only the printed TypeScript type names differ. |
| `<wa-toast-item>` | `<lr-toast-item>` | `rewritten` | Automatic: tag/import plus events: wa-after-hide → lr-after-hide; events: wa-after-show → lr-after-show; events: wa-hide → lr-hide; events: wa-show → lr-show. |
| `<wa-tooltip>` | `<lr-tooltip>` | `rewritten` | Automatic: tag/import plus events: wa-after-hide → lr-after-hide; events: wa-after-show → lr-after-show; events: wa-hide → lr-hide; events: wa-show → lr-show. Equivalent surface representation: for defaults null ≡ ; no source rewrite. |
| `<wa-tree>` | `<lr-tree>` | `warning-required` | Manual: Lyra freezes each selection snapshot and exposes it as readonly so listeners cannot mutate component-owned selection state. Migrated handlers that modify the event array in place must create their own copy. |
| `<wa-tree-item>` | `<lr-tree-item>` | `rewritten` | Automatic: tag/import plus events: wa-after-collapse → lr-after-collapse; events: wa-after-expand → lr-after-expand; events: wa-collapse → lr-collapse; events: wa-expand → lr-expand; events: wa-lazy-change → lr-lazy-change; events: wa-lazy-load → lr-lazy-load. |
| `<wa-video>` | `<lr-video>` | `exact` | Automatic: tag and supported side-effect registration import. Lyra adds load(), validates media and thumbnail URLs, preserves consumer source/track nodes, caps thumbnail VTT input, and rejects unsupported fullscreen requests. These fail-closed additions do not change the documented safe-use contract. |
| `<wa-video-playlist>` | `<lr-video-playlist>` | `rewritten` | Automatic: tag/import plus events: wa-video-change → lr-video-change. |
| `<wa-zoomable-frame>` | `<lr-zoomable-frame>` | `warning-required` | Manual: Lyra always renders a sandbox with an `allow-same-origin` default, rejects active and non-embeddable URL schemes, and drops `allow-same-origin` when paired with `allow-scripts`; migration leaves the use unchanged and reports the security-sensitive difference. |

## Shoelace (58)

Shoelace relationships are classified independently; a same-suffix tag is never treated as proof of compatibility.

| From | Lyra target or candidate | Classification | Disposition |
|---|---|---|---|
| `<sl-alert>` | `<lr-alert>` | `warning-required` | Manual: Pinned runtime evidence shows Shoelace emits non-cancelable state-change lifecycle notifications while Lyra provides synchronous pre-state veto events; automatic migration therefore requires review of listener timing and preventDefault() behavior. |
| `<sl-animated-image>` | `<lr-animated-image>` | `rewritten` | Automatic: tag/import plus events: sl-error → lr-error; events: sl-load → lr-load. |
| `<sl-animation>` | `<lr-animation>` | `rewritten` | Automatic: tag/import plus events: sl-cancel → lr-cancel; events: sl-finish → lr-finish; events: sl-start → lr-start. |
| `<sl-avatar>` | `<lr-avatar>` | `rewritten` | Automatic: tag/import plus events: sl-error → lr-error. |
| `<sl-badge>` | `<lr-badge>` | `rewritten` | Automatic: tag/import plus insert variant=primary. |
| `<sl-breadcrumb>` | `<lr-breadcrumb>` | `warning-required` | Manual: lr-breadcrumb's `label` accepts an accessible-name override; it is now optional with no declared default (was `string = ''`) so an explicit empty string can suppress the localized fallback without a never-set value doing the same. The rename carries no attribute/property name change, only this default-value divergence. |
| `<sl-breadcrumb-item>` | `<lr-breadcrumb-item>` | `exact` | Automatic: tag and supported side-effect registration import. Responsive navigation trail. |
| `<sl-button>` | `<lr-button>` | `rewritten` | Automatic: tag/import plus events: sl-blur → blur; events: sl-focus → focus; events: sl-invalid → lr-invalid. Equivalent surface representation: href defaults  ≡ undefined; size defaults medium ≡ m; variant defaults default ≡ neutral; no source rewrite. |
| `<sl-button-group>` | `<lr-button-group>` | `exact` | Automatic: tag and supported side-effect registration import. Responsive semantic grouping for related action controls. |
| `<sl-card>` | `<lr-card>` | `exact` | Automatic: tag and supported side-effect registration import. Review appearance tokens and dismiss events. |
| `<sl-carousel>` | `<lr-carousel>` | `warning-required` | Manual: Lyra accepts arbitrary HTMLElement slides, so its slide-change detail is wider than the upstream carousel-item class; migrated handlers that rely on item-specific members require review. |
| `<sl-carousel-item>` | `<lr-carousel-item>` | `exact` | Automatic: tag and supported side-effect registration import. Optional semantic slide wrapper for carousel content. |
| `<sl-checkbox>` | `<lr-checkbox>` | `warning-required` | Manual: Lyra uses the checked attribute as the reset default while Shoelace reflects the live checked state; migration leaves the use unchanged and reports the reflection-sensitive CSS, observer, serialization, and property-write difference. |
| `<sl-color-picker>` | `<lr-color-picker>` | `rewritten` | Automatic: tag/import plus events: sl-blur → blur; events: sl-change → lr-change; events: sl-focus → focus; events: sl-input → lr-input; events: sl-invalid → lr-invalid. Equivalent surface representation: form defaults  ≡ null; size defaults medium ≡ m; no source rewrite. |
| `<sl-copy-button>` | `<lr-copy-button>` | `rewritten` | Automatic: tag/import plus events: sl-copy → lr-copy; events: sl-error → lr-error. |
| `<sl-details>` | `<lr-details>` | `rewritten` | Automatic: tag/import plus events: sl-after-hide → lr-after-hide; events: sl-after-show → lr-after-show; events: sl-hide → lr-hide; events: sl-show → lr-show. |
| `<sl-dialog>` | `<lr-dialog>` | `warning-required` | Manual: Pinned runtime evidence shows Shoelace emits non-cancelable state-change lifecycle notifications while Lyra provides synchronous pre-state veto events; automatic migration therefore requires review of listener timing and preventDefault() behavior. |
| `<sl-divider>` | `<lr-divider>` | `exact` | Automatic: tag and supported side-effect registration import. Horizontal or vertical semantic separator. |
| `<sl-drawer>` | `<lr-drawer>` | `warning-required` | Manual: Pinned runtime evidence shows Shoelace emits non-cancelable state-change lifecycle notifications while Lyra provides synchronous pre-state veto events; automatic migration therefore requires review of listener timing and preventDefault() behavior. |
| `<sl-dropdown>` | `<lr-dropdown>` | `warning-required` | Manual: Pinned runtime evidence shows Shoelace emits non-cancelable state-change lifecycle notifications while Lyra provides synchronous pre-state veto events; automatic migration therefore requires review of listener timing and preventDefault() behavior. |
| `<sl-format-bytes>` | `<lr-format-bytes>` | `exact` | Automatic: tag and supported side-effect registration import. |
| `<sl-format-date>` | `<lr-format-date>` | `exact` | Automatic: tag and supported side-effect registration import. |
| `<sl-format-number>` | `<lr-format-number>` | `exact` | Automatic: tag and supported side-effect registration import. |
| `<sl-icon>` | `<lr-icon>` | `rewritten` | Automatic: tag/import plus events: sl-error → lr-error; events: sl-load → lr-load. |
| `<sl-icon-button>` | `<lr-icon-button>` | `rewritten` | Automatic: tag/import plus events: sl-blur → blur; events: sl-focus → focus. |
| `<sl-image-comparer>` | `<lr-image-comparer>` | `rewritten` | Automatic: tag/import plus events: sl-change → change. |
| `<sl-include>` | `<lr-include>` | `warning-required` | Manual: Lyra intentionally sanitizes included markup and keeps a same-origin default; uses that depend on cross-origin or script-executing behavior require an explicit security warning rather than a silent rename. |
| `<sl-input>` | `<lr-input>` | `rewritten` | Automatic: tag/import plus events: sl-blur → blur; events: sl-change → lr-change; events: sl-clear → lr-clear; events: sl-focus → focus; events: sl-input → lr-input; events: sl-invalid → lr-invalid. Equivalent surface representation: form defaults  ≡ null; size defaults medium ≡ m; no source rewrite. |
| `<sl-menu>` | `<lr-menu>` | `rewritten` | Automatic: tag/import plus events: sl-select → lr-select. |
| `<sl-menu-item>` | `<lr-menu-item>` | `exact` | Automatic: tag and supported side-effect registration import. Focusable action row owned by `<lr-menu>`, including checkbox items, nested submenus, and the canonical parent `lr-select` event. |
| `<sl-menu-label>` | `<lr-menu-label>` | `exact` | Automatic: tag and supported side-effect registration import. Non-interactive section heading inside `<lr-menu>`; `role="presentation"`, never a focus stop. |
| `<sl-mutation-observer>` | `<lr-mutation-observer>` | `rewritten` | Automatic: tag/import plus events: sl-mutation → lr-mutation. |
| `<sl-option>` | `<lr-option>` | `exact` | Automatic: tag and supported side-effect registration import. `defaultSelected`/the `selected` attribute is the reset default; live `selected` is property-only. Review option and value events. |
| `<sl-popup>` | `<lr-popup>` | `rewritten` | Automatic: tag/import plus events: sl-reposition → lr-reposition. Equivalent surface representation: autoSizeBoundary is analyzer-inferred for property-only autoSizeBoundary; flipBoundary is analyzer-inferred for property-only flipBoundary; shiftBoundary is analyzer-inferred for property-only shiftBoundary; no source rewrite. |
| `<sl-progress-bar>` | `<lr-progress-bar>` | `exact` | Automatic: tag and supported side-effect registration import. Built-in status copy is localized through Lyra's runtime. |
| `<sl-progress-ring>` | `<lr-progress-ring>` | `exact` | Automatic: tag and supported side-effect registration import. Determinate or indeterminate progress indicators. |
| `<sl-qr-code>` | `<lr-qr-code>` | `rewritten` | Automatic: tag/import plus insert background=white; insert fill=black. |
| `<sl-radio>` | `<lr-radio>` | `rewritten` | Automatic: tag/import plus events: sl-blur → blur; events: sl-focus → focus. Equivalent surface representation: size defaults medium ≡ m; no source rewrite. |
| `<sl-radio-button>` | `<lr-radio-button>` | `rewritten` | Automatic: tag/import plus events: sl-blur → blur; events: sl-focus → focus. Equivalent surface representation: size defaults medium ≡ m; no source rewrite. |
| `<sl-radio-group>` | `<lr-radio-group>` | `rewritten` | Automatic: tag/import plus events: sl-change → lr-change; events: sl-input → lr-input; events: sl-invalid → lr-invalid; insert name=option. Equivalent surface representation: form defaults  ≡ null; size defaults medium ≡ m; no source rewrite. |
| `<sl-range>` | `<lr-slider>` | `rewritten` | Automatic: tag/import plus events: sl-blur → blur; events: sl-change → lr-change; events: sl-focus → focus; events: sl-input → lr-input; events: sl-invalid → lr-invalid; insert tooltip=top. Equivalent surface representation: form defaults  ≡ null; name defaults  ≡ null; no source rewrite. |
| `<sl-rating>` | `<lr-rating>` | `rewritten` | Automatic: tag/import plus events: sl-change → lr-change; events: sl-hover → lr-hover. Equivalent surface representation: getSymbol is analyzer-inferred for property-only getSymbol; no source rewrite. |
| `<sl-relative-time>` | `<lr-relative-time>` | `exact` | Automatic: tag and supported side-effect registration import. Locale-aware formatting primitives. |
| `<sl-resize-observer>` | `<lr-resize-observer>` | `warning-required` | Manual: Lyra freezes the entries array into an immutable snapshot at dispatch time; migrated code that mutates the array in place must create its own copy. |
| `<sl-select>` | `<lr-select>` | `rewritten` | Automatic: tag/import plus events: sl-after-hide → lr-after-hide; events: sl-after-show → lr-after-show; events: sl-blur → blur; events: sl-change → lr-change; events: sl-clear → lr-clear; events: sl-focus → focus; events: sl-hide → lr-hide; events: sl-input → lr-input; events: sl-invalid → lr-invalid; events: sl-show → lr-show. Equivalent surface representation: form defaults  ≡ null; size defaults medium ≡ m; getTag is analyzer-inferred for property-only getTag; no source rewrite. |
| `<sl-skeleton>` | `<lr-skeleton>` | `exact` | Automatic: tag and supported side-effect registration import. Loading placeholder (pulse/sheen). |
| `<sl-spinner>` | `<lr-spinner>` | `exact` | Automatic: tag and supported side-effect registration import. Built-in status copy is localized through Lyra's runtime. |
| `<sl-split-panel>` | `<lr-split-panel>` | `warning-required` | Manual: The published Shoelace manifest exports SNAP_NONE without documenting its callable signature; Lyra exports the same helper with an explicit typed parameter, so the tag rewrite remains available but consumers that call the helper require review. Lyra also renamed its own SnapFunction export to LyraSplitPanelSnapFunction (a Lyra-original type, not part of the Shoelace public surface) as part of the 9.0.0 Lyra*-prefix harmonization. |
| `<sl-switch>` | `<lr-switch>` | `rewritten` | Automatic: tag/import plus events: sl-blur → blur; events: sl-change → lr-change; events: sl-focus → focus; events: sl-input → lr-input; events: sl-invalid → lr-invalid. Equivalent surface representation: form defaults  ≡ null; size defaults medium ≡ m; no source rewrite. |
| `<sl-tab>` | `<lr-tab>` | `rewritten` | Automatic: tag/import plus events: sl-close → lr-close. |
| `<sl-tab-group>` | `<lr-tab-group>` | `rewritten` | Automatic: tag/import plus events: sl-tab-hide → lr-tab-hide; events: sl-tab-show → lr-tab-show. |
| `<sl-tab-panel>` | `<lr-tab-panel>` | `exact` | Automatic: tag and supported side-effect registration import. Tab strip with `placement` (logical `start`/`end` turn it vertical) and `activation="auto"`/`"manual"`; composed from the upstream `<lr-tab>`/`<lr-tab-panel>` child pairs. |
| `<sl-tag>` | `<lr-tag>` | `rewritten` | Automatic: tag/import plus events: sl-remove → lr-remove. Equivalent surface representation: size defaults medium ≡ m; no source rewrite. |
| `<sl-textarea>` | `<lr-textarea>` | `rewritten` | Automatic: tag/import plus events: sl-blur → blur; events: sl-change → lr-change; events: sl-focus → focus; events: sl-input → lr-input; events: sl-invalid → lr-invalid. Equivalent surface representation: form defaults  ≡ null; size defaults medium ≡ m; no source rewrite. |
| `<sl-tooltip>` | `<lr-tooltip>` | `warning-required` | Manual: Pinned runtime evidence shows Shoelace emits non-cancelable state-change lifecycle notifications while Lyra provides synchronous pre-state veto events; automatic migration therefore requires review of listener timing and preventDefault() behavior. |
| `<sl-tree>` | `<lr-tree>` | `warning-required` | Manual: Lyra freezes each selection snapshot and exposes it as readonly so listeners cannot mutate component-owned selection state. Migrated handlers that modify the event array in place must create their own copy. |
| `<sl-tree-item>` | `<lr-tree-item>` | `rewritten` | Automatic: tag/import plus events: sl-after-collapse → lr-after-collapse; events: sl-after-expand → lr-after-expand; events: sl-collapse → lr-collapse; events: sl-expand → lr-expand; events: sl-lazy-change → lr-lazy-change; events: sl-lazy-load → lr-lazy-load. |
| `<sl-visually-hidden>` | `<lr-visually-hidden>` | `exact` | Automatic: tag and supported side-effect registration import. Hides content from sight while leaving it in the accessibility tree; reveals itself while focus is inside, which is what makes it usable for skip links. |
