)
* ```
*
* ### Lifecycle (View-based FSM)
* - **Construction**: Calls {@link initialize}, sets up config Proxy, transitions `NEW → INITIALIZED`.
* - **{@link mount}**: Creates DOM structure based on current config, transitions `INITIALIZED → MOUNTED`.
* - **Reactive updates**: After mount, config changes trigger {@link applyPartialChange} (targeted DOM updates).
* - **{@link destroy}**: Removes DOM nodes, transitions to `DESTROYED`.
*
* ### Reactive configuration strategy
* - **{@link config}**: Internal target object (should not be mutated directly).
* - **{@link configProxy}**: Proxy wrapper; assignments trigger {@link applyPartialChange}.
* - **{@link isRendered}**: Gates partial updates (no DOM changes before initial {@link mount}).
* - **Batch updates**: {@link optionConfig} setter applies multiple changes efficiently (only diffed properties).
*
* ### Partial update semantics
* - **`isMultiple`**: Toggles `"multiple"` class, switches input `type` (radio ↔ checkbox).
* - **`hasImage`**: Toggles `"has-image"` class, creates/removes `
![]()
` element.
* - **`imagePosition`**: Replaces `image-{position}` class (top/right/bottom/left).
* - **`imageWidth/Height/BorderRadius`**: Mutates `
![]()
` inline styles.
* - **`labelValign/Halign`**: Replaces label alignment classes.
*
* ### Image lifecycle
* - Created on-demand via {@link createImage} when `hasImage = true`.
* - Removed via `remove()` when `hasImage = false`.
* - Reference stored in `view.tags.OptionImage` (nulled after removal).
*
* ### Accessibility
* - Root: `role="option"`, `aria-selected="false"` (managed externally), `tabindex="-1"`.
* - Input: Associated with label via unique `id` / `htmlFor`.
* - Label: Clickable, triggers input selection.
*
* ### DOM side effects
* - {@link mount} creates and appends full structure.
* - {@link applyPartialChange} mutates classes, attributes, styles, or child nodes.
* - {@link createImage} inserts `
![]()
` element.
* - Setters ({@link isMultiple}, {@link hasImage}) trigger Proxy → DOM updates.
*
* ### No-op / Idempotency
* - {@link applyPartialChange} is no-op if view not mounted (early return guard).
* - {@link createImage} is no-op if image already exists.
* - {@link optionConfig} setter only assigns diffed properties (avoids redundant Proxy triggers).
* - Safe to call setters multiple times with same value (Proxy guards against no-op updates).
*
* @extends View
* @template OptionViewTags - Type descriptor for the option's DOM structure.
* @see {@link OptionViewResult}
* @see {@link OptionConfig}
* @see {@link View}
*/
export class OptionView extends View {
/**
* Strongly-typed reference to the mounted option view structure.
*
* Structure:
* - **view**: Root container element.
* - **tags**: Named references to input, image (conditional), label, label content.
*
* Lifecycle:
* - `null` until {@link mount} completes.
* - Cleared during {@link destroy}.
*
* @public
*/
public view?: OptionViewResult;
/**
* Parsed configuration (bound from the `