/**
* Part-name state tokens.
*
* `::part()` accepts only pseudo-classes after it, so `::part(segment)[data-selected]` is invalid
* CSS and a consumer cannot reach a per-entry state through an attribute. The state has to live in
* the PART NAME itself — `part="segment segment-selected"`, styled as `::part(segment-selected)`.
*
* Four components had each hand-rolled that string independently (a `statePart(base, selected)`
* taking one boolean, two `[...].filter(Boolean).join(' ')` arrays, and a nested ternary emitting
* two alias names), so every new state meant a new bespoke expression and the emitted vocabulary
* drifted: some components join with `-`, the ones mirroring an upstream tag join with `--`, and
* one emits both. This builds all of those shapes from one declaration so the token order is
* stable, a falsy state never emits an empty token, and an unstated element still renders the bare
* base name unchanged.
*
* Three shipped shapes it deliberately does NOT serve, because adopting it would silently RENAME a
* public part name: `lr-checkbox`/`lr-radio`/`lr-radio-button` publish a bare word alongside the
* prefixed alias (`checked` AND `control--checked`), and `lr-otp-input` publishes state tokens with
* no base prefix at all (`active`, `masked`, `invalid`). Those stay hand-rolled until their
* vocabulary is revisited deliberately. `lr-tree-item`'s `item--selected` family IS expressible,
* through `separators: ['--']`.
*/
/**
* States for one part, in the order their tokens should appear.
*
* `true` emits ``. A non-empty string emits `-`, which is
* how a parameterized state is published (a highlight tone, say). `false`, `undefined`, `null` and
* the empty string emit nothing.
*/
export type PartStates=Readonly>;export interface StatePartOptions{
/**
* Separators between the base name and each active state name. Defaults to `['-']`.
*
* A component mirroring a `wa-*`/`sl-*` tag whose published part vocabulary uses `--` passes
* `['--']`; one that has shipped both spellings passes `['-', '--']` and keeps emitting both, so
* neither an existing consumer stylesheet nor a migrating one breaks.
*/
readonly separators?:readonly string[];}
/**
* Builds the `part` attribute value for a part that carries state in its name.
*
* Returns the bare `base` when no state is active, which is what makes migrating an existing
* component safe: its unstated output is byte-identical to the literal it replaced.
*
* @example
* statePart('segment', { selected: true, empty: false, disabled: true });
* // 'segment segment-selected segment-disabled'
*/
export declare function statePart(base:string,states?:PartStates,options?:StatePartOptions):string;