<!-- GENERATED by scripts/build-llms.mjs from llms/data.md — do not edit this file. -->

# `lr-env-list`

- **Import** `import '@aceshooting/lyra-ui/components/lr-env-list.js';` (stable tag alias; registers the tag)
- **Class** `LyraEnvList`, also available unregistered from `@aceshooting/lyra-ui/components/data/env-list/env-list.class.js`
- **Family** `components/data/` — see `llms/index.md` for its siblings
- **Status** `stable` since `4.0.0` — see the maturity and deprecation policy in `llms/shared.md`
- **Release history** [CHANGELOG.md](../../CHANGELOG.md); family-wide breaking-change summaries: [llms-full.txt](../../llms-full.txt)
- **Deprecations** none
- **Optional peers** none
- **Themeable via** 6 parts, 2 custom properties — see this component's own `@csspart`/`@cssprop` list below
- **Library-wide behavior** (events, form association, `locale`/`strings`, tokens, TS types): `llms/shared.md`

---

## `lr-env-list`

A masked key/value list for environment variables and secrets, with per-row reveal and copy.
Masking is presentational, not a security boundary: the real value sits in a DOM property
regardless of mask state. Names, revealed values, and localized action text wrap within narrow
allocations; the name track uses at most 40% of the available inline size.

**Properties:** `entries: readonly EnvEntry[] = []` (attribute: false; clone-owned/frozen snapshots
of at most the first 10,000 source entries; malformed records, blank names, and later duplicate
names are skipped first-wins before render, reveal state, copy actions, and events; reassign after
changes), `revealable: boolean = true` (reflected), `copyable: boolean = true`
(reflected), and `label?: string`. An omitted label uses localized `envListLabel`; an explicit empty
string remains empty. A host `aria-label` wins by attribute presence, including when empty.

**Events:** `lr-reveal-change` (frozen readonly `detail: { envName, revealed }`); `lr-copy` (frozen
readonly `detail: { ok: true, text }`, emitted only after clipboard fulfillment, with `text` equal
to the real unmasked value); `lr-copy-error` (frozen readonly
`detail: { ok: false, text, reason, error }`); and `lr-error` (compatibility failure notification
without raw platform error text). Failure is announced through the localized `copyFailed` string
in the owning document's shared polite live region; copy intent is never announced as success.

**CSS parts:** `base` (the `<dl>` root), `name` (the `<dt>` text), `value-cell` (the `<dd>` wrapping
an entry's value text and buttons), `value` (carries `data-masked`), `reveal-button`, and
`copy-button`.

**Themeable custom properties:** `--lr-env-list-reveal-active-bg` (default
`var(--lr-color-brand-quiet)`) and `--lr-env-list-reveal-active-border` (default
`var(--lr-color-brand)`) — the background and border color of a pressed (revealed) reveal toggle.
Both are inline `var()` fallbacks at their point of use rather than `:host` declarations, so either
can be set on the element _or any ancestor_. They exist because
`::part(reveal-button)[aria-pressed='true']` is invalid CSS — Shadow Parts forbids an attribute
selector after `::part()` — so restyling the pressed state otherwise required overriding the
library-wide brand tokens.
