{
  "schemaVersion": "1.0.0",
  "readme": "",
  "modules": [
    {
      "kind": "javascript-module",
      "path": "src/components/baht-form.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "<baht-form> — dumb controlled form renderer (spec 01).\nJSON in (form + value + registry) -> UI out; emits `baht-change` / `baht-validity`.\nNo buttons, no cross-field logic — that's <baht-workflow> or the host.",
          "name": "BahtForm",
          "members": [
            {
              "kind": "field",
              "name": "form",
              "type": {
                "text": "FormDefinition"
              }
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "Record<string, unknown>"
              },
              "default": "{}"
            },
            {
              "kind": "field",
              "name": "registry",
              "type": {
                "text": "Registry"
              },
              "default": "{}"
            },
            {
              "kind": "field",
              "name": "showOptional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Label every non-required field \"(optional)\" (localized) instead of relying on asterisks alone.",
              "attribute": "show-optional"
            },
            {
              "kind": "field",
              "name": "options",
              "type": {
                "text": "BahtFormOptions"
              },
              "default": "{}"
            },
            {
              "kind": "field",
              "name": "fieldStates",
              "type": {
                "text": "Record<string, DerivedFieldState>"
              },
              "default": "{}",
              "description": "L2 (workflow) derived per-field UI state, keyed by field key. Optional."
            },
            {
              "kind": "field",
              "name": "view",
              "type": {
                "text": "string | undefined | undefined"
              },
              "description": "Name of a view from `form.views`. Display-only: when set, only that view's\nfields are rendered and validated (the user can only fix what they see),\nbut getData() still returns the FULL form — the server always validates\nthe complete schema, views never change the submit payload.",
              "attribute": "view"
            },
            {
              "kind": "field",
              "name": "flags",
              "type": {
                "text": "FeatureFlags"
              },
              "default": "{}",
              "description": "Feature-flag values (spec 01 §12) — fields whose `flag` is off behave as\nif they were never in the schema: no render, no validation, no payload."
            },
            {
              "kind": "field",
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Force every field readonly — a display-only render of this form's own layout/widths.",
              "attribute": "readonly"
            },
            {
              "kind": "field",
              "name": "edits",
              "type": {
                "text": "Record<string, unknown>"
              },
              "privacy": "private",
              "default": "{}",
              "description": "Edits the user made since the host last set `value` (controlled overlay)."
            },
            {
              "kind": "field",
              "name": "errors",
              "type": {
                "text": "ValidationError[]"
              },
              "privacy": "private",
              "default": "[]"
            },
            {
              "kind": "field",
              "name": "scriptStates",
              "type": {
                "text": "Record<string, ScriptFieldState>"
              },
              "privacy": "private",
              "default": "{}",
              "description": "Per-field overrides set by scripts — layered over `fieldStates` (script wins)."
            },
            {
              "kind": "field",
              "name": "fieldMessages",
              "type": {
                "text": "Record<string, ScriptMessage>"
              },
              "privacy": "private",
              "default": "{}",
              "description": "showFieldMsg() messages, one per field."
            },
            {
              "kind": "field",
              "name": "formMessages",
              "type": {
                "text": "ScriptMessage[]"
              },
              "privacy": "private",
              "default": "[]",
              "description": "addErrorMessage()/addInfoMessage() — reset at the start of every submit pass."
            },
            {
              "kind": "field",
              "name": "referenceLabels",
              "privacy": "private",
              "default": "new Map<string, string>()",
              "description": "Read-only view: labels of reference ids, keyed `lookup\\u0000id` (resolved async)."
            },
            {
              "kind": "field",
              "name": "referenceResolving",
              "privacy": "private",
              "default": "new Set<string>()"
            },
            {
              "kind": "field",
              "name": "warnedLookups",
              "privacy": "private",
              "default": "new Set<string>()"
            },
            {
              "kind": "field",
              "name": "scriptContext",
              "type": {
                "text": "ScriptContext | null"
              },
              "privacy": "private",
              "default": "null",
              "description": "The `g` handed to scripts; rebuilt when `form` changes."
            },
            {
              "kind": "field",
              "name": "scriptContextForm",
              "type": {
                "text": "FormDefinition | null"
              },
              "privacy": "private",
              "default": "null"
            },
            {
              "kind": "field",
              "name": "scriptDepth",
              "type": {
                "text": "number"
              },
              "privacy": "private",
              "default": "0",
              "description": "Depth of the current setValue -> change-script cascade."
            },
            {
              "kind": "field",
              "name": "loadedForm",
              "type": {
                "text": "FormDefinition | null"
              },
              "privacy": "private",
              "default": "null",
              "description": "The `form` identity `load` scripts last ran for."
            },
            {
              "kind": "field",
              "name": "dynamicOptions",
              "privacy": "private",
              "default": "new Map<string, FieldOption[]>()",
              "description": "Resolved dynamic options + the dep snapshot / fetch epoch they belong to."
            },
            {
              "kind": "field",
              "name": "optionsSnapshots",
              "privacy": "private",
              "default": "new Map<string, string>()"
            },
            {
              "kind": "field",
              "name": "optionsEpoch",
              "privacy": "private",
              "default": "new Map<string, number>()"
            },
            {
              "kind": "field",
              "name": "warnedViews",
              "privacy": "private",
              "default": "new Set<string>()",
              "description": "Unknown `view` values already warned about — avoid re-warning on every render."
            },
            {
              "kind": "field",
              "name": "flagCache",
              "type": {
                "text": "{ form?: FormDefinition; flags?: FeatureFlags; out?: FormDefinition }"
              },
              "privacy": "private",
              "default": "{}",
              "description": "applyFlags result, memoized on (form, flags) identity."
            },
            {
              "kind": "field",
              "name": "assignedForm",
              "type": {
                "text": "FormDefinition | undefined"
              },
              "privacy": "private",
              "description": "`form` as the host may actually have left it: a framework can connect the element\nbefore it binds the property, so internally it is optional until then.",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "effectiveForm",
              "type": {
                "text": "FormDefinition | undefined"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "syncDynamicOptions",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Refetch `options_from` options whose dep snapshot changed. Sync fetchers\nland immediately; async ones re-render on resolve (stale responses are\ndropped by epoch)."
            },
            {
              "kind": "method",
              "name": "clearDependents",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "changedKey",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "A user edit invalidates every field whose options_deps include the edited\nkey — their values reset to defaults, cascading down chains\n(province -> district -> subdistrict)."
            },
            {
              "kind": "field",
              "name": "sortedFields",
              "type": {
                "text": "FieldDescriptor[]"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "lastVisible",
              "type": {
                "text": "Record<string, boolean>"
              },
              "privacy": "private",
              "default": "{}",
              "description": "Visibility as of the last completed render, by key. A field that was\nhidden there and is visible now gets `baht-field--revealed` for one\nrender so the stylesheet can fade it in; fields visible from the first\nrender never animate (a form should not shimmer on mount)."
            },
            {
              "kind": "field",
              "name": "nextVisible",
              "type": {
                "text": "Record<string, boolean>"
              },
              "privacy": "private",
              "default": "{}"
            },
            {
              "kind": "method",
              "name": "revealClass",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "key",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "visible",
                  "type": {
                    "text": "boolean"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "stateFor",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "DerivedFieldState"
                }
              },
              "parameters": [
                {
                  "name": "field",
                  "type": {
                    "text": "FieldDescriptor"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "rowStatesFor",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "Record<string, DerivedFieldState>"
                }
              },
              "parameters": [
                {
                  "name": "key",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "The row sub-field states of one repeater: `fieldStates` keys starting `key[`."
            },
            {
              "kind": "method",
              "name": "valueFor",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "unknown"
                }
              },
              "parameters": [
                {
                  "name": "field",
                  "type": {
                    "text": "FieldDescriptor"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "flushTyped",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Debounced keystrokes still in a control land in `edits` before anyone reads them."
            },
            {
              "kind": "method",
              "name": "getData",
              "return": {
                "type": {
                  "text": "Record<string, unknown>"
                }
              }
            },
            {
              "kind": "method",
              "name": "setValue",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "patch",
                  "type": {
                    "text": "Record<string, unknown>"
                  }
                }
              ],
              "description": "Merge values programmatically. Runs each key's `change` scripts (like\nServiceNow's g_form.setValue) but emits no `baht-change` — the host\nalready knows, and a store adapter would otherwise loop."
            },
            {
              "kind": "method",
              "name": "runValidators",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "ValidationError[]"
                }
              },
              "description": "Declarative + registry validators over the visible fields (no scripts)."
            },
            {
              "kind": "method",
              "name": "validate",
              "return": {
                "type": {
                  "text": "{ valid: boolean; errors: ValidationError[] }"
                }
              },
              "description": "Full validation pass: validators, then `submit` scripts (spec 01 §14). A\nscript returning `false` blocks; its `addErrorMessage()` calls become\n`{ key: '$' }` errors so hosts see why."
            },
            {
              "kind": "method",
              "name": "reset",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "g",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "ScriptContext"
                }
              },
              "parameters": [
                {
                  "name": "form",
                  "type": {
                    "text": "FormDefinition"
                  }
                }
              ],
              "description": "The `g` (g_form) for the current form — built lazily over this component's state."
            },
            {
              "kind": "method",
              "name": "applyScriptValue",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "key",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "A script wrote a value: same path as a user edit (emit + cascade), minus the formatter."
            },
            {
              "kind": "method",
              "name": "runChangeScripts",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "key",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "oldValue",
                  "type": {
                    "text": "unknown"
                  }
                },
                {
                  "name": "newValue",
                  "type": {
                    "text": "unknown"
                  }
                },
                {
                  "name": "isLoading",
                  "type": {
                    "text": "boolean"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "runLoadScripts",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Form load (ServiceNow order): every field's `change` scripts with\nisLoading=true, then the `load` scripts. Once per `form` identity — a\nworkflow reuses this element across steps, so each step loads."
            },
            {
              "kind": "method",
              "name": "onFieldInput",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "field",
                  "type": {
                    "text": "FieldDescriptor"
                  }
                },
                {
                  "name": "e",
                  "type": {
                    "text": "Event"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "validateOneField",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "ValidationError[]"
                }
              },
              "parameters": [
                {
                  "name": "field",
                  "type": {
                    "text": "FieldDescriptor"
                  }
                }
              ],
              "description": "Validate a single field against current form data (siblings included)."
            },
            {
              "kind": "method",
              "name": "onFieldBlur",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "field",
                  "type": {
                    "text": "FieldDescriptor"
                  }
                }
              ],
              "description": "`validateOn: 'blur'` — validate just the field the user left, same as\nhow errors are shown elsewhere (merged into `this.errors`, painted by\n`renderField`/`.baht-error`). No-op for 'change'/'submit' modes."
            },
            {
              "kind": "method",
              "name": "renderField",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "parameters": [
                {
                  "name": "field",
                  "type": {
                    "text": "FieldDescriptor"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "lookupFor",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "FieldReferenceLookup | null"
                }
              },
              "parameters": [
                {
                  "name": "field",
                  "type": {
                    "text": "FieldDescriptor"
                  }
                }
              ],
              "description": "`registry.references[field.reference]`, with `search` bound to the form's current data."
            },
            {
              "kind": "method",
              "name": "referenceText",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "field",
                  "type": {
                    "text": "FieldDescriptor"
                  }
                },
                {
                  "name": "id",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "Read-only view of a reference: its resolved label once known, the raw id until then."
            },
            {
              "kind": "method",
              "name": "uploaderFor",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "NonNullable<Registry['uploaders']>[string] | undefined"
                }
              },
              "parameters": [
                {
                  "name": "field",
                  "type": {
                    "text": "FieldDescriptor"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "renderFieldMsg",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "parameters": [
                {
                  "name": "msg",
                  "type": {
                    "text": "{ type: string; message: string }"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "onControlInput",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "key",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "e",
                  "type": {
                    "text": "Event"
                  }
                }
              ],
              "description": "Resolve the descriptor at event time — it may have changed since the control\nwas first rendered (the same node is reused across renders, see render())."
            },
            {
              "kind": "method",
              "name": "renderReadonlyFiles",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "parameters": [
                {
                  "name": "items",
                  "type": {
                    "text": "{ name: string; url: string | null }[]"
                  }
                }
              ],
              "description": "Uploaded files in read-only mode: each a download link when it has a safe url."
            },
            {
              "kind": "method",
              "name": "renderReadonlyBody",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "parameters": [
                {
                  "name": "field",
                  "type": {
                    "text": "FieldDescriptor"
                  }
                },
                {
                  "name": "shown",
                  "type": {
                    "text": "DisplayValue"
                  }
                }
              ],
              "description": "The value part of a read-only field, by how `displayValue` says it reads."
            },
            {
              "kind": "method",
              "name": "renderReadonlyField",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "parameters": [
                {
                  "name": "field",
                  "type": {
                    "text": "FieldDescriptor"
                  }
                },
                {
                  "name": "width",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "visible",
                  "type": {
                    "text": "boolean"
                  }
                }
              ]
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "events": [
            {
              "name": "baht-validity",
              "type": {
                "text": "CustomEvent"
              }
            },
            {
              "name": "baht-change",
              "type": {
                "text": "CustomEvent"
              }
            },
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "show-optional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Label every non-required field \"(optional)\" (localized) instead of relying on asterisks alone.",
              "fieldName": "showOptional"
            },
            {
              "name": "view",
              "type": {
                "text": "string | undefined | undefined"
              },
              "description": "Name of a view from `form.views`. Display-only: when set, only that view's\nfields are rendered and validated (the user can only fix what they see),\nbut getData() still returns the FULL form — the server always validates\nthe complete schema, views never change the submit payload.",
              "fieldName": "view"
            },
            {
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Force every field readonly — a display-only render of this form's own layout/widths.",
              "fieldName": "readonly"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-form",
          "customElement": true
        },
        {
          "kind": "variable",
          "name": "errors",
          "type": {
            "text": "ValidationError[]"
          },
          "default": "[]"
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtForm",
          "declaration": {
            "name": "BahtForm",
            "module": "src/components/baht-form.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-form",
          "declaration": {
            "name": "BahtForm",
            "module": "src/components/baht-form.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/baht-workflow.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "<baht-workflow> — the optional brain (spec 03). Wraps the current form in an\ninternal <baht-form>, evaluates rules on every change, walks the visible forms\nin linear `order`, and owns the single Next/Submit button.\nForms with kind 'approval' render a decision step instead (spec 03 §4):\na summary of earlier answers plus Approve/Reject (+ optional comment); the\ndecision lands in data as `<form_name>.decision` so rules can branch on it.\nThe runtime navigates; the host acts (on baht-next / baht-submit / baht-approve /\nbaht-reject / baht-complete).",
          "name": "BahtWorkflow",
          "members": [
            {
              "kind": "field",
              "name": "workflow",
              "type": {
                "text": "WorkflowDefinition"
              }
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "NestedData"
              },
              "default": "{}"
            },
            {
              "kind": "field",
              "name": "registry",
              "type": {
                "text": "Registry"
              },
              "default": "{}"
            },
            {
              "kind": "field",
              "name": "validateGate",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "attribute": "validate-gate"
            },
            {
              "kind": "field",
              "name": "nextLabel",
              "type": {
                "text": "string | undefined"
              },
              "description": "Label attributes beat the i18n catalog; unset = t('next')/t('submit')/t('back').",
              "attribute": "next-label"
            },
            {
              "kind": "field",
              "name": "submitLabel",
              "type": {
                "text": "string | undefined"
              },
              "attribute": "submit-label"
            },
            {
              "kind": "field",
              "name": "backLabel",
              "type": {
                "text": "string | undefined"
              },
              "attribute": "back-label"
            },
            {
              "kind": "field",
              "name": "showBack",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "attribute": "show-back"
            },
            {
              "kind": "field",
              "name": "direction",
              "type": {
                "text": "'forward' | 'back' | null"
              },
              "privacy": "private",
              "default": "null",
              "description": "Which way the last navigation went. Stamped on the step wrapper as\n`baht-workflow-step--forward|--back` so the stylesheet can slide the new\nstep in from the matching side; null on first render (nothing to replay)."
            },
            {
              "kind": "field",
              "name": "flags",
              "type": {
                "text": "FeatureFlags"
              },
              "default": "{}",
              "description": "Feature-flag values (spec 01 §12): flag-off steps/fields/rules vanish."
            },
            {
              "kind": "field",
              "name": "showSteps",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Render a <baht-steps> progress indicator above the current form.",
              "attribute": "show-steps"
            },
            {
              "kind": "field",
              "name": "stepsVariant",
              "type": {
                "text": "'default' | 'sidebar'"
              },
              "default": "'default'",
              "description": "'default' horizontal markers, or 'sidebar' vertical nav list — forwarded to <baht-steps>.",
              "attribute": "steps-variant"
            },
            {
              "kind": "field",
              "name": "data",
              "type": {
                "text": "NestedData"
              },
              "privacy": "private",
              "default": "{}"
            },
            {
              "kind": "field",
              "name": "derived",
              "type": {
                "text": "Derived | null"
              },
              "privacy": "private",
              "default": "null"
            },
            {
              "kind": "field",
              "name": "current",
              "type": {
                "text": "string | null"
              },
              "privacy": "private",
              "default": "null"
            },
            {
              "kind": "field",
              "name": "approvalError",
              "type": {
                "text": "string | null"
              },
              "privacy": "private",
              "default": "null"
            },
            {
              "kind": "field",
              "name": "history",
              "type": {
                "text": "string[]"
              },
              "privacy": "private",
              "default": "[]"
            },
            {
              "kind": "field",
              "name": "currentFormName",
              "type": {
                "text": "string | null"
              },
              "readonly": true
            },
            {
              "kind": "field",
              "name": "flagCache",
              "type": {
                "text": "{\n    workflow?: WorkflowDefinition;\n    flags?: FeatureFlags;\n    out?: WorkflowDefinition;\n  }"
              },
              "privacy": "private",
              "default": "{}",
              "description": "applyFlags result, memoized on (workflow, flags) identity."
            },
            {
              "kind": "field",
              "name": "assignedWorkflow",
              "type": {
                "text": "WorkflowDefinition | undefined"
              },
              "privacy": "private",
              "description": "`workflow` as the host may actually have left it: a framework can connect the\nelement before it binds the property, so internally it is optional until then.",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "effectiveWorkflow",
              "type": {
                "text": "WorkflowDefinition | undefined"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "reevaluate",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "field",
              "name": "visibleForms",
              "type": {
                "text": "WorkflowForm[]"
              },
              "privacy": "private",
              "description": "Forms in ascending order whose derived visibility is true.",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "currentForm",
              "type": {
                "text": "WorkflowForm | null"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "navTarget",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "description": "Where next() would go from here: a form_name or 'end' (spec 03 §6).",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "isLast",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "fieldStatesFor",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "Record<string, DerivedFieldState>"
                }
              },
              "parameters": [
                {
                  "name": "form_name",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "field",
              "name": "formEl",
              "type": {
                "text": "BahtForm | null"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "getData",
              "return": {
                "type": {
                  "text": "NestedData"
                }
              }
            },
            {
              "kind": "method",
              "name": "setValue",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "form_name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "patch",
                  "type": {
                    "text": "Record<string, unknown>"
                  }
                }
              ],
              "description": "Host/store write into one form's data — same path a user edit takes\n(rules reevaluate, `baht-data-change` fires) but WITHOUT the step reset\nthat re-feeding the `value` prop causes."
            },
            {
              "kind": "method",
              "name": "next",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "advance",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "extraDetail",
                  "default": "{}",
                  "type": {
                    "text": "Record<string, unknown>"
                  }
                }
              ],
              "description": "Advance past the current form: submit+complete at 'end', else step to navTarget."
            },
            {
              "kind": "method",
              "name": "approve",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Approve the current approval step (same as pressing its Approve button)."
            },
            {
              "kind": "method",
              "name": "reject",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Reject the current approval step (same as pressing its Reject button)."
            },
            {
              "kind": "method",
              "name": "decide",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "decision",
                  "type": {
                    "text": "ApprovalDecision"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "gotoForm",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "form_name",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "Jump back to a visible form, truncating the history to that point."
            },
            {
              "kind": "method",
              "name": "back",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "gotoStart",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "onFormChange",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "e",
                  "type": {
                    "text": "Event"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "onCommentInput",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "form_name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "value",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "summary_forms",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "WorkflowForm[]"
                }
              },
              "parameters": [
                {
                  "name": "approval",
                  "type": {
                    "text": "WorkflowForm"
                  }
                }
              ],
              "description": "Forms the approval step summarizes: configured list, else every earlier plain form."
            },
            {
              "kind": "method",
              "name": "renderApproval",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "parameters": [
                {
                  "name": "form",
                  "type": {
                    "text": "WorkflowForm"
                  }
                }
              ]
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "validate-gate",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "fieldName": "validateGate"
            },
            {
              "name": "next-label",
              "type": {
                "text": "string | undefined"
              },
              "description": "Label attributes beat the i18n catalog; unset = t('next')/t('submit')/t('back').",
              "fieldName": "nextLabel"
            },
            {
              "name": "submit-label",
              "type": {
                "text": "string | undefined"
              },
              "fieldName": "submitLabel"
            },
            {
              "name": "back-label",
              "type": {
                "text": "string | undefined"
              },
              "fieldName": "backLabel"
            },
            {
              "name": "show-back",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "fieldName": "showBack"
            },
            {
              "name": "show-steps",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Render a <baht-steps> progress indicator above the current form.",
              "fieldName": "showSteps"
            },
            {
              "name": "steps-variant",
              "type": {
                "text": "'default' | 'sidebar'"
              },
              "default": "'default'",
              "description": "'default' horizontal markers, or 'sidebar' vertical nav list — forwarded to <baht-steps>.",
              "fieldName": "stepsVariant"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-workflow",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        },
        {
          "kind": "variable",
          "name": "comment"
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtWorkflow",
          "declaration": {
            "name": "BahtWorkflow",
            "module": "src/components/baht-workflow.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-workflow",
          "declaration": {
            "name": "BahtWorkflow",
            "module": "src/components/baht-workflow.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/base.ts",
      "declarations": [
        {
          "kind": "function",
          "name": "arr",
          "return": {
            "type": {
              "text": "T[]"
            }
          },
          "parameters": [
            {
              "name": "value",
              "type": {
                "text": "T[] | null | undefined"
              }
            }
          ],
          "description": "Runtime guards for rich props. The TS type says `T[]` / `Record`, but hosts assign\nfrom JSON (`el.markers = json.markers`) and JS hosts pass `undefined` freely, so\nevery read goes through here instead of a `?? []` that the type-aware lint would\n(rightly, for TS callers) flag as unnecessary."
        },
        {
          "kind": "function",
          "name": "obj",
          "return": {
            "type": {
              "text": "T | Record<string, never>"
            }
          },
          "parameters": [
            {
              "name": "value",
              "type": {
                "text": "T | null | undefined"
              }
            }
          ]
        },
        {
          "kind": "function",
          "name": "stringOf",
          "return": {
            "type": {
              "text": "string"
            }
          },
          "parameters": [
            {
              "name": "value",
              "type": {
                "text": "unknown"
              }
            }
          ]
        },
        {
          "kind": "function",
          "name": "hasDom",
          "return": {
            "type": {
              "text": "boolean"
            }
          },
          "description": "True when a real DOM is present. Lit's own `isServer` is hard-coded to `true` in its\nnode build, which jsdom/happy-dom test runners also load, so guards that need \"is there\na document to touch\" feature-detect instead: the"
        },
        {
          "kind": "variable",
          "name": "boolOff",
          "type": {
            "text": "object"
          },
          "default": "{ fromAttribute: (value: string | null): boolean => value !== 'false', // null (absent) = default toAttribute: (value: boolean): string | null => (value ? '' : 'false'), }",
          "description": "Attribute converter for booleans that DEFAULT TO TRUE. Lit's own `type: Boolean` reads\n`show-close=\"false\"` as true (presence is all it checks), so a default-true switch could\nnever be turned off from HTML. With this: absent = default, bare = true, `=\"false\"` = false."
        },
        {
          "kind": "variable",
          "name": "SSR_STASH",
          "type": {
            "text": "unique symbol"
          },
          "description": "While a parent hydrates, the hydrate module parks each nested `baht-*` child's server\nmarkup under this key so the parent's hydration walk does not see the child's part\nmarkers. `hasSsrMarkup` treats a parked stash as \"still server-rendered\"."
        },
        {
          "kind": "function",
          "name": "hasSsrMarkup",
          "return": {
            "type": {
              "text": "boolean"
            }
          },
          "parameters": [
            {
              "name": "host",
              "type": {
                "text": "Element"
              }
            }
          ],
          "description": "True while the element's light DOM still holds un-hydrated server-rendered Lit markup."
        },
        {
          "kind": "class",
          "description": "Light-DOM Lit base: consumer CSS reaches every internal node (spec 01 §6).",
          "name": "BahtElement",
          "members": [
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids)."
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary."
            }
          ],
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              }
            }
          ],
          "attributes": [
            {
              "name": "defer-hydration"
            }
          ],
          "superclass": {
            "name": "LitElement",
            "package": "lit"
          },
          "customElement": true
        },
        {
          "kind": "function",
          "name": "adoptLightChildren",
          "return": {
            "type": {
              "text": "void"
            }
          },
          "parameters": [
            {
              "name": "host",
              "type": {
                "text": "HTMLElement"
              }
            },
            {
              "name": "slot",
              "type": {
                "text": "HTMLElement"
              }
            }
          ],
          "description": "Light DOM has no <slot>. Call from firstUpdated() to move author-supplied\nchildren into `slot` — everything that isn't the rendered `root` or a Lit\ncomment marker. (During HTML parsing children can land after\nconnectedCallback fires, so sweeping at first render is the reliable point.)"
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "arr",
          "declaration": {
            "name": "arr",
            "module": "src/components/base.ts"
          }
        },
        {
          "kind": "js",
          "name": "obj",
          "declaration": {
            "name": "obj",
            "module": "src/components/base.ts"
          }
        },
        {
          "kind": "js",
          "name": "stringOf",
          "declaration": {
            "name": "stringOf",
            "module": "src/components/base.ts"
          }
        },
        {
          "kind": "js",
          "name": "hasDom",
          "declaration": {
            "name": "hasDom",
            "module": "src/components/base.ts"
          }
        },
        {
          "kind": "js",
          "name": "boolOff",
          "declaration": {
            "name": "boolOff",
            "module": "src/components/base.ts"
          }
        },
        {
          "kind": "js",
          "name": "SSR_STASH",
          "declaration": {
            "name": "SSR_STASH",
            "module": "src/components/base.ts"
          }
        },
        {
          "kind": "js",
          "name": "hasSsrMarkup",
          "declaration": {
            "name": "hasSsrMarkup",
            "module": "src/components/base.ts"
          }
        },
        {
          "kind": "js",
          "name": "BahtElement",
          "declaration": {
            "name": "BahtElement",
            "module": "src/components/base.ts"
          }
        },
        {
          "kind": "js",
          "name": "adoptLightChildren",
          "declaration": {
            "name": "adoptLightChildren",
            "module": "src/components/base.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/define.ts",
      "declarations": [
        {
          "kind": "function",
          "name": "customElement",
          "parameters": [
            {
              "name": "tag",
              "type": {
                "text": "string"
              }
            }
          ],
          "description": "Lit's `@customElement`, tolerating a tag being defined already. Module\nfederation or a duplicated dependency can load two copies of bank20baht-ui\ninto one page; the second copy keeps the first definition and warns\ninstead of throwing from `customElements.define`."
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "customElement",
          "declaration": {
            "name": "customElement",
            "module": "src/components/define.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "tag",
          "declaration": {
            "name": "cls",
            "module": "src/components/define.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/field-base.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Shared shape of every field primitive: descriptor + value in, `baht-input` out.\nDumb and controlled — never mutates its own `value` prop; the host re-feeds it.\n\n`controlId` carries the base class `uid`: the same field key renders once per repeater\nrow (and can repeat across forms on one page), so key-only ids collide — worst for\nradios, whose shared native `name` merges groups.",
          "name": "BahtFieldBase",
          "members": [
            {
              "kind": "field",
              "name": "defaultDebounce",
              "type": {
                "text": "number"
              },
              "static": true,
              "default": "150",
              "description": "Default trailing debounce (ms) for TYPED edits — text, email, password,\ntextarea, number. Every keystroke otherwise re-runs the host's rules,\nvalidation and dependent-option fetches. Per element: the `debounce`\nproperty/attribute; `<baht-form options.inputDebounce>` sets it for a whole\nform. 0 = emit on every keystroke. Selects, checkboxes, radios, toggles,\ndates and files are never debounced — a pick is one event."
            },
            {
              "kind": "field",
              "name": "field",
              "type": {
                "text": "FieldDescriptor"
              }
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "unknown"
              },
              "default": "null"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "disabled"
            },
            {
              "kind": "field",
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "readonly"
            },
            {
              "kind": "field",
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "required"
            },
            {
              "kind": "field",
              "name": "showOptional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "attribute": "show-optional"
            },
            {
              "kind": "field",
              "name": "error",
              "type": {
                "text": "string | null"
              },
              "default": "null"
            },
            {
              "kind": "field",
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "attribute": "debounce"
            },
            {
              "kind": "field",
              "name": "typed",
              "type": {
                "text": "{ value: unknown; emitted: boolean } | null"
              },
              "privacy": "private",
              "default": "null",
              "description": "The keystrokes not yet (or just) handed to the host. The control keeps\nrendering `typed.value` until the host's `value` moves, so a re-render\nmid-typing (a sibling field changing) can't snap the text back."
            },
            {
              "kind": "field",
              "name": "typedTimer",
              "type": {
                "text": "ReturnType<typeof setTimeout> | undefined"
              },
              "privacy": "private"
            },
            {
              "kind": "field",
              "name": "onFocusOut",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "effectiveDebounce",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "emitTyped",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "A typed edit: emitted after `debounce` ms of quiet (or at once when 0)."
            },
            {
              "kind": "method",
              "name": "flushTyped",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Hand a pending typed edit to the host now (blur, disconnect, host reads). Idempotent."
            },
            {
              "kind": "field",
              "name": "shownValue",
              "type": {
                "text": "unknown"
              },
              "privacy": "protected",
              "description": "What a typed control shows: pending keystrokes win over a stale host value.",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "shownText",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "description": "`shownValue` as control text: `''` for null/undefined, `String()` otherwise.",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "assignedField",
              "type": {
                "text": "FieldDescriptor | undefined"
              },
              "privacy": "protected",
              "description": "`field` as the host may actually have left it: a framework can connect the element\nbefore it binds the descriptor, so internally it is optional until then.",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "emitInput",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Emit the user's edit upward (composed so it crosses any boundary)."
            },
            {
              "kind": "method",
              "name": "renderControl",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              }
            },
            {
              "kind": "field",
              "name": "hasFieldIcon",
              "type": {
                "text": "boolean"
              },
              "privacy": "protected",
              "description": "True when `field.icon` names a real icon — gates both the icon markup\nand the control's icon-padding class, so a typo/removed name never\nleaves the control indented for a glyph that isn't there.",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "renderFieldIcon",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Leading icon for text/currency/textarea/dropdown controls (spec: field.icon)."
            },
            {
              "kind": "method",
              "name": "renderLabel",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              }
            },
            {
              "kind": "method",
              "name": "renderLabelMark",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Required asterisk, or the \"(optional)\" marker when the form asks for it."
            },
            {
              "kind": "field",
              "name": "controlId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "labelId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "errorId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "helpId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "describedBy",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "id list for the control's aria-describedby: error first, then help.",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "invalidAttr",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "'true' while the field is in error, else absent (styles hook on [aria-invalid]).",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "disabled"
            },
            {
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "readonly"
            },
            {
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "required"
            },
            {
              "name": "show-optional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "fieldName": "showOptional"
            },
            {
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "fieldName": "debounce"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtFieldBase",
          "declaration": {
            "name": "BahtFieldBase",
            "module": "src/components/field-base.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/layers.ts",
      "declarations": [
        {
          "kind": "function",
          "name": "pushLayer",
          "return": {
            "type": {
              "text": "void"
            }
          },
          "parameters": [
            {
              "name": "el",
              "type": {
                "text": "HTMLElement"
              }
            }
          ]
        },
        {
          "kind": "function",
          "name": "dropLayer",
          "return": {
            "type": {
              "text": "void"
            }
          },
          "parameters": [
            {
              "name": "el",
              "type": {
                "text": "HTMLElement"
              }
            }
          ]
        },
        {
          "kind": "function",
          "name": "topLayer",
          "return": {
            "type": {
              "text": "HTMLElement | null"
            }
          },
          "description": "The topmost open layer, or `null` when none is open."
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "pushLayer",
          "declaration": {
            "name": "pushLayer",
            "module": "src/components/layers.ts"
          }
        },
        {
          "kind": "js",
          "name": "dropLayer",
          "declaration": {
            "name": "dropLayer",
            "module": "src/components/layers.ts"
          }
        },
        {
          "kind": "js",
          "name": "topLayer",
          "declaration": {
            "name": "topLayer",
            "module": "src/components/layers.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/menu-controller.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "The ARIA menu behind `<baht-menu>` and `<baht-split-button>`: open state, outside click,\nAPG menu-button keyboard (↓/↑/Enter/Space open on the first/last item; ↑ ↓ wrap and skip\ndisabled; Home/End; Escape closes back to the trigger and is marked handled so a surrounding\n`<baht-modal>` stays open; Tab closes), item rendering with shortcut hints, and page-wide\nitem shortcuts (same scoping as `<baht-button shortcut>`).",
          "name": "MenuController",
          "members": [
            {
              "kind": "field",
              "name": "open",
              "type": {
                "text": "boolean"
              },
              "default": "false"
            },
            {
              "kind": "field",
              "name": "mac",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "default": "false"
            },
            {
              "kind": "field",
              "name": "unbinders",
              "type": {
                "text": "(() => void)[]"
              },
              "privacy": "private",
              "default": "[]"
            },
            {
              "kind": "method",
              "name": "hostConnected",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "hostDisconnected",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "rebind",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Re-register item shortcuts — call when `items` changes."
            },
            {
              "kind": "method",
              "name": "unbindAll",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "field",
              "name": "onDocMousedown",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "setOpen",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "open",
                  "type": {
                    "text": "boolean"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "pick",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "item",
                  "type": {
                    "text": "MenuItem"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "enabledButtons",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "HTMLButtonElement[]"
                }
              }
            },
            {
              "kind": "method",
              "name": "openAndFocus",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "Promise<void>"
                }
              },
              "parameters": [
                {
                  "name": "which",
                  "type": {
                    "text": "'first' | 'last'"
                  }
                }
              ]
            },
            {
              "kind": "field",
              "name": "onTriggerClick",
              "readonly": true,
              "description": "Trigger click: keyboard activation (detail 0) lands on the first item, per the APG."
            },
            {
              "kind": "field",
              "name": "onTriggerKeydown",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "onMenuKeydown",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "renderItem",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "parameters": [
                {
                  "name": "item",
                  "type": {
                    "text": "MenuItem"
                  }
                }
              ]
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "MenuController",
          "declaration": {
            "name": "MenuController",
            "module": "src/components/menu-controller.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/motion.ts",
      "declarations": [
        {
          "kind": "function",
          "name": "afterExit",
          "return": {
            "type": {
              "text": "void"
            }
          },
          "parameters": [
            {
              "name": "el",
              "type": {
                "text": "Element"
              }
            },
            {
              "name": "done",
              "type": {
                "text": "() => void"
              }
            }
          ],
          "description": "Call `done` once the CSS animations currently running on `el` (or inside\nit) have finished — or right away when none play: `prefers-reduced-motion`\n(the stylesheet sets `animation: none`), a host without the tokens\nstylesheet, or a DOM without the Web Animations API (happy-dom). Add the\n`--leaving` class BEFORE calling this so the exit keyframes are the ones\nbeing waited on."
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "afterExit",
          "declaration": {
            "name": "afterExit",
            "module": "src/components/motion.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/shortcuts.ts",
      "declarations": [
        {
          "kind": "function",
          "name": "isMacPlatform",
          "return": {
            "type": {
              "text": "boolean"
            }
          },
          "description": "Apple platform (⌘ = `mod`, ⌃⌥⇧⌘ glyphs). Client-only; `false` without a DOM."
        },
        {
          "kind": "function",
          "name": "bindShortcut",
          "return": {
            "type": {
              "text": "() => void"
            }
          },
          "parameters": [
            {
              "name": "host",
              "type": {
                "text": "HTMLElement"
              }
            },
            {
              "name": "spec",
              "type": {
                "text": "string"
              }
            },
            {
              "name": "run",
              "type": {
                "text": "() => void"
              }
            },
            {
              "name": "enabled",
              "default": "() => true",
              "type": {
                "text": "() => boolean"
              }
            }
          ],
          "description": "Bind `spec` for `host`; returns the unbind function. An unparseable spec binds nothing.\nCall from `connectedCallback`/`updated` and unbind on disconnect."
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "isMacPlatform",
          "declaration": {
            "name": "isMacPlatform",
            "module": "src/components/shortcuts.ts"
          }
        },
        {
          "kind": "js",
          "name": "bindShortcut",
          "declaration": {
            "name": "bindShortcut",
            "module": "src/components/shortcuts.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-accordion.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Accordion. `items` drive the panels; `multiple` allows several open at once.\nEmits `baht-toggle { index, open }`.\n\n  el.items = [\n    { title: 'What is a workflow?', content: 'Workflows run when something happens…' },\n    { title: 'Pricing', content: '฿20 / month.', open: true },\n  ];",
          "name": "BahtAccordion",
          "members": [
            {
              "kind": "field",
              "name": "items",
              "type": {
                "text": "AccordionItem[]"
              },
              "default": "[]"
            },
            {
              "kind": "field",
              "name": "multiple",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "multiple"
            },
            {
              "kind": "field",
              "name": "openSet",
              "privacy": "private",
              "default": "new Set<number>()"
            },
            {
              "kind": "field",
              "name": "itemsFingerprint",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "default": "''",
              "description": "Fingerprint of the panel content and open flags — identity-independent, so an equal\nre-fed array doesn't look like a \"new\" set of items."
            },
            {
              "kind": "method",
              "name": "fingerprint",
              "privacy": "private",
              "static": true,
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "items",
                  "type": {
                    "text": "AccordionItem[]"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "toggle",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "index",
                  "type": {
                    "text": "number"
                  }
                }
              ]
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "multiple",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "multiple"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-accordion",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtAccordion",
          "declaration": {
            "name": "BahtAccordion",
            "module": "src/components/primitives/baht-accordion.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-accordion",
          "declaration": {
            "name": "BahtAccordion",
            "module": "src/components/primitives/baht-accordion.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-alert.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Inline alert / callout.\n\n  <baht-alert tone=\"danger\" heading=\"Couldn't reach the webhook\"\n            message=\"Check the URL and try again.\" dismissible></baht-alert>",
          "name": "BahtAlert",
          "members": [
            {
              "kind": "field",
              "name": "tone",
              "type": {
                "text": "'info' | 'success' | 'warning' | 'danger'"
              },
              "default": "'info'",
              "attribute": "tone"
            },
            {
              "kind": "field",
              "name": "heading",
              "type": {
                "text": "string"
              },
              "default": "''",
              "attribute": "heading"
            },
            {
              "kind": "field",
              "name": "message",
              "type": {
                "text": "string"
              },
              "default": "''",
              "attribute": "message"
            },
            {
              "kind": "field",
              "name": "dismissible",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "dismissible"
            },
            {
              "kind": "field",
              "name": "dismissed",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "default": "false"
            },
            {
              "kind": "field",
              "name": "generation",
              "type": {
                "text": "number"
              },
              "privacy": "private",
              "default": "0"
            },
            {
              "kind": "method",
              "name": "dismiss",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "tone",
              "type": {
                "text": "'info' | 'success' | 'warning' | 'danger'"
              },
              "default": "'info'",
              "fieldName": "tone"
            },
            {
              "name": "heading",
              "type": {
                "text": "string"
              },
              "default": "''",
              "fieldName": "heading"
            },
            {
              "name": "message",
              "type": {
                "text": "string"
              },
              "default": "''",
              "fieldName": "message"
            },
            {
              "name": "dismissible",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "dismissible"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-alert",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtAlert",
          "declaration": {
            "name": "BahtAlert",
            "module": "src/components/primitives/baht-alert.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-alert",
          "declaration": {
            "name": "BahtAlert",
            "module": "src/components/primitives/baht-alert.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-avatar.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Small circular identity chip — initials derived from `label`, or an\nexplicit `initials` override.\n\n  <baht-avatar label=\"Pear Nattapong\"></baht-avatar>\n  <baht-avatar initials=\"P\" size=\"sm\"></baht-avatar>",
          "name": "BahtAvatar",
          "members": [
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Full name; initials are derived from it when `initials` isn't set.",
              "attribute": "label"
            },
            {
              "kind": "field",
              "name": "initials",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Explicit override — first 1-2 characters are shown as-is.",
              "attribute": "initials"
            },
            {
              "kind": "field",
              "name": "size",
              "type": {
                "text": "AvatarSize"
              },
              "default": "'md'",
              "attribute": "size"
            },
            {
              "kind": "field",
              "name": "shown",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Full name; initials are derived from it when `initials` isn't set.",
              "fieldName": "label"
            },
            {
              "name": "initials",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Explicit override — first 1-2 characters are shown as-is.",
              "fieldName": "initials"
            },
            {
              "name": "size",
              "type": {
                "text": "AvatarSize"
              },
              "default": "'md'",
              "fieldName": "size"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-avatar",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtAvatar",
          "declaration": {
            "name": "BahtAvatar",
            "module": "src/components/primitives/baht-avatar.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-avatar",
          "declaration": {
            "name": "BahtAvatar",
            "module": "src/components/primitives/baht-avatar.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-badge.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Status pill / tag / counter (20baht badges).\nStatus tones (neutral/success/danger/warning/info) show a colored dot;\ntag tones (outline/solid/gold/inverse/mono) don't.\n\n  <baht-badge tone=\"success\" label=\"Running\"></baht-badge>\n  <baht-badge tone=\"mono\" label=\"฿20 / mo\"></baht-badge>",
          "name": "BahtBadge",
          "members": [
            {
              "kind": "field",
              "name": "tone",
              "type": {
                "text": "BadgeTone"
              },
              "default": "'neutral'",
              "attribute": "tone"
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "attribute": "label"
            },
            {
              "kind": "field",
              "name": "dot",
              "type": {
                "text": "boolean | null"
              },
              "default": "null",
              "description": "Force the dot on/off; defaults to on for status tones."
            },
            {
              "kind": "field",
              "name": "showDot",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "tone",
              "type": {
                "text": "BadgeTone"
              },
              "default": "'neutral'",
              "fieldName": "tone"
            },
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "fieldName": "label"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-badge",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtBadge",
          "declaration": {
            "name": "BahtBadge",
            "module": "src/components/primitives/baht-badge.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-badge",
          "declaration": {
            "name": "BahtBadge",
            "module": "src/components/primitives/baht-badge.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-bar-chart.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "",
          "name": "BahtBarChart",
          "members": [
            {
              "kind": "field",
              "name": "groups",
              "type": {
                "text": "ChartGroup[]"
              },
              "default": "[]",
              "description": "Original API: `{ label, count }[]`, one bar each."
            },
            {
              "kind": "field",
              "name": "series",
              "type": {
                "text": "ChartSeries[]"
              },
              "default": "[]",
              "description": "Series API: one entry per series, one value per category."
            },
            {
              "kind": "field",
              "name": "categories",
              "type": {
                "text": "string[]"
              },
              "default": "[]",
              "description": "Category names, one per value index."
            },
            {
              "kind": "field",
              "name": "orientation",
              "type": {
                "text": "'horizontal' | 'vertical'"
              },
              "default": "'horizontal'",
              "description": "Bars across (default) or columns up.",
              "attribute": "orientation"
            },
            {
              "kind": "field",
              "name": "stacked",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Stack the series inside one band instead of grouping them side by side.",
              "attribute": "stacked"
            },
            {
              "kind": "field",
              "name": "compare",
              "type": {
                "text": "number[]"
              },
              "default": "[]",
              "description": "Previous-period values, drawn as a muted bar under each current bar."
            },
            {
              "kind": "field",
              "name": "compareLabel",
              "type": {
                "text": "string"
              },
              "default": "'Previous period'",
              "description": "Names the muted `compare` bar in the key and the table twin.",
              "attribute": "compare-label"
            },
            {
              "kind": "field",
              "name": "markers",
              "type": {
                "text": "ChartMarker[]"
              },
              "default": "[]",
              "description": "Budget / target lines drawn over the bars."
            },
            {
              "kind": "field",
              "name": "labelValues",
              "type": {
                "text": "'ends' | 'none'"
              },
              "default": "'ends'",
              "description": "`ends` prints the value at the bar tip; `none` leaves it to the tooltip.",
              "attribute": "label-values"
            },
            {
              "kind": "field",
              "name": "emphasis",
              "type": {
                "text": "number | null"
              },
              "default": "null",
              "description": "Index of the series (2+ series) or category (one series) to highlight.",
              "attribute": "emphasis"
            },
            {
              "kind": "field",
              "name": "color",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Single color for every bar; per-series palette otherwise.",
              "attribute": "color"
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Accessible summary used by the vertical (graphics-only) rendering.",
              "attribute": "label"
            },
            {
              "kind": "field",
              "name": "band",
              "type": {
                "text": "number"
              },
              "privacy": "private",
              "default": "0",
              "description": "Measured px per category for the vertical rendering; `0` until the host has\nbeen measured, where the CSS flex fallback (`flex: 1 1 0; min-width: 0`)\nalready keeps the columns inside the host. Measuring lets the element also\nthin the x labels and shrink the bars below the 24px cap, so 31 days fit a\n400px card instead of spilling out of it."
            },
            {
              "kind": "field",
              "name": "resizeObserver",
              "type": {
                "text": "ResizeObserver | undefined"
              },
              "privacy": "private"
            },
            {
              "kind": "method",
              "name": "measure",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Host width → px per category. Never runs on the server (`hasDom` guard)."
            },
            {
              "kind": "field",
              "name": "columnCount",
              "type": {
                "text": "number"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "model",
              "type": {
                "text": "{ series: ChartSeries[]; categories: string[]; legacy: boolean }"
              },
              "privacy": "private",
              "description": "The series actually drawn — `groups` is normalised into one series.",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "colorFor",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "seriesIndex",
                  "type": {
                    "text": "number"
                  }
                },
                {
                  "name": "categoryIndex",
                  "type": {
                    "text": "number"
                  }
                },
                {
                  "name": "multi",
                  "type": {
                    "text": "boolean"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "domainMax",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "number"
                }
              },
              "parameters": [
                {
                  "name": "series",
                  "type": {
                    "text": "ChartSeries[]"
                  }
                },
                {
                  "name": "stacked",
                  "type": {
                    "text": "boolean"
                  }
                },
                {
                  "name": "legacy",
                  "type": {
                    "text": "boolean"
                  }
                }
              ],
              "description": "Largest value a bar can reach: the raw max for `groups`, a clean tick otherwise."
            },
            {
              "kind": "method",
              "name": "tableTwin",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "parameters": [
                {
                  "name": "series",
                  "type": {
                    "text": "ChartSeries[]"
                  }
                },
                {
                  "name": "categories",
                  "type": {
                    "text": "string[]"
                  }
                },
                {
                  "name": "n",
                  "type": {
                    "text": "number"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "markersFor",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "ChartMarker[]"
                }
              },
              "parameters": [
                {
                  "name": "category",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "Markers with no `category` span the chart; the rest ride their own row."
            },
            {
              "kind": "field",
              "name": "chartMarkers",
              "type": {
                "text": "ChartMarker[]"
              },
              "privacy": "private",
              "description": "Markers that apply to every row / column.",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "categoryMarkers",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "ChartMarker[]"
                }
              },
              "parameters": [
                {
                  "name": "category",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "Markers pinned to one category — they ride that row / column, not the chart."
            },
            {
              "kind": "method",
              "name": "markerText",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "m",
                  "type": {
                    "text": "ChartMarker"
                  }
                }
              ],
              "description": "What a marker reads as: its own label, else its formatted value."
            },
            {
              "kind": "method",
              "name": "markerOverlay",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult[]"
                }
              },
              "parameters": [
                {
                  "name": "max",
                  "type": {
                    "text": "number"
                  }
                },
                {
                  "name": "category",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "Marker lines, positioned along the value axis. The label is drawn separately\n(`markerLabels`) as real text — a `title` attribute alone never reaches AT."
            },
            {
              "kind": "method",
              "name": "place",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "{ m: ChartMarker; pct: number }[]"
                }
              },
              "parameters": [
                {
                  "name": "markers",
                  "type": {
                    "text": "ChartMarker[]"
                  }
                },
                {
                  "name": "max",
                  "type": {
                    "text": "number"
                  }
                }
              ],
              "description": "Marker labels, sorted along the axis and thinned so neighbours never collide:\na dropped label keeps its line, and its value still reads in the table twin.\nThinning is scoped to the list it is given — chart-wide markers compete with\neach other, a row's own markers only with that row's."
            },
            {
              "kind": "method",
              "name": "placedMarkers",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "{ m: ChartMarker; pct: number }[]"
                }
              },
              "parameters": [
                {
                  "name": "max",
                  "type": {
                    "text": "number"
                  }
                }
              ],
              "description": "Chart-wide marker labels — the strip above the rows / the end of the line."
            },
            {
              "kind": "method",
              "name": "rowMarkerLabels",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult[]"
                }
              },
              "parameters": [
                {
                  "name": "category",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "max",
                  "type": {
                    "text": "number"
                  }
                }
              ],
              "description": "A row's own marker labels, drawn beside their line inside that row."
            },
            {
              "kind": "method",
              "name": "legendEntries",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "{ label: string; color: string }[]"
                }
              },
              "parameters": [
                {
                  "name": "series",
                  "type": {
                    "text": "ChartSeries[]"
                  }
                }
              ],
              "description": "Legend rows: one per series, plus the muted `compare` key when it is set."
            },
            {
              "kind": "method",
              "name": "renderHorizontal",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "parameters": [
                {
                  "name": "data",
                  "type": {
                    "text": "{\n    series: ChartSeries[];\n    categories: string[];\n    legacy: boolean;\n  }"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "renderVertical",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "parameters": [
                {
                  "name": "data",
                  "type": {
                    "text": "{\n    series: ChartSeries[];\n    categories: string[];\n    legacy: boolean;\n  }"
                  }
                }
              ]
            },
            {
              "kind": "field",
              "name": "emptyMessage",
              "type": {
                "text": "string"
              },
              "default": "'No data to chart'",
              "description": "Shown instead of the marks when there is nothing to plot.",
              "attribute": "empty-message",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "field",
              "name": "loading",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Hold the previous render at reduced opacity while new data loads.",
              "attribute": "loading",
              "reflects": true,
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "field",
              "name": "showTable",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "description": "Render the \"View as table\" twin under the chart.",
              "attribute": "show-table",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "field",
              "name": "format",
              "type": {
                "text": "ChartFormat"
              },
              "default": "'number'",
              "description": "How values are rendered in labels, ticks, tooltips and the table twin.",
              "attribute": "format",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "field",
              "name": "currency",
              "type": {
                "text": "string"
              },
              "default": "'THB'",
              "description": "ISO currency code for `format=\"currency\"` (THB renders `฿`).",
              "attribute": "currency",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "field",
              "name": "tipEl",
              "type": {
                "text": "HTMLElement | undefined"
              },
              "privacy": "private",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "field",
              "name": "held",
              "type": {
                "text": "unknown"
              },
              "privacy": "private",
              "default": "null",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "fmt",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "number"
                  }
                }
              ],
              "description": "Value → display text using this chart's `format` / `currency`.",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "hold",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "T"
                }
              },
              "parameters": [
                {
                  "name": "next",
                  "type": {
                    "text": "T"
                  }
                }
              ],
              "description": "The snapshot to draw. While `loading` is set the previous one is returned,\nso a refetch dims the chart instead of emptying it.",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "rootClass",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "extra",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "Root class list: `baht-chart` plus the loading modifier.",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderTooltip",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "description": "The single floating tooltip node; rendered by the template, never appended.",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "showTip",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "event",
                  "type": {
                    "text": "Event"
                  }
                },
                {
                  "name": "text",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "Show `text` near the pointer (or, on keyboard focus, near the mark).\nContent is assigned with `textContent`: category and series names are\nuntrusted data (interaction.md).",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "hideTip",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Hide the tooltip (pointerleave / blur).",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderEmpty",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "description": "The empty placeholder, or `nothing` when there is data.",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLegend",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "parameters": [
                {
                  "name": "entries",
                  "type": {
                    "text": "{ label: string; color: string; value?: string; share?: string }[]"
                  }
                },
                {
                  "name": "kind",
                  "default": "'rect'",
                  "type": {
                    "text": "'rect' | 'line'"
                  }
                }
              ],
              "description": "Legend rows — only ever rendered for 2+ series (marks-and-anatomy.md).",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "orientation",
              "type": {
                "text": "'horizontal' | 'vertical'"
              },
              "default": "'horizontal'",
              "description": "Bars across (default) or columns up.",
              "fieldName": "orientation"
            },
            {
              "name": "stacked",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Stack the series inside one band instead of grouping them side by side.",
              "fieldName": "stacked"
            },
            {
              "name": "compare-label",
              "type": {
                "text": "string"
              },
              "default": "'Previous period'",
              "description": "Names the muted `compare` bar in the key and the table twin.",
              "fieldName": "compareLabel"
            },
            {
              "name": "label-values",
              "type": {
                "text": "'ends' | 'none'"
              },
              "default": "'ends'",
              "description": "`ends` prints the value at the bar tip; `none` leaves it to the tooltip.",
              "fieldName": "labelValues"
            },
            {
              "name": "emphasis",
              "type": {
                "text": "number | null"
              },
              "default": "null",
              "description": "Index of the series (2+ series) or category (one series) to highlight.",
              "fieldName": "emphasis"
            },
            {
              "name": "color",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Single color for every bar; per-series palette otherwise.",
              "fieldName": "color"
            },
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Accessible summary used by the vertical (graphics-only) rendering.",
              "fieldName": "label"
            },
            {
              "name": "empty-message",
              "type": {
                "text": "string"
              },
              "default": "'No data to chart'",
              "description": "Shown instead of the marks when there is nothing to plot.",
              "fieldName": "emptyMessage",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "name": "loading",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Hold the previous render at reduced opacity while new data loads.",
              "fieldName": "loading",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "name": "show-table",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "description": "Render the \"View as table\" twin under the chart.",
              "fieldName": "showTable",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "name": "format",
              "type": {
                "text": "ChartFormat"
              },
              "default": "'number'",
              "description": "How values are rendered in labels, ticks, tooltips and the table twin.",
              "fieldName": "format",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "name": "currency",
              "type": {
                "text": "string"
              },
              "default": "'THB'",
              "description": "ISO currency code for `format=\"currency\"` (THB renders `฿`).",
              "fieldName": "currency",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtChartBase",
            "module": "/src/components/primitives/charts.js"
          },
          "tagName": "baht-bar-chart",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtBarChart",
          "declaration": {
            "name": "BahtBarChart",
            "module": "src/components/primitives/baht-bar-chart.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-bar-chart",
          "declaration": {
            "name": "BahtBarChart",
            "module": "src/components/primitives/baht-bar-chart.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-breadcrumbs.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Breadcrumb trail. Last item renders as the current page (no link). Items\nwithout `href` emit `baht-navigate { item, index }` for router-driven apps.\n\n  el.items = [\n    { label: 'Workflows', href: '/workflows' },\n    { label: 'Signup', href: '/workflows/signup' },\n    { label: 'Run #812' },\n  ];",
          "name": "BahtBreadcrumbs",
          "members": [
            {
              "kind": "field",
              "name": "items",
              "type": {
                "text": "Crumb[]"
              },
              "default": "[]"
            },
            {
              "kind": "field",
              "name": "separator",
              "type": {
                "text": "string"
              },
              "default": "'›'",
              "attribute": "separator"
            },
            {
              "kind": "method",
              "name": "navigate",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "item",
                  "type": {
                    "text": "Crumb"
                  }
                },
                {
                  "name": "index",
                  "type": {
                    "text": "number"
                  }
                }
              ]
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "separator",
              "type": {
                "text": "string"
              },
              "default": "'›'",
              "fieldName": "separator"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-breadcrumbs",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtBreadcrumbs",
          "declaration": {
            "name": "BahtBreadcrumbs",
            "module": "src/components/primitives/baht-breadcrumbs.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-breadcrumbs",
          "declaration": {
            "name": "BahtBreadcrumbs",
            "module": "src/components/primitives/baht-breadcrumbs.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-button.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Design-system button (20baht: no scale, no shadow change — color does the work).\nStandalone primitive: children become the label, listen for the native `click`.\n(Light DOM has no <slot>, so the initial children are moved into the button.)\n\n  <baht-button variant=\"danger\" size=\"sm\">Delete</baht-button>\n  <baht-button label=\"Save workflow\"></baht-button>\n  <baht-button icon=\"copy\" variant=\"ghost\" size=\"sm\">Copy</baht-button>\n  <baht-button icon=\"close\" icon-only label=\"Close\"></baht-button>  <!-- label = a11y name -->\n  <baht-button aria-label=\"Previous month\">‹</baht-button>  <!-- glyph child, host aria-label wins -->\n  <baht-button variant=\"secondary\" shortcut=\"alt+q\">Close</baht-button>  <!-- ⌥Q / Alt+Q -->\n\n`shortcut` binds a document-wide key combo that clicks the button (NOTES 2026-10-31):\nhover/focus shows a tooltip with the label and the keys (`⌥Q` on Mac, `Alt+Q`\nelsewhere) and the inner button gets `aria-keyshortcuts`. Disabled buttons, buttons\noutside the topmost open `<baht-modal>`, and modifier-less combos while typing in a\nfield never fire.",
          "name": "BahtButton",
          "members": [
            {
              "kind": "field",
              "name": "variant",
              "type": {
                "text": "ButtonVariant"
              },
              "default": "'primary'",
              "attribute": "variant"
            },
            {
              "kind": "field",
              "name": "size",
              "type": {
                "text": "ButtonSize"
              },
              "default": "'md'",
              "attribute": "size"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "disabled"
            },
            {
              "kind": "field",
              "name": "type",
              "type": {
                "text": "'button' | 'submit'"
              },
              "default": "'button'",
              "description": "Forwarded to the native button — 'button' (default) or 'submit'.",
              "attribute": "type"
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Alternative to children for setting the label programmatically.",
              "attribute": "label"
            },
            {
              "kind": "field",
              "name": "icon",
              "type": {
                "text": "IconName | ''"
              },
              "default": "''",
              "description": "Optional leading icon from the curated set (copy/check/download/…).",
              "attribute": "icon"
            },
            {
              "kind": "field",
              "name": "iconOnly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Square icon-only button. Requires `label` for the accessible name.",
              "attribute": "icon-only"
            },
            {
              "kind": "field",
              "name": "hostAriaLabel",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "A host `aria-label` never reaches assistive tech on its own — light DOM has no\nimplicit ARIA relationship between a custom element and its rendered children, so an\n`aria-label` written on `<baht-button>` stays on the host and the inner native\n`<button>` keeps whatever text (or none) is inside it. Mirroring the attribute into\nthis property forwards it to the inner button's `aria-label`, taking priority over\n`label`/icon-only fallback — this is how a glyph-only child (e.g. `‹`) gets a real\naccessible name without `icon-only`. Mapped to the plain `aria-label` attribute so\nhosts write it the way they naturally would; kept off the `ariaLabel` IDL accessor to\navoid shadowing the platform's own ARIAMixin.",
              "attribute": "aria-label"
            },
            {
              "kind": "field",
              "name": "shortcut",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Keyboard shortcut that clicks this button from anywhere on the page, e.g. `alt+q`,\n`shift+alt+s`, `mod+enter` (`mod` = ⌘ on Mac, Ctrl elsewhere). Also shown in a\nhover/focus tooltip and announced through `aria-keyshortcuts`.",
              "attribute": "shortcut",
              "reflects": true
            },
            {
              "kind": "field",
              "name": "tooltipPosition",
              "type": {
                "text": "'top' | 'bottom'"
              },
              "default": "'bottom'",
              "description": "Where the shortcut tooltip sits.",
              "attribute": "tooltip-position"
            },
            {
              "kind": "field",
              "name": "buttonEl",
              "type": {
                "text": "HTMLButtonElement"
              },
              "privacy": "private"
            },
            {
              "kind": "field",
              "name": "mac",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "default": "false"
            },
            {
              "kind": "field",
              "name": "childText",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "default": "''"
            },
            {
              "kind": "field",
              "name": "tipDismissed",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "default": "false"
            },
            {
              "kind": "field",
              "name": "unbind",
              "type": {
                "text": "(() => void) | null"
              },
              "privacy": "private",
              "default": "null"
            },
            {
              "kind": "method",
              "name": "rebind",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "renderTip",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              }
            },
            {
              "kind": "field",
              "name": "dismissTip",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "rearmTip",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "variant",
              "type": {
                "text": "ButtonVariant"
              },
              "default": "'primary'",
              "fieldName": "variant"
            },
            {
              "name": "size",
              "type": {
                "text": "ButtonSize"
              },
              "default": "'md'",
              "fieldName": "size"
            },
            {
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "disabled"
            },
            {
              "name": "type",
              "type": {
                "text": "'button' | 'submit'"
              },
              "default": "'button'",
              "description": "Forwarded to the native button — 'button' (default) or 'submit'.",
              "fieldName": "type"
            },
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Alternative to children for setting the label programmatically.",
              "fieldName": "label"
            },
            {
              "name": "icon",
              "type": {
                "text": "IconName | ''"
              },
              "default": "''",
              "description": "Optional leading icon from the curated set (copy/check/download/…).",
              "fieldName": "icon"
            },
            {
              "name": "icon-only",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Square icon-only button. Requires `label` for the accessible name.",
              "fieldName": "iconOnly"
            },
            {
              "name": "aria-label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "A host `aria-label` never reaches assistive tech on its own — light DOM has no\nimplicit ARIA relationship between a custom element and its rendered children, so an\n`aria-label` written on `<baht-button>` stays on the host and the inner native\n`<button>` keeps whatever text (or none) is inside it. Mirroring the attribute into\nthis property forwards it to the inner button's `aria-label`, taking priority over\n`label`/icon-only fallback — this is how a glyph-only child (e.g. `‹`) gets a real\naccessible name without `icon-only`. Mapped to the plain `aria-label` attribute so\nhosts write it the way they naturally would; kept off the `ariaLabel` IDL accessor to\navoid shadowing the platform's own ARIAMixin.",
              "fieldName": "hostAriaLabel"
            },
            {
              "name": "shortcut",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Keyboard shortcut that clicks this button from anywhere on the page, e.g. `alt+q`,\n`shift+alt+s`, `mod+enter` (`mod` = ⌘ on Mac, Ctrl elsewhere). Also shown in a\nhover/focus tooltip and announced through `aria-keyshortcuts`.",
              "fieldName": "shortcut"
            },
            {
              "name": "tooltip-position",
              "type": {
                "text": "'top' | 'bottom'"
              },
              "default": "'bottom'",
              "description": "Where the shortcut tooltip sits.",
              "fieldName": "tooltipPosition"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-button",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtButton",
          "declaration": {
            "name": "BahtButton",
            "module": "src/components/primitives/baht-button.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-button",
          "declaration": {
            "name": "BahtButton",
            "module": "src/components/primitives/baht-button.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-card.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Surface card (20baht: white on cream, 1px border, no shadow at rest — the\nborder carries the separation). Children become the body.\n\n  <baht-card heading=\"Runs\" subtitle=\"Last 30 days\">…content…</baht-card>\n  <baht-card hero>…large feature card (20px radius)…</baht-card>",
          "name": "BahtCard",
          "members": [
            {
              "kind": "field",
              "name": "heading",
              "type": {
                "text": "string"
              },
              "default": "''",
              "attribute": "heading"
            },
            {
              "kind": "field",
              "name": "subtitle",
              "type": {
                "text": "string"
              },
              "default": "''",
              "attribute": "subtitle"
            },
            {
              "kind": "field",
              "name": "hero",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "hero = 20px radius + roomier padding (large/feature cards).",
              "attribute": "hero"
            },
            {
              "kind": "field",
              "name": "bodyEl",
              "type": {
                "text": "HTMLElement"
              },
              "privacy": "private"
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "heading",
              "type": {
                "text": "string"
              },
              "default": "''",
              "fieldName": "heading"
            },
            {
              "name": "subtitle",
              "type": {
                "text": "string"
              },
              "default": "''",
              "fieldName": "subtitle"
            },
            {
              "name": "hero",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "hero = 20px radius + roomier padding (large/feature cards).",
              "fieldName": "hero"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-card",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtCard",
          "declaration": {
            "name": "BahtCard",
            "module": "src/components/primitives/baht-card.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-card",
          "declaration": {
            "name": "BahtCard",
            "module": "src/components/primitives/baht-card.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-checkbox.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "",
          "name": "BahtCheckbox",
          "members": [
            {
              "kind": "method",
              "name": "renderLabel",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "typeof nothing"
                }
              },
              "description": "Label sits beside the box, so suppress the block label.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderControl",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "defaultDebounce",
              "type": {
                "text": "number"
              },
              "static": true,
              "default": "150",
              "description": "Default trailing debounce (ms) for TYPED edits — text, email, password,\ntextarea, number. Every keystroke otherwise re-runs the host's rules,\nvalidation and dependent-option fetches. Per element: the `debounce`\nproperty/attribute; `<baht-form options.inputDebounce>` sets it for a whole\nform. 0 = emit on every keystroke. Selects, checkboxes, radios, toggles,\ndates and files are never debounced — a pick is one event.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "field",
              "type": {
                "text": "FieldDescriptor"
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "unknown"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "showOptional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "attribute": "show-optional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "error",
              "type": {
                "text": "string | null"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "attribute": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typed",
              "type": {
                "text": "{ value: unknown; emitted: boolean } | null"
              },
              "privacy": "private",
              "default": "null",
              "description": "The keystrokes not yet (or just) handed to the host. The control keeps\nrendering `typed.value` until the host's `value` moves, so a re-render\nmid-typing (a sibling field changing) can't snap the text back.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typedTimer",
              "type": {
                "text": "ReturnType<typeof setTimeout> | undefined"
              },
              "privacy": "private",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "onFocusOut",
              "privacy": "private",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "effectiveDebounce",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitTyped",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "A typed edit: emitted after `debounce` ms of quiet (or at once when 0).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "flushTyped",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Hand a pending typed edit to the host now (blur, disconnect, host reads). Idempotent.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownValue",
              "type": {
                "text": "unknown"
              },
              "privacy": "protected",
              "description": "What a typed control shows: pending keystrokes win over a stale host value.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownText",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "description": "`shownValue` as control text: `''` for null/undefined, `String()` otherwise.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "assignedField",
              "type": {
                "text": "FieldDescriptor | undefined"
              },
              "privacy": "protected",
              "description": "`field` as the host may actually have left it: a framework can connect the element\nbefore it binds the descriptor, so internally it is optional until then.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitInput",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Emit the user's edit upward (composed so it crosses any boundary).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "hasFieldIcon",
              "type": {
                "text": "boolean"
              },
              "privacy": "protected",
              "description": "True when `field.icon` names a real icon — gates both the icon markup\nand the control's icon-padding class, so a typo/removed name never\nleaves the control indented for a glyph that isn't there.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderFieldIcon",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Leading icon for text/currency/textarea/dropdown controls (spec: field.icon).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabelMark",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Required asterisk, or the \"(optional)\" marker when the form asks for it.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "controlId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "labelId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "errorId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "helpId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "describedBy",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "id list for the control's aria-describedby: error first, then help.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "invalidAttr",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "'true' while the field is in error, else absent (styles hook on [aria-invalid]).",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtFieldBase",
            "module": "/src/components/field-base.js"
          },
          "tagName": "baht-checkbox",
          "customElement": true,
          "attributes": [
            {
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "show-optional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "fieldName": "showOptional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "fieldName": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtCheckbox",
          "declaration": {
            "name": "BahtCheckbox",
            "module": "src/components/primitives/baht-checkbox.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-checkbox",
          "declaration": {
            "name": "BahtCheckbox",
            "module": "src/components/primitives/baht-checkbox.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-code.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Monospace code (20baht): an inline chip or a block. Content is the light-DOM\nchildren (or the `code` property). Not a syntax highlighter — just the\ndesign-system's canonical way to show code/identifiers/tokens.\n\n  <baht-code>baht-button</baht-code>\n  <baht-code variant=\"block\">npm i bank20baht-ui</baht-code>",
          "name": "BahtCode",
          "members": [
            {
              "kind": "field",
              "name": "variant",
              "type": {
                "text": "CodeVariant"
              },
              "default": "'inline'",
              "attribute": "variant"
            },
            {
              "kind": "field",
              "name": "code",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Alternative to children for setting the code text programmatically.",
              "attribute": "code"
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "variant",
              "type": {
                "text": "CodeVariant"
              },
              "default": "'inline'",
              "fieldName": "variant"
            },
            {
              "name": "code",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Alternative to children for setting the code text programmatically.",
              "fieldName": "code"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-code",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtCode",
          "declaration": {
            "name": "BahtCode",
            "module": "src/components/primitives/baht-code.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-code",
          "declaration": {
            "name": "BahtCode",
            "module": "src/components/primitives/baht-code.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-comments.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "A conversation on a record: the thread, oldest first, and a composer. With\n`allow-internal` the composer offers \"internal note\" next to a normal\ncomment (ServiceNow's work notes vs additional comments). Submitting emits\n`baht-submit` with `{ body, internal }` and clears the box; the host stores\nit and feeds the new `entries` back.\n\n  <baht-comments allow-internal></baht-comments>\n  el.entries = [{ id: 1, author: 'Bob', time: '14:44', body: 'Still broken' }];",
          "name": "BahtComments",
          "members": [
            {
              "kind": "field",
              "name": "entries",
              "type": {
                "text": "CommentEntry[]"
              },
              "default": "[]"
            },
            {
              "kind": "field",
              "name": "allowInternal",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "allow-internal"
            },
            {
              "kind": "field",
              "name": "placeholder",
              "type": {
                "text": "string"
              },
              "default": "'Add a comment…'",
              "attribute": "placeholder"
            },
            {
              "kind": "field",
              "name": "internalLabel",
              "type": {
                "text": "string"
              },
              "default": "'Internal note'",
              "attribute": "internal-label"
            },
            {
              "kind": "field",
              "name": "emptyMessage",
              "type": {
                "text": "string"
              },
              "default": "'No comments yet.'",
              "attribute": "empty-message"
            },
            {
              "kind": "field",
              "name": "busy",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "busy"
            },
            {
              "kind": "field",
              "name": "draft",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "default": "''"
            },
            {
              "kind": "field",
              "name": "internal",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "default": "false"
            },
            {
              "kind": "field",
              "name": "onInternal",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "onDraft",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "onKeydown",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "onPost",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "submit",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "allow-internal",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "allowInternal"
            },
            {
              "name": "placeholder",
              "type": {
                "text": "string"
              },
              "default": "'Add a comment…'",
              "fieldName": "placeholder"
            },
            {
              "name": "internal-label",
              "type": {
                "text": "string"
              },
              "default": "'Internal note'",
              "fieldName": "internalLabel"
            },
            {
              "name": "empty-message",
              "type": {
                "text": "string"
              },
              "default": "'No comments yet.'",
              "fieldName": "emptyMessage"
            },
            {
              "name": "busy",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "busy"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-comments",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtComments",
          "declaration": {
            "name": "BahtComments",
            "module": "src/components/primitives/baht-comments.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-comments",
          "declaration": {
            "name": "BahtComments",
            "module": "src/components/primitives/baht-comments.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-currency.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Money input: plain digits while typing, thousands-separated on blur.\nReformatting every keystroke fights the caret and recomputes on every key\nfor no reason — so the separator only appears once the field is quiet.\nEmits a plain `number | null`, same as `number` (spec 01 §2).",
          "name": "BahtCurrency",
          "members": [
            {
              "kind": "field",
              "name": "focused",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "default": "false"
            },
            {
              "kind": "method",
              "name": "displayFor",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "renderControl",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "defaultDebounce",
              "type": {
                "text": "number"
              },
              "static": true,
              "default": "150",
              "description": "Default trailing debounce (ms) for TYPED edits — text, email, password,\ntextarea, number. Every keystroke otherwise re-runs the host's rules,\nvalidation and dependent-option fetches. Per element: the `debounce`\nproperty/attribute; `<baht-form options.inputDebounce>` sets it for a whole\nform. 0 = emit on every keystroke. Selects, checkboxes, radios, toggles,\ndates and files are never debounced — a pick is one event.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "field",
              "type": {
                "text": "FieldDescriptor"
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "unknown"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "showOptional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "attribute": "show-optional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "error",
              "type": {
                "text": "string | null"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "attribute": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typed",
              "type": {
                "text": "{ value: unknown; emitted: boolean } | null"
              },
              "privacy": "private",
              "default": "null",
              "description": "The keystrokes not yet (or just) handed to the host. The control keeps\nrendering `typed.value` until the host's `value` moves, so a re-render\nmid-typing (a sibling field changing) can't snap the text back.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typedTimer",
              "type": {
                "text": "ReturnType<typeof setTimeout> | undefined"
              },
              "privacy": "private",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "onFocusOut",
              "privacy": "private",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "effectiveDebounce",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitTyped",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "A typed edit: emitted after `debounce` ms of quiet (or at once when 0).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "flushTyped",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Hand a pending typed edit to the host now (blur, disconnect, host reads). Idempotent.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownValue",
              "type": {
                "text": "unknown"
              },
              "privacy": "protected",
              "description": "What a typed control shows: pending keystrokes win over a stale host value.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownText",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "description": "`shownValue` as control text: `''` for null/undefined, `String()` otherwise.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "assignedField",
              "type": {
                "text": "FieldDescriptor | undefined"
              },
              "privacy": "protected",
              "description": "`field` as the host may actually have left it: a framework can connect the element\nbefore it binds the descriptor, so internally it is optional until then.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitInput",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Emit the user's edit upward (composed so it crosses any boundary).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "hasFieldIcon",
              "type": {
                "text": "boolean"
              },
              "privacy": "protected",
              "description": "True when `field.icon` names a real icon — gates both the icon markup\nand the control's icon-padding class, so a typo/removed name never\nleaves the control indented for a glyph that isn't there.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderFieldIcon",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Leading icon for text/currency/textarea/dropdown controls (spec: field.icon).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabel",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabelMark",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Required asterisk, or the \"(optional)\" marker when the form asks for it.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "controlId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "labelId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "errorId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "helpId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "describedBy",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "id list for the control's aria-describedby: error first, then help.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "invalidAttr",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "'true' while the field is in error, else absent (styles hook on [aria-invalid]).",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtFieldBase",
            "module": "/src/components/field-base.js"
          },
          "tagName": "baht-currency",
          "customElement": true,
          "attributes": [
            {
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "show-optional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "fieldName": "showOptional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "fieldName": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtCurrency",
          "declaration": {
            "name": "BahtCurrency",
            "module": "src/components/primitives/baht-currency.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-currency",
          "declaration": {
            "name": "BahtCurrency",
            "module": "src/components/primitives/baht-currency.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-datepicker.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Calendar field on top of flatpickr. The VALUE is always ISO `yyyy-mm-dd`\nregardless of `field.date_format` (display only):\n  - `date_mode: 'single'` (default) -> `string | null`\n  - `date_mode: 'range'`            -> `[start, end] | null` (inclusive)\n  - `date_mode: 'multiple'`         -> `string[]`\n`min` / `max` bound the calendar; `disabled_dates` (ISO days or `a/b`\nintervals) and `disabled_weekdays` (0 = Sun … 6 = Sat) grey days out — and\nthe engine re-checks them on validate, so the calendar is UX, not the gate.\n\nThe calendar renders INSIDE the element (flatpickr `static`), so it lives in\nlight DOM like every other node and picks up a theme set on any ancestor.\nGive a clipping ancestor (`overflow: hidden`) room, or it hides the popup.\n\nA footer under the grid carries **Today** (picks today — greyed out when\nmin/max/disabled rules exclude it) and **Clear** (empties the value). With\n`field.enable_time` the first button reads **Now** (i18n key `now`) and picks\ntoday at the current time, to the minute (seconds dropped), under the same\nmin/max/disabled rules; like Today it closes the calendar. Both\n`await el.updateComplete` resolves only once the calendar is attached (the\nlazy flatpickr load is folded into it), so hosts and tests need no extra wait.\nToday / Clear go through flatpickr, so they emit exactly like a click on a day. `disableMobile`\nkeeps this calendar on phones too — never the OS date wheel.",
          "name": "BahtDatepicker",
          "members": [
            {
              "kind": "field",
              "name": "fp",
              "type": {
                "text": "FlatpickrInstance | undefined"
              },
              "privacy": "private"
            },
            {
              "kind": "field",
              "name": "lastEmitted",
              "type": {
                "text": "Date[] | null"
              },
              "privacy": "private",
              "default": "null",
              "description": "What we last told the host. A controlled host re-feeds `value` after the\nevent, but a slow (or absent) re-feed must not make onClose re-emit the\npick onChange already sent — compare against this until `value` catches up."
            },
            {
              "kind": "field",
              "name": "todayBtn",
              "type": {
                "text": "HTMLButtonElement | undefined"
              },
              "privacy": "private"
            },
            {
              "kind": "field",
              "name": "clearBtn",
              "type": {
                "text": "HTMLButtonElement | undefined"
              },
              "privacy": "private"
            },
            {
              "kind": "field",
              "name": "pendingLoad",
              "type": {
                "text": "Promise<unknown> | undefined"
              },
              "privacy": "private",
              "description": "In-flight flatpickr load that this element is waiting on (first mount per page)."
            },
            {
              "kind": "method",
              "name": "getUpdateComplete",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "Promise<boolean>"
                }
              }
            },
            {
              "kind": "method",
              "name": "renderControl",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "teardown",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "syncValue",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Push the host-fed `value` into the calendar without echoing an event."
            },
            {
              "kind": "method",
              "name": "sameInstants",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "boolean"
                }
              },
              "parameters": [
                {
                  "name": "a",
                  "type": {
                    "text": "Date[]"
                  }
                },
                {
                  "name": "b",
                  "type": {
                    "text": "Date[]"
                  }
                }
              ],
              "description": "Value-equality for the picker's own selection (minute-precise with `enable_time`)."
            },
            {
              "kind": "method",
              "name": "options",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "FlatpickrOptions"
                }
              }
            },
            {
              "kind": "method",
              "name": "mountFooter",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "fp",
                  "type": {
                    "text": "FlatpickrInstance"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "refreshFooter",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "fp",
                  "default": "this.fp",
                  "type": {
                    "text": "FlatpickrInstance | undefined"
                  }
                }
              ],
              "description": "Today greys out when the rules exclude it; Clear when there is nothing to clear.\n`fp` is passed explicitly from onReady — it fires inside the flatpickr()\ncall, before `this.fp` is assigned."
            },
            {
              "kind": "method",
              "name": "todayAllowed",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "boolean"
                }
              }
            },
            {
              "kind": "method",
              "name": "pickToday",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "emitIfChanged",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "dates",
                  "type": {
                    "text": "Date[]"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "datesOf",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "Date[]"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Host value (any mode) -> the Date list flatpickr works with. A bare\nday is accepted even with `enable_time` on (defaults to midnight) -\na host may not always have a time to feed back (an edited record that\npredates this field, for one)."
            },
            {
              "kind": "method",
              "name": "toValue",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "unknown"
                }
              },
              "parameters": [
                {
                  "name": "dates",
                  "type": {
                    "text": "Date[]"
                  }
                }
              ],
              "description": "flatpickr's selection -> the value shape of the field's mode."
            },
            {
              "kind": "field",
              "name": "defaultDebounce",
              "type": {
                "text": "number"
              },
              "static": true,
              "default": "150",
              "description": "Default trailing debounce (ms) for TYPED edits — text, email, password,\ntextarea, number. Every keystroke otherwise re-runs the host's rules,\nvalidation and dependent-option fetches. Per element: the `debounce`\nproperty/attribute; `<baht-form options.inputDebounce>` sets it for a whole\nform. 0 = emit on every keystroke. Selects, checkboxes, radios, toggles,\ndates and files are never debounced — a pick is one event.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "field",
              "type": {
                "text": "FieldDescriptor"
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "unknown"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "showOptional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "attribute": "show-optional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "error",
              "type": {
                "text": "string | null"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "attribute": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typed",
              "type": {
                "text": "{ value: unknown; emitted: boolean } | null"
              },
              "privacy": "private",
              "default": "null",
              "description": "The keystrokes not yet (or just) handed to the host. The control keeps\nrendering `typed.value` until the host's `value` moves, so a re-render\nmid-typing (a sibling field changing) can't snap the text back.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typedTimer",
              "type": {
                "text": "ReturnType<typeof setTimeout> | undefined"
              },
              "privacy": "private",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "onFocusOut",
              "privacy": "private",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "effectiveDebounce",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitTyped",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "A typed edit: emitted after `debounce` ms of quiet (or at once when 0).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "flushTyped",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Hand a pending typed edit to the host now (blur, disconnect, host reads). Idempotent.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownValue",
              "type": {
                "text": "unknown"
              },
              "privacy": "protected",
              "description": "What a typed control shows: pending keystrokes win over a stale host value.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownText",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "description": "`shownValue` as control text: `''` for null/undefined, `String()` otherwise.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "assignedField",
              "type": {
                "text": "FieldDescriptor | undefined"
              },
              "privacy": "protected",
              "description": "`field` as the host may actually have left it: a framework can connect the element\nbefore it binds the descriptor, so internally it is optional until then.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitInput",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Emit the user's edit upward (composed so it crosses any boundary).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "hasFieldIcon",
              "type": {
                "text": "boolean"
              },
              "privacy": "protected",
              "description": "True when `field.icon` names a real icon — gates both the icon markup\nand the control's icon-padding class, so a typo/removed name never\nleaves the control indented for a glyph that isn't there.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderFieldIcon",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Leading icon for text/currency/textarea/dropdown controls (spec: field.icon).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabel",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabelMark",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Required asterisk, or the \"(optional)\" marker when the form asks for it.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "controlId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "labelId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "errorId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "helpId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "describedBy",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "id list for the control's aria-describedby: error first, then help.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "invalidAttr",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "'true' while the field is in error, else absent (styles hook on [aria-invalid]).",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtFieldBase",
            "module": "/src/components/field-base.js"
          },
          "tagName": "baht-datepicker",
          "customElement": true,
          "attributes": [
            {
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "show-optional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "fieldName": "showOptional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "fieldName": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtDatepicker",
          "declaration": {
            "name": "BahtDatepicker",
            "module": "src/components/primitives/baht-datepicker.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-datepicker",
          "declaration": {
            "name": "BahtDatepicker",
            "module": "src/components/primitives/baht-datepicker.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-donut-chart.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Pure-SVG donut with a legend that carries value and share.\n\n  const el = document.createElement('baht-donut-chart');\n  el.groups = [{ label: 'Open', count: 4 }, { label: 'Closed', count: 9 }];\n\n`total` defaults to the group sum; set it when the center number differs\n(e.g. records vs. groups). Segments are separated by a 2px gap that shows the\nsurface through, never by a stroke drawn around them.",
          "name": "BahtDonutChart",
          "members": [
            {
              "kind": "field",
              "name": "groups",
              "type": {
                "text": "ChartGroup[]"
              },
              "default": "[]"
            },
            {
              "kind": "field",
              "name": "total",
              "type": {
                "text": "number | null"
              },
              "default": "null",
              "attribute": "total"
            },
            {
              "kind": "field",
              "name": "color",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Single-series color override (first segment).",
              "attribute": "color"
            },
            {
              "kind": "field",
              "name": "centerLabel",
              "type": {
                "text": "string"
              },
              "default": "'records'",
              "attribute": "center-label"
            },
            {
              "kind": "field",
              "name": "otherLabel",
              "type": {
                "text": "string"
              },
              "default": "'Other'",
              "description": "Label of the folded tail bucket.",
              "attribute": "other-label"
            },
            {
              "kind": "field",
              "name": "R",
              "type": {
                "text": "number"
              },
              "privacy": "private",
              "static": true,
              "readonly": true,
              "default": "54"
            },
            {
              "kind": "field",
              "name": "GAP",
              "type": {
                "text": "number"
              },
              "privacy": "private",
              "static": true,
              "readonly": true,
              "default": "2"
            },
            {
              "kind": "field",
              "name": "emptyMessage",
              "type": {
                "text": "string"
              },
              "default": "'No data to chart'",
              "description": "Shown instead of the marks when there is nothing to plot.",
              "attribute": "empty-message",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "field",
              "name": "loading",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Hold the previous render at reduced opacity while new data loads.",
              "attribute": "loading",
              "reflects": true,
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "field",
              "name": "showTable",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "description": "Render the \"View as table\" twin under the chart.",
              "attribute": "show-table",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "field",
              "name": "format",
              "type": {
                "text": "ChartFormat"
              },
              "default": "'number'",
              "description": "How values are rendered in labels, ticks, tooltips and the table twin.",
              "attribute": "format",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "field",
              "name": "currency",
              "type": {
                "text": "string"
              },
              "default": "'THB'",
              "description": "ISO currency code for `format=\"currency\"` (THB renders `฿`).",
              "attribute": "currency",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "field",
              "name": "tipEl",
              "type": {
                "text": "HTMLElement | undefined"
              },
              "privacy": "private",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "field",
              "name": "held",
              "type": {
                "text": "unknown"
              },
              "privacy": "private",
              "default": "null",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "fmt",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "number"
                  }
                }
              ],
              "description": "Value → display text using this chart's `format` / `currency`.",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "hold",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "T"
                }
              },
              "parameters": [
                {
                  "name": "next",
                  "type": {
                    "text": "T"
                  }
                }
              ],
              "description": "The snapshot to draw. While `loading` is set the previous one is returned,\nso a refetch dims the chart instead of emptying it.",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "rootClass",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "extra",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "Root class list: `baht-chart` plus the loading modifier.",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderTooltip",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "description": "The single floating tooltip node; rendered by the template, never appended.",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "showTip",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "event",
                  "type": {
                    "text": "Event"
                  }
                },
                {
                  "name": "text",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "Show `text` near the pointer (or, on keyboard focus, near the mark).\nContent is assigned with `textContent`: category and series names are\nuntrusted data (interaction.md).",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "hideTip",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Hide the tooltip (pointerleave / blur).",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderEmpty",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "description": "The empty placeholder, or `nothing` when there is data.",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLegend",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "parameters": [
                {
                  "name": "entries",
                  "type": {
                    "text": "{ label: string; color: string; value?: string; share?: string }[]"
                  }
                },
                {
                  "name": "kind",
                  "default": "'rect'",
                  "type": {
                    "text": "'rect' | 'line'"
                  }
                }
              ],
              "description": "Legend rows — only ever rendered for 2+ series (marks-and-anatomy.md).",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "total",
              "type": {
                "text": "number | null"
              },
              "default": "null",
              "fieldName": "total"
            },
            {
              "name": "color",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Single-series color override (first segment).",
              "fieldName": "color"
            },
            {
              "name": "center-label",
              "type": {
                "text": "string"
              },
              "default": "'records'",
              "fieldName": "centerLabel"
            },
            {
              "name": "other-label",
              "type": {
                "text": "string"
              },
              "default": "'Other'",
              "description": "Label of the folded tail bucket.",
              "fieldName": "otherLabel"
            },
            {
              "name": "empty-message",
              "type": {
                "text": "string"
              },
              "default": "'No data to chart'",
              "description": "Shown instead of the marks when there is nothing to plot.",
              "fieldName": "emptyMessage",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "name": "loading",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Hold the previous render at reduced opacity while new data loads.",
              "fieldName": "loading",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "name": "show-table",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "description": "Render the \"View as table\" twin under the chart.",
              "fieldName": "showTable",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "name": "format",
              "type": {
                "text": "ChartFormat"
              },
              "default": "'number'",
              "description": "How values are rendered in labels, ticks, tooltips and the table twin.",
              "fieldName": "format",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "name": "currency",
              "type": {
                "text": "string"
              },
              "default": "'THB'",
              "description": "ISO currency code for `format=\"currency\"` (THB renders `฿`).",
              "fieldName": "currency",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtChartBase",
            "module": "/src/components/primitives/charts.js"
          },
          "tagName": "baht-donut-chart",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        },
        {
          "kind": "variable",
          "name": "frac"
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtDonutChart",
          "declaration": {
            "name": "BahtDonutChart",
            "module": "src/components/primitives/baht-donut-chart.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-donut-chart",
          "declaration": {
            "name": "BahtDonutChart",
            "module": "src/components/primitives/baht-donut-chart.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-edit-table.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "A table whose cells are edited in place (reference lists, catalog items,\ngroups). Each changed row shows Save; Save emits `baht-row-save`\n`{ key, row }`, Remove emits `baht-row-delete` `{ key, row }`. With\n`addable`, a blank first row emits `baht-row-add` `{ row }`. The host\npersists and feeds the new `rows` back, which clears the edits.",
          "name": "BahtEditTable",
          "members": [
            {
              "kind": "field",
              "name": "columns",
              "type": {
                "text": "EditColumn[]"
              },
              "default": "[]"
            },
            {
              "kind": "field",
              "name": "rows",
              "type": {
                "text": "EditRow[]"
              },
              "default": "[]"
            },
            {
              "kind": "field",
              "name": "rowKey",
              "type": {
                "text": "string"
              },
              "default": "'id'",
              "attribute": "row-key"
            },
            {
              "kind": "field",
              "name": "addable",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "addable"
            },
            {
              "kind": "field",
              "name": "removable",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "removable"
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "'Table'",
              "attribute": "label"
            },
            {
              "kind": "field",
              "name": "edits",
              "privacy": "private",
              "default": "new Map<string, EditRow>()",
              "description": "Edited rows by key, until the host feeds new `rows`."
            },
            {
              "kind": "field",
              "name": "draft",
              "type": {
                "text": "EditRow"
              },
              "privacy": "private",
              "default": "{}"
            },
            {
              "kind": "method",
              "name": "setDraft",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "key",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "addDraft",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "keyOf",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "row",
                  "type": {
                    "text": "EditRow"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "editCell",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "row",
                  "type": {
                    "text": "EditRow"
                  }
                },
                {
                  "name": "column",
                  "type": {
                    "text": "EditColumn"
                  }
                },
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "inputValue",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "unknown"
                }
              },
              "parameters": [
                {
                  "name": "ev",
                  "type": {
                    "text": "Event"
                  }
                },
                {
                  "name": "column",
                  "type": {
                    "text": "EditColumn"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "cell",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "parameters": [
                {
                  "name": "row",
                  "type": {
                    "text": "EditRow"
                  }
                },
                {
                  "name": "column",
                  "type": {
                    "text": "EditColumn"
                  }
                },
                {
                  "name": "onChange",
                  "type": {
                    "text": "(value: unknown) => void"
                  }
                }
              ]
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "row-key",
              "type": {
                "text": "string"
              },
              "default": "'id'",
              "fieldName": "rowKey"
            },
            {
              "name": "addable",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "addable"
            },
            {
              "name": "removable",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "removable"
            },
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "'Table'",
              "fieldName": "label"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-edit-table",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtEditTable",
          "declaration": {
            "name": "BahtEditTable",
            "module": "src/components/primitives/baht-edit-table.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-edit-table",
          "declaration": {
            "name": "BahtEditTable",
            "module": "src/components/primitives/baht-edit-table.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-empty-state.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Centered \"nothing here\" placeholder for lists, tables, and searches.\n\n  <baht-empty-state message=\"No records to display\" hint=\"Try clearing the filter\"></baht-empty-state>",
          "name": "BahtEmptyState",
          "members": [
            {
              "kind": "field",
              "name": "icon",
              "type": {
                "text": "string"
              },
              "default": "'empty-box'",
              "description": "Illustration name (`empty-box`, `search-slash`, `folder`, …), or any emoji / short text. Empty string hides it.",
              "attribute": "icon"
            },
            {
              "kind": "field",
              "name": "message",
              "type": {
                "text": "string"
              },
              "default": "'Nothing to display'",
              "attribute": "message"
            },
            {
              "kind": "field",
              "name": "hint",
              "type": {
                "text": "string"
              },
              "default": "''",
              "attribute": "hint"
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "icon",
              "type": {
                "text": "string"
              },
              "default": "'empty-box'",
              "description": "Illustration name (`empty-box`, `search-slash`, `folder`, …), or any emoji / short text. Empty string hides it.",
              "fieldName": "icon"
            },
            {
              "name": "message",
              "type": {
                "text": "string"
              },
              "default": "'Nothing to display'",
              "fieldName": "message"
            },
            {
              "name": "hint",
              "type": {
                "text": "string"
              },
              "default": "''",
              "fieldName": "hint"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-empty-state",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtEmptyState",
          "declaration": {
            "name": "BahtEmptyState",
            "module": "src/components/primitives/baht-empty-state.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-empty-state",
          "declaration": {
            "name": "BahtEmptyState",
            "module": "src/components/primitives/baht-empty-state.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-error-state.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Centered failure placeholder with an optional retry action.\nEmits `baht-retry` when the retry button is clicked.\n\n  <baht-error-state heading=\"Backend unavailable\"\n                    message=\"The API is not responding.\"\n                    retry-label=\"Retry\"></baht-error-state>",
          "name": "BahtErrorState",
          "members": [
            {
              "kind": "field",
              "name": "icon",
              "type": {
                "text": "string"
              },
              "default": "'error'",
              "description": "Illustration name (`error` by default), or any emoji / short text. Empty string hides it.",
              "attribute": "icon"
            },
            {
              "kind": "field",
              "name": "heading",
              "type": {
                "text": "string"
              },
              "default": "'Something went wrong'",
              "attribute": "heading"
            },
            {
              "kind": "field",
              "name": "message",
              "type": {
                "text": "string"
              },
              "default": "''",
              "attribute": "message"
            },
            {
              "kind": "field",
              "name": "retryLabel",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Renders a retry button with this label; omit for no action.",
              "attribute": "retry-label"
            },
            {
              "kind": "field",
              "name": "onRetry",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "icon",
              "type": {
                "text": "string"
              },
              "default": "'error'",
              "description": "Illustration name (`error` by default), or any emoji / short text. Empty string hides it.",
              "fieldName": "icon"
            },
            {
              "name": "heading",
              "type": {
                "text": "string"
              },
              "default": "'Something went wrong'",
              "fieldName": "heading"
            },
            {
              "name": "message",
              "type": {
                "text": "string"
              },
              "default": "''",
              "fieldName": "message"
            },
            {
              "name": "retry-label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Renders a retry button with this label; omit for no action.",
              "fieldName": "retryLabel"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-error-state",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtErrorState",
          "declaration": {
            "name": "BahtErrorState",
            "module": "src/components/primitives/baht-error-state.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-error-state",
          "declaration": {
            "name": "BahtErrorState",
            "module": "src/components/primitives/baht-error-state.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-fieldset.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Semantic group wrapper (native <fieldset>/<legend>). Children become the\ncontent — typically a set of baht-* fields.\n\n  <baht-fieldset legend=\"Billing\" help=\"Shown on invoices\">\n    <baht-input>…</baht-input>\n  </baht-fieldset>",
          "name": "BahtFieldset",
          "members": [
            {
              "kind": "field",
              "name": "legend",
              "type": {
                "text": "string"
              },
              "default": "''",
              "attribute": "legend"
            },
            {
              "kind": "field",
              "name": "help",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Muted help line under the group (e.g. \"Fill both languages for accurate reading\").",
              "attribute": "help"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "disabled"
            },
            {
              "kind": "field",
              "name": "bodyEl",
              "type": {
                "text": "HTMLElement"
              },
              "privacy": "private"
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "legend",
              "type": {
                "text": "string"
              },
              "default": "''",
              "fieldName": "legend"
            },
            {
              "name": "help",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Muted help line under the group (e.g. \"Fill both languages for accurate reading\").",
              "fieldName": "help"
            },
            {
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "disabled"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-fieldset",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtFieldset",
          "declaration": {
            "name": "BahtFieldset",
            "module": "src/components/primitives/baht-fieldset.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-fieldset",
          "declaration": {
            "name": "BahtFieldset",
            "module": "src/components/primitives/baht-fieldset.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-file.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "File field (spec 01 §2 + §13). Two modes:\n- capture (default): value = File handle(s); the lib never uploads.\n- upload (`field.uploader` + host `uploader` fn from the registry):\n  picking uploads immediately, value becomes serializable UploadedFile\n  ref(s), and the control shows chips with remove buttons.\nmax_size (bytes) is enforced here as a soft filter — oversize files rejected.",
          "name": "BahtFile",
          "members": [
            {
              "kind": "field",
              "name": "uploader",
              "type": {
                "text": "(file: File) => Promise<UploadedFile> | undefined"
              },
              "description": "Resolved registry uploader — <baht-form> injects it when `field.uploader` is set."
            },
            {
              "kind": "field",
              "name": "uploadingCount",
              "type": {
                "text": "number"
              },
              "privacy": "private",
              "default": "0"
            },
            {
              "kind": "field",
              "name": "uploadError",
              "type": {
                "text": "string | null"
              },
              "privacy": "private",
              "default": "null"
            },
            {
              "kind": "field",
              "name": "rejectedNames",
              "type": {
                "text": "string[]"
              },
              "privacy": "private",
              "default": "[]",
              "description": "Names of files the last pick rejected for being over `field.max_size`."
            },
            {
              "kind": "field",
              "name": "refs",
              "type": {
                "text": "UploadedFile[]"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "emitRefs",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "refs",
                  "type": {
                    "text": "UploadedFile[]"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "uploadAll",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "Promise<void>"
                }
              },
              "parameters": [
                {
                  "name": "files",
                  "type": {
                    "text": "File[]"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "onPick",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "e",
                  "type": {
                    "text": "Event"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "take",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "files",
                  "type": {
                    "text": "File[]"
                  }
                },
                {
                  "name": "input",
                  "optional": true,
                  "type": {
                    "text": "HTMLInputElement"
                  }
                }
              ]
            },
            {
              "kind": "field",
              "name": "captured",
              "type": {
                "text": "File[]"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "hintText",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "string"
                }
              }
            },
            {
              "kind": "method",
              "name": "renderControl",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "defaultDebounce",
              "type": {
                "text": "number"
              },
              "static": true,
              "default": "150",
              "description": "Default trailing debounce (ms) for TYPED edits — text, email, password,\ntextarea, number. Every keystroke otherwise re-runs the host's rules,\nvalidation and dependent-option fetches. Per element: the `debounce`\nproperty/attribute; `<baht-form options.inputDebounce>` sets it for a whole\nform. 0 = emit on every keystroke. Selects, checkboxes, radios, toggles,\ndates and files are never debounced — a pick is one event.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "field",
              "type": {
                "text": "FieldDescriptor"
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "unknown"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "showOptional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "attribute": "show-optional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "error",
              "type": {
                "text": "string | null"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "attribute": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typed",
              "type": {
                "text": "{ value: unknown; emitted: boolean } | null"
              },
              "privacy": "private",
              "default": "null",
              "description": "The keystrokes not yet (or just) handed to the host. The control keeps\nrendering `typed.value` until the host's `value` moves, so a re-render\nmid-typing (a sibling field changing) can't snap the text back.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typedTimer",
              "type": {
                "text": "ReturnType<typeof setTimeout> | undefined"
              },
              "privacy": "private",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "onFocusOut",
              "privacy": "private",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "effectiveDebounce",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitTyped",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "A typed edit: emitted after `debounce` ms of quiet (or at once when 0).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "flushTyped",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Hand a pending typed edit to the host now (blur, disconnect, host reads). Idempotent.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownValue",
              "type": {
                "text": "unknown"
              },
              "privacy": "protected",
              "description": "What a typed control shows: pending keystrokes win over a stale host value.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownText",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "description": "`shownValue` as control text: `''` for null/undefined, `String()` otherwise.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "assignedField",
              "type": {
                "text": "FieldDescriptor | undefined"
              },
              "privacy": "protected",
              "description": "`field` as the host may actually have left it: a framework can connect the element\nbefore it binds the descriptor, so internally it is optional until then.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitInput",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Emit the user's edit upward (composed so it crosses any boundary).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "hasFieldIcon",
              "type": {
                "text": "boolean"
              },
              "privacy": "protected",
              "description": "True when `field.icon` names a real icon — gates both the icon markup\nand the control's icon-padding class, so a typo/removed name never\nleaves the control indented for a glyph that isn't there.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderFieldIcon",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Leading icon for text/currency/textarea/dropdown controls (spec: field.icon).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabel",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabelMark",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Required asterisk, or the \"(optional)\" marker when the form asks for it.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "controlId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "labelId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "errorId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "helpId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "describedBy",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "id list for the control's aria-describedby: error first, then help.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "invalidAttr",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "'true' while the field is in error, else absent (styles hook on [aria-invalid]).",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtFieldBase",
            "module": "/src/components/field-base.js"
          },
          "tagName": "baht-file",
          "customElement": true,
          "attributes": [
            {
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "show-optional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "fieldName": "showOptional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "fieldName": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtFile",
          "declaration": {
            "name": "BahtFile",
            "module": "src/components/primitives/baht-file.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-file",
          "declaration": {
            "name": "BahtFile",
            "module": "src/components/primitives/baht-file.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-filter.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Filter chip group. Controlled: emits `baht-change { selected }` (array of\noption keys), host re-feeds `selected`. Typical use: above an <baht-table>,\nthe handler refetches page 1 with the new filters.\n\n  const f = document.querySelector('baht-filter');\n  f.options = [{ key: 'running', label: 'Running' }, { key: 'failed', label: 'Failed' }];\n  f.selected = ['running'];\n  f.addEventListener('baht-change', (e) => refetch({ status: e.detail.selected }));\n\n`variant=\"segmented\"` draws the same options as one joined segmented\ncontrol (a single bordered group, active segment filled with the ink\ncolour) — for a period switch like Week / Month / Year. Pair it with\n`multiple=\"false\"`: a segmented control always holds one value, so clicking\nthe active segment does nothing (no `baht-change`) instead of clearing it.",
          "name": "BahtFilter",
          "members": [
            {
              "kind": "field",
              "name": "options",
              "type": {
                "text": "FieldOption[]"
              },
              "default": "[]"
            },
            {
              "kind": "field",
              "name": "selected",
              "type": {
                "text": "string[]"
              },
              "default": "[]"
            },
            {
              "kind": "field",
              "name": "variant",
              "type": {
                "text": "FilterVariant"
              },
              "default": "'chips'",
              "description": "Look: `'chips'` (default) = separate pill chips; `'segmented'` = one joined\nsegmented control. With `multiple=false` a segmented control never clears.",
              "attribute": "variant"
            },
            {
              "kind": "field",
              "name": "multiple",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "description": "false = radio behavior (max one active; clicking it again clears — except\nwith `variant=\"segmented\"`, where the active segment stays selected).",
              "attribute": "multiple"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "disabled"
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "'Filters'",
              "description": "Accessible name for the chip group.",
              "attribute": "label"
            },
            {
              "kind": "method",
              "name": "toggle",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "key",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "variant",
              "type": {
                "text": "FilterVariant"
              },
              "default": "'chips'",
              "description": "Look: `'chips'` (default) = separate pill chips; `'segmented'` = one joined\nsegmented control. With `multiple=false` a segmented control never clears.",
              "fieldName": "variant"
            },
            {
              "name": "multiple",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "description": "false = radio behavior (max one active; clicking it again clears — except\nwith `variant=\"segmented\"`, where the active segment stays selected).",
              "fieldName": "multiple"
            },
            {
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "disabled"
            },
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "'Filters'",
              "description": "Accessible name for the chip group.",
              "fieldName": "label"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-filter",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtFilter",
          "declaration": {
            "name": "BahtFilter",
            "module": "src/components/primitives/baht-filter.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-filter",
          "declaration": {
            "name": "BahtFilter",
            "module": "src/components/primitives/baht-filter.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-heatmap.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Calendar heat for one month or N weeks: one cell per day, colored on the\nsequential ramp, with a weekday header, a per-cell tooltip and a\n\"less / more\" scale legend.\n\n  const el = document.createElement('baht-heatmap');\n  el.values = [{ date: '2026-09-01', value: 420 }];\n  el.from = '2026-09-01'; el.to = '2026-09-30';\n\n`show-values` swaps the compact GitHub-style SVG (weeks as columns) for a\nmonth grid rendered as HTML (weeks as rows): seven weekday headers, one\nfocusable button per day carrying the day number and the formatted value,\ntoday's cell outlined. Being HTML, the grid fills its container while text\nkeeps its real size — nothing is scaled. Cell height follows\n`--baht-heatmap-cell-min` (56px). The two darkest ramp steps flip to light\ntext.\n\n  <baht-heatmap show-values format=\"currency\" zero-label=\"none\" .values=${daily}></baht-heatmap>",
          "name": "BahtHeatmap",
          "members": [
            {
              "kind": "field",
              "name": "values",
              "type": {
                "text": "ChartDatePoint[]"
              },
              "default": "[]",
              "description": "`{ date: 'YYYY-MM-DD', value }[]`; days with no entry render as empty."
            },
            {
              "kind": "field",
              "name": "from",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "First day (inclusive), `YYYY-MM-DD`. Defaults to the earliest value.",
              "attribute": "from"
            },
            {
              "kind": "field",
              "name": "to",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Last day (inclusive), `YYYY-MM-DD`. Defaults to the latest value.",
              "attribute": "to"
            },
            {
              "kind": "field",
              "name": "lessLabel",
              "type": {
                "text": "string"
              },
              "default": "'Less'",
              "description": "Caption on the low end of the scale legend.",
              "attribute": "less-label"
            },
            {
              "kind": "field",
              "name": "moreLabel",
              "type": {
                "text": "string"
              },
              "default": "'More'",
              "description": "Caption on the high end of the scale legend.",
              "attribute": "more-label"
            },
            {
              "kind": "field",
              "name": "zeroLabel",
              "type": {
                "text": "string"
              },
              "default": "'—'",
              "description": "Text shown in a zero/empty cell in `show-values` mode.",
              "attribute": "zero-label"
            },
            {
              "kind": "field",
              "name": "showValues",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Roomier month-grid layout with the day number and value printed in each cell.",
              "attribute": "show-values"
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Accessible summary; falls back to a generated sentence.",
              "attribute": "label"
            },
            {
              "kind": "field",
              "name": "range",
              "type": {
                "text": "{ start: Date; end: Date } | null"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "renderCompact",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "parameters": [
                {
                  "name": "days",
                  "type": {
                    "text": "{ iso: string; value: number | null; weekday: number; week: number }[]"
                  }
                },
                {
                  "name": "bucket",
                  "type": {
                    "text": "(v: number) => number"
                  }
                },
                {
                  "name": "svgLabel",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "Compact GitHub-style layout: weeks as columns, weekdays as rows."
            },
            {
              "kind": "method",
              "name": "renderCalendar",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "parameters": [
                {
                  "name": "days",
                  "type": {
                    "text": "{ iso: string; value: number | null; weekday: number; week: number }[]"
                  }
                },
                {
                  "name": "bucket",
                  "type": {
                    "text": "(v: number) => number"
                  }
                },
                {
                  "name": "today",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "summary",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "`show-values` layout: an HTML month grid — weeks as rows, weekdays as\ncolumns, the day number and value printed in each cell. Buttons give\nevery day focus and a role for free; the tooltip rides on focus/hover."
            },
            {
              "kind": "field",
              "name": "emptyMessage",
              "type": {
                "text": "string"
              },
              "default": "'No data to chart'",
              "description": "Shown instead of the marks when there is nothing to plot.",
              "attribute": "empty-message",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "field",
              "name": "loading",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Hold the previous render at reduced opacity while new data loads.",
              "attribute": "loading",
              "reflects": true,
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "field",
              "name": "showTable",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "description": "Render the \"View as table\" twin under the chart.",
              "attribute": "show-table",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "field",
              "name": "format",
              "type": {
                "text": "ChartFormat"
              },
              "default": "'number'",
              "description": "How values are rendered in labels, ticks, tooltips and the table twin.",
              "attribute": "format",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "field",
              "name": "currency",
              "type": {
                "text": "string"
              },
              "default": "'THB'",
              "description": "ISO currency code for `format=\"currency\"` (THB renders `฿`).",
              "attribute": "currency",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "field",
              "name": "tipEl",
              "type": {
                "text": "HTMLElement | undefined"
              },
              "privacy": "private",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "field",
              "name": "held",
              "type": {
                "text": "unknown"
              },
              "privacy": "private",
              "default": "null",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "fmt",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "number"
                  }
                }
              ],
              "description": "Value → display text using this chart's `format` / `currency`.",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "hold",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "T"
                }
              },
              "parameters": [
                {
                  "name": "next",
                  "type": {
                    "text": "T"
                  }
                }
              ],
              "description": "The snapshot to draw. While `loading` is set the previous one is returned,\nso a refetch dims the chart instead of emptying it.",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "rootClass",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "extra",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "Root class list: `baht-chart` plus the loading modifier.",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderTooltip",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "description": "The single floating tooltip node; rendered by the template, never appended.",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "showTip",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "event",
                  "type": {
                    "text": "Event"
                  }
                },
                {
                  "name": "text",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "Show `text` near the pointer (or, on keyboard focus, near the mark).\nContent is assigned with `textContent`: category and series names are\nuntrusted data (interaction.md).",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "hideTip",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Hide the tooltip (pointerleave / blur).",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderEmpty",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "description": "The empty placeholder, or `nothing` when there is data.",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLegend",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "parameters": [
                {
                  "name": "entries",
                  "type": {
                    "text": "{ label: string; color: string; value?: string; share?: string }[]"
                  }
                },
                {
                  "name": "kind",
                  "default": "'rect'",
                  "type": {
                    "text": "'rect' | 'line'"
                  }
                }
              ],
              "description": "Legend rows — only ever rendered for 2+ series (marks-and-anatomy.md).",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "from",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "First day (inclusive), `YYYY-MM-DD`. Defaults to the earliest value.",
              "fieldName": "from"
            },
            {
              "name": "to",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Last day (inclusive), `YYYY-MM-DD`. Defaults to the latest value.",
              "fieldName": "to"
            },
            {
              "name": "less-label",
              "type": {
                "text": "string"
              },
              "default": "'Less'",
              "description": "Caption on the low end of the scale legend.",
              "fieldName": "lessLabel"
            },
            {
              "name": "more-label",
              "type": {
                "text": "string"
              },
              "default": "'More'",
              "description": "Caption on the high end of the scale legend.",
              "fieldName": "moreLabel"
            },
            {
              "name": "zero-label",
              "type": {
                "text": "string"
              },
              "default": "'—'",
              "description": "Text shown in a zero/empty cell in `show-values` mode.",
              "fieldName": "zeroLabel"
            },
            {
              "name": "show-values",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Roomier month-grid layout with the day number and value printed in each cell.",
              "fieldName": "showValues"
            },
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Accessible summary; falls back to a generated sentence.",
              "fieldName": "label"
            },
            {
              "name": "empty-message",
              "type": {
                "text": "string"
              },
              "default": "'No data to chart'",
              "description": "Shown instead of the marks when there is nothing to plot.",
              "fieldName": "emptyMessage",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "name": "loading",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Hold the previous render at reduced opacity while new data loads.",
              "fieldName": "loading",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "name": "show-table",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "description": "Render the \"View as table\" twin under the chart.",
              "fieldName": "showTable",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "name": "format",
              "type": {
                "text": "ChartFormat"
              },
              "default": "'number'",
              "description": "How values are rendered in labels, ticks, tooltips and the table twin.",
              "fieldName": "format",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "name": "currency",
              "type": {
                "text": "string"
              },
              "default": "'THB'",
              "description": "ISO currency code for `format=\"currency\"` (THB renders `฿`).",
              "fieldName": "currency",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtChartBase",
            "module": "/src/components/primitives/charts.js"
          },
          "tagName": "baht-heatmap",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtHeatmap",
          "declaration": {
            "name": "BahtHeatmap",
            "module": "src/components/primitives/baht-heatmap.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-heatmap",
          "declaration": {
            "name": "BahtHeatmap",
            "module": "src/components/primitives/baht-heatmap.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-input.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "text + email + password share one control; email differs only in input type +\nvalidator, password only in input type (masked, never formatted or logged).",
          "name": "BahtInput",
          "members": [
            {
              "kind": "method",
              "name": "renderControl",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "defaultDebounce",
              "type": {
                "text": "number"
              },
              "static": true,
              "default": "150",
              "description": "Default trailing debounce (ms) for TYPED edits — text, email, password,\ntextarea, number. Every keystroke otherwise re-runs the host's rules,\nvalidation and dependent-option fetches. Per element: the `debounce`\nproperty/attribute; `<baht-form options.inputDebounce>` sets it for a whole\nform. 0 = emit on every keystroke. Selects, checkboxes, radios, toggles,\ndates and files are never debounced — a pick is one event.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "field",
              "type": {
                "text": "FieldDescriptor"
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "unknown"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "showOptional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "attribute": "show-optional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "error",
              "type": {
                "text": "string | null"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "attribute": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typed",
              "type": {
                "text": "{ value: unknown; emitted: boolean } | null"
              },
              "privacy": "private",
              "default": "null",
              "description": "The keystrokes not yet (or just) handed to the host. The control keeps\nrendering `typed.value` until the host's `value` moves, so a re-render\nmid-typing (a sibling field changing) can't snap the text back.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typedTimer",
              "type": {
                "text": "ReturnType<typeof setTimeout> | undefined"
              },
              "privacy": "private",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "onFocusOut",
              "privacy": "private",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "effectiveDebounce",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitTyped",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "A typed edit: emitted after `debounce` ms of quiet (or at once when 0).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "flushTyped",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Hand a pending typed edit to the host now (blur, disconnect, host reads). Idempotent.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownValue",
              "type": {
                "text": "unknown"
              },
              "privacy": "protected",
              "description": "What a typed control shows: pending keystrokes win over a stale host value.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownText",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "description": "`shownValue` as control text: `''` for null/undefined, `String()` otherwise.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "assignedField",
              "type": {
                "text": "FieldDescriptor | undefined"
              },
              "privacy": "protected",
              "description": "`field` as the host may actually have left it: a framework can connect the element\nbefore it binds the descriptor, so internally it is optional until then.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitInput",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Emit the user's edit upward (composed so it crosses any boundary).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "hasFieldIcon",
              "type": {
                "text": "boolean"
              },
              "privacy": "protected",
              "description": "True when `field.icon` names a real icon — gates both the icon markup\nand the control's icon-padding class, so a typo/removed name never\nleaves the control indented for a glyph that isn't there.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderFieldIcon",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Leading icon for text/currency/textarea/dropdown controls (spec: field.icon).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabel",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabelMark",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Required asterisk, or the \"(optional)\" marker when the form asks for it.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "controlId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "labelId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "errorId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "helpId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "describedBy",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "id list for the control's aria-describedby: error first, then help.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "invalidAttr",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "'true' while the field is in error, else absent (styles hook on [aria-invalid]).",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtFieldBase",
            "module": "/src/components/field-base.js"
          },
          "tagName": "baht-input",
          "customElement": true,
          "attributes": [
            {
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "show-optional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "fieldName": "showOptional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "fieldName": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtInput",
          "declaration": {
            "name": "BahtInput",
            "module": "src/components/primitives/baht-input.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-input",
          "declaration": {
            "name": "BahtInput",
            "module": "src/components/primitives/baht-input.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-keyvalue-editor.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Inline key = value row editor (field maps, config objects, …).\nControlled: set `value`, listen for `baht-change` ({ value }) — rows with an\nempty key are kept while editing but dropped from the emitted object.\n\n  const el = document.createElement('baht-keyvalue-editor');\n  el.value = { state: 'resolved' };\n  el.addEventListener('baht-change', (e) => save(e.detail.value));",
          "name": "BahtKeyvalueEditor",
          "members": [
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "Record<string, unknown>"
              },
              "default": "{}"
            },
            {
              "kind": "field",
              "name": "keyPlaceholder",
              "type": {
                "text": "string"
              },
              "default": "'key'",
              "attribute": "key-placeholder"
            },
            {
              "kind": "field",
              "name": "valuePlaceholder",
              "type": {
                "text": "string"
              },
              "default": "'value'",
              "attribute": "value-placeholder"
            },
            {
              "kind": "field",
              "name": "add_label",
              "type": {
                "text": "string"
              },
              "default": "'Add row'",
              "attribute": "add-label"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "disabled"
            },
            {
              "kind": "field",
              "name": "rows",
              "type": {
                "text": "Row[]"
              },
              "privacy": "private",
              "default": "[{ k: '', v: '' }]"
            },
            {
              "kind": "field",
              "name": "syncedJson",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "default": "''",
              "description": "Last value synced/emitted, serialized — hosts re-feed fresh-but-equal objects."
            },
            {
              "kind": "method",
              "name": "toRows",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "Row[]"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "Record<string, unknown>"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "commit",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "next",
                  "type": {
                    "text": "Row[]"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "edit",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "index",
                  "type": {
                    "text": "number"
                  }
                },
                {
                  "name": "patch",
                  "type": {
                    "text": "Partial<Row>"
                  }
                }
              ]
            },
            {
              "kind": "field",
              "name": "addRow",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "key-placeholder",
              "type": {
                "text": "string"
              },
              "default": "'key'",
              "fieldName": "keyPlaceholder"
            },
            {
              "name": "value-placeholder",
              "type": {
                "text": "string"
              },
              "default": "'value'",
              "fieldName": "valuePlaceholder"
            },
            {
              "name": "add-label",
              "type": {
                "text": "string"
              },
              "default": "'Add row'",
              "fieldName": "add_label"
            },
            {
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "disabled"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-keyvalue-editor",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtKeyvalueEditor",
          "declaration": {
            "name": "BahtKeyvalueEditor",
            "module": "src/components/primitives/baht-keyvalue-editor.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-keyvalue-editor",
          "declaration": {
            "name": "BahtKeyvalueEditor",
            "module": "src/components/primitives/baht-keyvalue-editor.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-line-chart.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Multi-series line chart with a crosshair tooltip that lists every series at\nthe hovered x. One y axis only — never a second scale.\n\n  const el = document.createElement('baht-line-chart');\n  el.categories = ['Oct', 'Nov', 'Dec'];\n  el.series = [{ name: 'Income', values: [1, 2, 3] }];",
          "name": "BahtLineChart",
          "members": [
            {
              "kind": "field",
              "name": "series",
              "type": {
                "text": "ChartSeries[]"
              },
              "default": "[]",
              "description": "One entry per line: `{ name, values, color? }`."
            },
            {
              "kind": "field",
              "name": "categories",
              "type": {
                "text": "string[]"
              },
              "default": "[]",
              "description": "X labels, one per value index."
            },
            {
              "kind": "field",
              "name": "area",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Fill under the line at 10% opacity. Single series only.",
              "attribute": "area"
            },
            {
              "kind": "field",
              "name": "markers",
              "type": {
                "text": "ChartMarker[]"
              },
              "default": "[]",
              "description": "Reference lines (targets, averages) drawn across the plot."
            },
            {
              "kind": "field",
              "name": "forecast",
              "type": {
                "text": "number"
              },
              "default": "0",
              "description": "Draw the last N points dashed — a projection, not measured data.",
              "attribute": "forecast"
            },
            {
              "kind": "field",
              "name": "baseline",
              "type": {
                "text": "number | null"
              },
              "default": "null",
              "description": "Hairline at this value (0, a target). `null` draws none.",
              "attribute": "baseline"
            },
            {
              "kind": "field",
              "name": "labelValues",
              "type": {
                "text": "'ends' | 'none'"
              },
              "default": "'ends'",
              "description": "`ends` labels the last point of each line when the labels do not collide.",
              "attribute": "label-values"
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Accessible summary; falls back to a generated sentence.",
              "attribute": "label"
            },
            {
              "kind": "field",
              "name": "width",
              "privacy": "private",
              "default": "640",
              "description": "Drawing width in SVG units. It follows the host, so one unit is one CSS\npixel and tick text keeps its real size: not shrunk on a phone, not blown\nup in a wide card (a capped drawing stretched to 1050px set 11px ticks at 18px).",
              "type": {
                "text": "number"
              }
            },
            {
              "kind": "field",
              "name": "resizeObserver",
              "type": {
                "text": "ResizeObserver | undefined"
              },
              "privacy": "private"
            },
            {
              "kind": "method",
              "name": "measure",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Host width → drawing width. Never runs on the server (`hasDom` guard)."
            },
            {
              "kind": "field",
              "name": "plot",
              "type": {
                "text": "{ w: number; h: number }"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "crosshairAt",
              "type": {
                "text": "number | null"
              },
              "privacy": "private",
              "default": "null"
            },
            {
              "kind": "method",
              "name": "onHover",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "e",
                  "type": {
                    "text": "Event"
                  }
                },
                {
                  "name": "i",
                  "type": {
                    "text": "number"
                  }
                },
                {
                  "name": "text",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "onLeave",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "field",
              "name": "emptyMessage",
              "type": {
                "text": "string"
              },
              "default": "'No data to chart'",
              "description": "Shown instead of the marks when there is nothing to plot.",
              "attribute": "empty-message",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "field",
              "name": "loading",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Hold the previous render at reduced opacity while new data loads.",
              "attribute": "loading",
              "reflects": true,
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "field",
              "name": "showTable",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "description": "Render the \"View as table\" twin under the chart.",
              "attribute": "show-table",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "field",
              "name": "format",
              "type": {
                "text": "ChartFormat"
              },
              "default": "'number'",
              "description": "How values are rendered in labels, ticks, tooltips and the table twin.",
              "attribute": "format",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "field",
              "name": "currency",
              "type": {
                "text": "string"
              },
              "default": "'THB'",
              "description": "ISO currency code for `format=\"currency\"` (THB renders `฿`).",
              "attribute": "currency",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "field",
              "name": "tipEl",
              "type": {
                "text": "HTMLElement | undefined"
              },
              "privacy": "private",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "field",
              "name": "held",
              "type": {
                "text": "unknown"
              },
              "privacy": "private",
              "default": "null",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "fmt",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "number"
                  }
                }
              ],
              "description": "Value → display text using this chart's `format` / `currency`.",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "hold",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "T"
                }
              },
              "parameters": [
                {
                  "name": "next",
                  "type": {
                    "text": "T"
                  }
                }
              ],
              "description": "The snapshot to draw. While `loading` is set the previous one is returned,\nso a refetch dims the chart instead of emptying it.",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "rootClass",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "extra",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "Root class list: `baht-chart` plus the loading modifier.",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderTooltip",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "description": "The single floating tooltip node; rendered by the template, never appended.",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "showTip",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "event",
                  "type": {
                    "text": "Event"
                  }
                },
                {
                  "name": "text",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "Show `text` near the pointer (or, on keyboard focus, near the mark).\nContent is assigned with `textContent`: category and series names are\nuntrusted data (interaction.md).",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "hideTip",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Hide the tooltip (pointerleave / blur).",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderEmpty",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "description": "The empty placeholder, or `nothing` when there is data.",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLegend",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "parameters": [
                {
                  "name": "entries",
                  "type": {
                    "text": "{ label: string; color: string; value?: string; share?: string }[]"
                  }
                },
                {
                  "name": "kind",
                  "default": "'rect'",
                  "type": {
                    "text": "'rect' | 'line'"
                  }
                }
              ],
              "description": "Legend rows — only ever rendered for 2+ series (marks-and-anatomy.md).",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "area",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Fill under the line at 10% opacity. Single series only.",
              "fieldName": "area"
            },
            {
              "name": "forecast",
              "type": {
                "text": "number"
              },
              "default": "0",
              "description": "Draw the last N points dashed — a projection, not measured data.",
              "fieldName": "forecast"
            },
            {
              "name": "baseline",
              "type": {
                "text": "number | null"
              },
              "default": "null",
              "description": "Hairline at this value (0, a target). `null` draws none.",
              "fieldName": "baseline"
            },
            {
              "name": "label-values",
              "type": {
                "text": "'ends' | 'none'"
              },
              "default": "'ends'",
              "description": "`ends` labels the last point of each line when the labels do not collide.",
              "fieldName": "labelValues"
            },
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Accessible summary; falls back to a generated sentence.",
              "fieldName": "label"
            },
            {
              "name": "empty-message",
              "type": {
                "text": "string"
              },
              "default": "'No data to chart'",
              "description": "Shown instead of the marks when there is nothing to plot.",
              "fieldName": "emptyMessage",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "name": "loading",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Hold the previous render at reduced opacity while new data loads.",
              "fieldName": "loading",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "name": "show-table",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "description": "Render the \"View as table\" twin under the chart.",
              "fieldName": "showTable",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "name": "format",
              "type": {
                "text": "ChartFormat"
              },
              "default": "'number'",
              "description": "How values are rendered in labels, ticks, tooltips and the table twin.",
              "fieldName": "format",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "name": "currency",
              "type": {
                "text": "string"
              },
              "default": "'THB'",
              "description": "ISO currency code for `format=\"currency\"` (THB renders `฿`).",
              "fieldName": "currency",
              "inheritedFrom": {
                "name": "BahtChartBase",
                "module": "src/components/primitives/charts.ts"
              }
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtChartBase",
            "module": "/src/components/primitives/charts.js"
          },
          "tagName": "baht-line-chart",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtLineChart",
          "declaration": {
            "name": "BahtLineChart",
            "module": "src/components/primitives/baht-line-chart.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-line-chart",
          "declaration": {
            "name": "BahtLineChart",
            "module": "src/components/primitives/baht-line-chart.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-link.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Styled anchor (20baht underline treatment). `external` opens a new tab and\nshows the ↗ mark.\n\n  <baht-link href=\"/docs\" label=\"Read the docs\"></baht-link>\n  <baht-link href=\"https://…\" label=\"Status page\" external></baht-link>",
          "name": "BahtLink",
          "members": [
            {
              "kind": "field",
              "name": "href",
              "type": {
                "text": "string"
              },
              "default": "''",
              "attribute": "href"
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "attribute": "label"
            },
            {
              "kind": "field",
              "name": "external",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "external"
            },
            {
              "kind": "field",
              "name": "externalHint",
              "type": {
                "text": "string"
              },
              "default": "'opens in new tab'",
              "description": "Screen-reader suffix for external links (override to localize).",
              "attribute": "external-hint"
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "href",
              "type": {
                "text": "string"
              },
              "default": "''",
              "fieldName": "href"
            },
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "fieldName": "label"
            },
            {
              "name": "external",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "external"
            },
            {
              "name": "external-hint",
              "type": {
                "text": "string"
              },
              "default": "'opens in new tab'",
              "description": "Screen-reader suffix for external links (override to localize).",
              "fieldName": "externalHint"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-link",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtLink",
          "declaration": {
            "name": "BahtLink",
            "module": "src/components/primitives/baht-link.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-link",
          "declaration": {
            "name": "BahtLink",
            "module": "src/components/primitives/baht-link.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-list.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Display list — same server-side contract as <baht-table>: `items` is the\ncurrent page, `loading` shows skeleton rows, the host fetches on\n`baht-page-change` (pair with <baht-pagination>).",
          "name": "BahtList",
          "members": [
            {
              "kind": "field",
              "name": "items",
              "type": {
                "text": "ListItem[]"
              },
              "default": "[]"
            },
            {
              "kind": "field",
              "name": "loading",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "loading"
            },
            {
              "kind": "field",
              "name": "error",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "error"
            },
            {
              "kind": "field",
              "name": "errorMessage",
              "type": {
                "text": "string"
              },
              "default": "\"Couldn't load data. Try again.\"",
              "attribute": "error-message"
            },
            {
              "kind": "field",
              "name": "emptyMessage",
              "type": {
                "text": "string"
              },
              "default": "'Nothing here yet.'",
              "attribute": "empty-message"
            },
            {
              "kind": "field",
              "name": "skeletonRows",
              "type": {
                "text": "number"
              },
              "default": "5",
              "attribute": "skeleton-rows"
            },
            {
              "kind": "field",
              "name": "clickable",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "attribute": "clickable"
            },
            {
              "kind": "method",
              "name": "emitItem",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "item",
                  "type": {
                    "text": "ListItem"
                  }
                },
                {
                  "name": "index",
                  "type": {
                    "text": "number"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "renderRows",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              }
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "loading",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "loading"
            },
            {
              "name": "error",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "error"
            },
            {
              "name": "error-message",
              "type": {
                "text": "string"
              },
              "default": "\"Couldn't load data. Try again.\"",
              "fieldName": "errorMessage"
            },
            {
              "name": "empty-message",
              "type": {
                "text": "string"
              },
              "default": "'Nothing here yet.'",
              "fieldName": "emptyMessage"
            },
            {
              "name": "skeleton-rows",
              "type": {
                "text": "number"
              },
              "default": "5",
              "fieldName": "skeletonRows"
            },
            {
              "name": "clickable",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "fieldName": "clickable"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-list",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtList",
          "declaration": {
            "name": "BahtList",
            "module": "src/components/primitives/baht-list.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-list",
          "declaration": {
            "name": "BahtList",
            "module": "src/components/primitives/baht-list.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-loading-overlay.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Full-viewport loading scrim with a centered spinner (0.4 ink scrim, same\nas `<baht-modal>`'s). Controlled: the host flips `open` — e.g. from an\nin-flight HTTP request counter.\n\n  <baht-loading-overlay [open]=\"loading()\"></baht-loading-overlay>",
          "name": "BahtLoadingOverlay",
          "members": [
            {
              "kind": "field",
              "name": "open",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "open",
              "reflects": true
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "'Loading'",
              "attribute": "label"
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "open",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "open"
            },
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "'Loading'",
              "fieldName": "label"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-loading-overlay",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtLoadingOverlay",
          "declaration": {
            "name": "BahtLoadingOverlay",
            "module": "src/components/primitives/baht-loading-overlay.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-loading-overlay",
          "declaration": {
            "name": "BahtLoadingOverlay",
            "module": "src/components/primitives/baht-loading-overlay.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-menu.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Action menu behind a button: the ⋯ \"more\" menu on a table row or card, or a labelled\n\"Export ▾\" menu. Same menu as `<baht-split-button>` — items with optional `shortcut`\nhints (bound page-wide), disabled and danger entries, the APG menu-button keyboard.\n\n  <baht-menu></baht-menu>                                  <!-- ⋯ icon trigger -->\n  <baht-menu trigger-label=\"Export\" align=\"start\"></baht-menu>\n  el.items = [{ value: 'rename', label: 'Rename', shortcut: 'f2' },\n              { value: 'delete', label: 'Delete', danger: true }];\n  el.addEventListener('baht-select', (e) => run(e.detail.value));\n\nA child marked `data-trigger` becomes the trigger's content (an avatar menu); `heading`\nadds a non-item first line (\"Signed in as …\"); items with `checked` are settings\n(`menuitemcheckbox`) and can carry a `description` line.\n\n  <baht-menu label=\"Account\" heading=\"somchai@20baht.com\">\n    <baht-avatar data-trigger label=\"Somchai\"></baht-avatar>\n  </baht-menu>",
          "name": "BahtMenu",
          "members": [
            {
              "kind": "field",
              "name": "items",
              "type": {
                "text": "MenuItem[]"
              },
              "default": "[]",
              "description": "Menu entries. Set as a property: `el.items = [...]`."
            },
            {
              "kind": "field",
              "name": "triggerLabel",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Visible trigger text; empty = an icon-only trigger.",
              "attribute": "trigger-label"
            },
            {
              "kind": "field",
              "name": "icon",
              "type": {
                "text": "IconName | ''"
              },
              "default": "'more'",
              "description": "Trigger icon from the curated set (default `more`, the ⋯). Ignored when `trigger-label` is set.",
              "attribute": "icon"
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Accessible name of the trigger (and the menu). Defaults to the trigger text, else \"More actions\".",
              "attribute": "label"
            },
            {
              "kind": "field",
              "name": "variant",
              "type": {
                "text": "'ghost' | 'secondary'"
              },
              "default": "'ghost'",
              "description": "Trigger look: `ghost` (default) or `secondary`.",
              "attribute": "variant"
            },
            {
              "kind": "field",
              "name": "size",
              "type": {
                "text": "'sm' | 'md'"
              },
              "default": "'md'",
              "attribute": "size"
            },
            {
              "kind": "field",
              "name": "align",
              "type": {
                "text": "'start' | 'end'"
              },
              "default": "'end'",
              "description": "Menu edge aligned with the trigger: `'end'` (default) or `'start'`.",
              "attribute": "align"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "disabled",
              "reflects": true
            },
            {
              "kind": "field",
              "name": "heading",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Non-item first line of the menu (\"Signed in as …\").",
              "attribute": "heading"
            },
            {
              "kind": "field",
              "name": "triggerEl",
              "type": {
                "text": "HTMLButtonElement"
              },
              "privacy": "private"
            },
            {
              "kind": "field",
              "name": "customTrigger",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "default": "false",
              "description": "True once a `data-trigger` child was moved into the trigger."
            },
            {
              "kind": "field",
              "name": "menu",
              "privacy": "private",
              "readonly": true,
              "default": "new MenuController(this, { items: () => arr(this.items), trigger: () => this.querySelector<HTMLButtonElement>('.baht-menu-trigger'), onPick: (item) => { this.emit('baht-select', { value: item.value, item }); }, })"
            },
            {
              "kind": "field",
              "name": "menuId",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "triggerClass",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "custom",
                  "type": {
                    "text": "boolean"
                  }
                },
                {
                  "name": "iconOnly",
                  "type": {
                    "text": "boolean"
                  }
                }
              ],
              "description": "Button chrome for the built-in triggers; a custom (avatar) trigger stays bare."
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "events": [
            {
              "description": "An item was picked (click, keyboard or its shortcut). `detail: { value, item }`.",
              "name": "baht-select"
            },
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "trigger-label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Visible trigger text; empty = an icon-only trigger.",
              "fieldName": "triggerLabel"
            },
            {
              "name": "icon",
              "type": {
                "text": "IconName | ''"
              },
              "default": "'more'",
              "description": "Trigger icon from the curated set (default `more`, the ⋯). Ignored when `trigger-label` is set.",
              "fieldName": "icon"
            },
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Accessible name of the trigger (and the menu). Defaults to the trigger text, else \"More actions\".",
              "fieldName": "label"
            },
            {
              "name": "variant",
              "type": {
                "text": "'ghost' | 'secondary'"
              },
              "default": "'ghost'",
              "description": "Trigger look: `ghost` (default) or `secondary`.",
              "fieldName": "variant"
            },
            {
              "name": "size",
              "type": {
                "text": "'sm' | 'md'"
              },
              "default": "'md'",
              "fieldName": "size"
            },
            {
              "name": "align",
              "type": {
                "text": "'start' | 'end'"
              },
              "default": "'end'",
              "description": "Menu edge aligned with the trigger: `'end'` (default) or `'start'`.",
              "fieldName": "align"
            },
            {
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "disabled"
            },
            {
              "name": "heading",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Non-item first line of the menu (\"Signed in as …\").",
              "fieldName": "heading"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-menu",
          "customElement": true
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtMenu",
          "declaration": {
            "name": "BahtMenu",
            "module": "src/components/primitives/baht-menu.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-menu",
          "declaration": {
            "name": "BahtMenu",
            "module": "src/components/primitives/baht-menu.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-meter.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Spent-against-budget meter. The fill carries severity (accent → warning →\ndanger) and the unfilled track is a lighter step of the same ramp, so state\nreads across the whole bar. Severity is always paired with an icon and a\nworded status, never color alone.\n\n  <baht-meter label=\"Food\" value=\"4200\" max=\"4000\" format=\"currency\"></baht-meter>",
          "name": "BahtMeter",
          "members": [
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "number"
              },
              "default": "0",
              "description": "Amount used so far.",
              "attribute": "value"
            },
            {
              "kind": "field",
              "name": "max",
              "type": {
                "text": "number"
              },
              "default": "100",
              "description": "The budget / capacity the value is measured against.",
              "attribute": "max"
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Sentence-case caption.",
              "attribute": "label"
            },
            {
              "kind": "field",
              "name": "format",
              "type": {
                "text": "ChartFormat"
              },
              "default": "'number'",
              "description": "How value and max read: number | currency | percent | compact.",
              "attribute": "format"
            },
            {
              "kind": "field",
              "name": "currency",
              "type": {
                "text": "string"
              },
              "default": "'THB'",
              "description": "ISO currency code for `format=\"currency\"` (THB renders `฿`).",
              "attribute": "currency"
            },
            {
              "kind": "field",
              "name": "thresholds",
              "type": {
                "text": "MeterThresholds"
              },
              "default": "{ warning: 0.8, danger: 1 }",
              "description": "Fractions of `max` where the fill turns warning / danger."
            },
            {
              "kind": "field",
              "name": "expected",
              "type": {
                "text": "number | null"
              },
              "default": "null",
              "description": "Pace marker: where the value *should* be by now. `null` hides the tick.",
              "attribute": "expected"
            },
            {
              "kind": "field",
              "name": "overLabel",
              "type": {
                "text": "string"
              },
              "default": "'Over budget'",
              "description": "Word shown after the numbers when the meter is over budget.",
              "attribute": "over-label"
            },
            {
              "kind": "field",
              "name": "atLabel",
              "type": {
                "text": "string"
              },
              "default": "'At budget'",
              "description": "Word shown when the value has reached the budget exactly, but not passed it.",
              "attribute": "at-label"
            },
            {
              "kind": "field",
              "name": "nearLabel",
              "type": {
                "text": "string"
              },
              "default": "'Near limit'",
              "description": "Word shown after the numbers when the meter is near its limit.",
              "attribute": "near-label"
            },
            {
              "kind": "field",
              "name": "fraction",
              "type": {
                "text": "number"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "severity",
              "type": {
                "text": "'ok' | 'warning' | 'danger'"
              },
              "privacy": "private",
              "description": "`ok` | `warning` | `danger`, from the fraction and the thresholds. `danger` is\nstrictly **above** its threshold: spending exactly the budget is not\noverspending, so it reads as the warning tone with an \"At budget\" status.\n`warning` stays inclusive (`>=`).",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "statusText",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "value",
              "type": {
                "text": "number"
              },
              "default": "0",
              "description": "Amount used so far.",
              "fieldName": "value"
            },
            {
              "name": "max",
              "type": {
                "text": "number"
              },
              "default": "100",
              "description": "The budget / capacity the value is measured against.",
              "fieldName": "max"
            },
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Sentence-case caption.",
              "fieldName": "label"
            },
            {
              "name": "format",
              "type": {
                "text": "ChartFormat"
              },
              "default": "'number'",
              "description": "How value and max read: number | currency | percent | compact.",
              "fieldName": "format"
            },
            {
              "name": "currency",
              "type": {
                "text": "string"
              },
              "default": "'THB'",
              "description": "ISO currency code for `format=\"currency\"` (THB renders `฿`).",
              "fieldName": "currency"
            },
            {
              "name": "expected",
              "type": {
                "text": "number | null"
              },
              "default": "null",
              "description": "Pace marker: where the value *should* be by now. `null` hides the tick.",
              "fieldName": "expected"
            },
            {
              "name": "over-label",
              "type": {
                "text": "string"
              },
              "default": "'Over budget'",
              "description": "Word shown after the numbers when the meter is over budget.",
              "fieldName": "overLabel"
            },
            {
              "name": "at-label",
              "type": {
                "text": "string"
              },
              "default": "'At budget'",
              "description": "Word shown when the value has reached the budget exactly, but not passed it.",
              "fieldName": "atLabel"
            },
            {
              "name": "near-label",
              "type": {
                "text": "string"
              },
              "default": "'Near limit'",
              "description": "Word shown after the numbers when the meter is near its limit.",
              "fieldName": "nearLabel"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-meter",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtMeter",
          "declaration": {
            "name": "BahtMeter",
            "module": "src/components/primitives/baht-meter.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-meter",
          "declaration": {
            "name": "BahtMeter",
            "module": "src/components/primitives/baht-meter.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-modal.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Modal dialog (20baht: 0.4 ink scrim, no blur; float shadow; 20px radius).\nControlled: the host flips `open`. Children become the body.\n\n  <baht-modal heading=\"Delete this workflow?\">\n    <p>Steps and run history will be removed.</p>\n  </baht-modal>\n  modal.open = true;\n  modal.addEventListener('baht-close', (e) => (modal.open = false));\n\n`placement` moves the panel: `'center'` (default) is the dialog above;\n`'sheet'` docks it to the bottom as a bottom sheet below 600px viewport\nwidth (full width, rounded top corners, a grab handle, max 90dvh with the\nbody scrolling, slides up) and is a centered dialog from 600px up; `'side'`\nis a full-height drawer at the inline end, `min(420px, 100vw)` wide, sliding\nin from that edge. Scrim, focus trap/restore and `baht-close` are the same in\nevery placement. Modifier classes: `.baht-modal--sheet` / `.baht-modal--side`\non the panel, `.baht-modal-scrim--sheet` / `.baht-modal-scrim--side` on the scrim.",
          "name": "BahtModal",
          "members": [
            {
              "kind": "field",
              "name": "open",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "open",
              "reflects": true
            },
            {
              "kind": "field",
              "name": "heading",
              "type": {
                "text": "string"
              },
              "default": "''",
              "attribute": "heading"
            },
            {
              "kind": "field",
              "name": "description",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "One muted line under the heading; also becomes the dialog's aria-describedby.",
              "attribute": "description"
            },
            {
              "kind": "field",
              "name": "showClose",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "attribute": "show-close"
            },
            {
              "kind": "field",
              "name": "placement",
              "type": {
                "text": "ModalPlacement"
              },
              "default": "'center'",
              "description": "`'center'` (default) dialog, `'sheet'` bottom sheet below 600px (centered\nfrom 600px up), or `'side'` full-height drawer at the inline end.",
              "attribute": "placement"
            },
            {
              "kind": "field",
              "name": "closeOnScrim",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Scrim click requests close. Off by default: a stray click outside the panel\nmust not throw away what the user typed — close via ×, Escape or your buttons.",
              "attribute": "close-on-scrim"
            },
            {
              "kind": "field",
              "name": "bodyEl",
              "type": {
                "text": "HTMLElement"
              },
              "privacy": "private"
            },
            {
              "kind": "field",
              "name": "titleId",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "descriptionId",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "closing",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "default": "false"
            },
            {
              "kind": "field",
              "name": "closeToken",
              "type": {
                "text": "number"
              },
              "privacy": "private",
              "default": "0"
            },
            {
              "kind": "field",
              "name": "previousFocus",
              "type": {
                "text": "HTMLElement | null"
              },
              "privacy": "private",
              "default": "null"
            },
            {
              "kind": "field",
              "name": "onKeydown",
              "privacy": "private"
            },
            {
              "kind": "method",
              "name": "focusables",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "HTMLElement[]"
                }
              }
            },
            {
              "kind": "method",
              "name": "trapFocus",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "e",
                  "type": {
                    "text": "KeyboardEvent"
                  }
                }
              ],
              "description": "Keep Tab cycling inside the dialog (no keyboard escape to the page behind)."
            },
            {
              "kind": "method",
              "name": "requestClose",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "reason",
                  "default": "'button'",
                  "type": {
                    "text": "'escape' | 'scrim' | 'button'"
                  }
                }
              ],
              "description": "Ask the host to close (the host owns `open`)."
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "open",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "open"
            },
            {
              "name": "heading",
              "type": {
                "text": "string"
              },
              "default": "''",
              "fieldName": "heading"
            },
            {
              "name": "description",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "One muted line under the heading; also becomes the dialog's aria-describedby.",
              "fieldName": "description"
            },
            {
              "name": "show-close",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "fieldName": "showClose"
            },
            {
              "name": "placement",
              "type": {
                "text": "ModalPlacement"
              },
              "default": "'center'",
              "description": "`'center'` (default) dialog, `'sheet'` bottom sheet below 600px (centered\nfrom 600px up), or `'side'` full-height drawer at the inline end.",
              "fieldName": "placement"
            },
            {
              "name": "close-on-scrim",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Scrim click requests close. Off by default: a stray click outside the panel\nmust not throw away what the user typed — close via ×, Escape or your buttons.",
              "fieldName": "closeOnScrim"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-modal",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtModal",
          "declaration": {
            "name": "BahtModal",
            "module": "src/components/primitives/baht-modal.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-modal",
          "declaration": {
            "name": "BahtModal",
            "module": "src/components/primitives/baht-modal.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-multiselect.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Multi-pick rendered as a checkbox group; value = array of option keys.",
          "name": "BahtMultiselect",
          "members": [
            {
              "kind": "field",
              "name": "selected",
              "type": {
                "text": "string[]"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "toggle",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "key",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "on",
                  "type": {
                    "text": "boolean"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "renderControl",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "defaultDebounce",
              "type": {
                "text": "number"
              },
              "static": true,
              "default": "150",
              "description": "Default trailing debounce (ms) for TYPED edits — text, email, password,\ntextarea, number. Every keystroke otherwise re-runs the host's rules,\nvalidation and dependent-option fetches. Per element: the `debounce`\nproperty/attribute; `<baht-form options.inputDebounce>` sets it for a whole\nform. 0 = emit on every keystroke. Selects, checkboxes, radios, toggles,\ndates and files are never debounced — a pick is one event.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "field",
              "type": {
                "text": "FieldDescriptor"
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "unknown"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "showOptional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "attribute": "show-optional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "error",
              "type": {
                "text": "string | null"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "attribute": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typed",
              "type": {
                "text": "{ value: unknown; emitted: boolean } | null"
              },
              "privacy": "private",
              "default": "null",
              "description": "The keystrokes not yet (or just) handed to the host. The control keeps\nrendering `typed.value` until the host's `value` moves, so a re-render\nmid-typing (a sibling field changing) can't snap the text back.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typedTimer",
              "type": {
                "text": "ReturnType<typeof setTimeout> | undefined"
              },
              "privacy": "private",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "onFocusOut",
              "privacy": "private",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "effectiveDebounce",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitTyped",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "A typed edit: emitted after `debounce` ms of quiet (or at once when 0).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "flushTyped",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Hand a pending typed edit to the host now (blur, disconnect, host reads). Idempotent.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownValue",
              "type": {
                "text": "unknown"
              },
              "privacy": "protected",
              "description": "What a typed control shows: pending keystrokes win over a stale host value.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownText",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "description": "`shownValue` as control text: `''` for null/undefined, `String()` otherwise.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "assignedField",
              "type": {
                "text": "FieldDescriptor | undefined"
              },
              "privacy": "protected",
              "description": "`field` as the host may actually have left it: a framework can connect the element\nbefore it binds the descriptor, so internally it is optional until then.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitInput",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Emit the user's edit upward (composed so it crosses any boundary).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "hasFieldIcon",
              "type": {
                "text": "boolean"
              },
              "privacy": "protected",
              "description": "True when `field.icon` names a real icon — gates both the icon markup\nand the control's icon-padding class, so a typo/removed name never\nleaves the control indented for a glyph that isn't there.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderFieldIcon",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Leading icon for text/currency/textarea/dropdown controls (spec: field.icon).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabel",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabelMark",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Required asterisk, or the \"(optional)\" marker when the form asks for it.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "controlId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "labelId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "errorId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "helpId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "describedBy",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "id list for the control's aria-describedby: error first, then help.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "invalidAttr",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "'true' while the field is in error, else absent (styles hook on [aria-invalid]).",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtFieldBase",
            "module": "/src/components/field-base.js"
          },
          "tagName": "baht-multiselect",
          "customElement": true,
          "attributes": [
            {
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "show-optional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "fieldName": "showOptional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "fieldName": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtMultiselect",
          "declaration": {
            "name": "BahtMultiselect",
            "module": "src/components/primitives/baht-multiselect.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-multiselect",
          "declaration": {
            "name": "BahtMultiselect",
            "module": "src/components/primitives/baht-multiselect.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-notification-bell.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Header bell: an icon button with the unread count and a panel listing the\nnotifications. Opening emits `baht-open` (refresh then); picking one emits\n`baht-select` `{ id }` and closes; \"Mark all read\" emits `baht-mark-all`.\nEscape and a click outside close the panel. The host owns the data.",
          "name": "BahtNotificationBell",
          "members": [
            {
              "kind": "field",
              "name": "items",
              "type": {
                "text": "NotificationItem[]"
              },
              "default": "[]"
            },
            {
              "kind": "field",
              "name": "count",
              "type": {
                "text": "number | null"
              },
              "default": "null",
              "description": "Unread count on the badge; defaults to the unread items.",
              "attribute": "count"
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "'Notifications'",
              "attribute": "label"
            },
            {
              "kind": "field",
              "name": "emptyMessage",
              "type": {
                "text": "string"
              },
              "default": "'Nothing yet.'",
              "attribute": "empty-message"
            },
            {
              "kind": "field",
              "name": "open",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "default": "false"
            },
            {
              "kind": "field",
              "name": "onDocClick",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "onKey",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "unread",
              "type": {
                "text": "number"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "pick",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "id",
                  "type": {
                    "text": "string | number"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "toggle",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "count",
              "type": {
                "text": "number | null"
              },
              "default": "null",
              "description": "Unread count on the badge; defaults to the unread items.",
              "fieldName": "count"
            },
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "'Notifications'",
              "fieldName": "label"
            },
            {
              "name": "empty-message",
              "type": {
                "text": "string"
              },
              "default": "'Nothing yet.'",
              "fieldName": "emptyMessage"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-notification-bell",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtNotificationBell",
          "declaration": {
            "name": "BahtNotificationBell",
            "module": "src/components/primitives/baht-notification-bell.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-notification-bell",
          "declaration": {
            "name": "BahtNotificationBell",
            "module": "src/components/primitives/baht-notification-bell.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-number.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "",
          "name": "BahtNumber",
          "members": [
            {
              "kind": "method",
              "name": "renderControl",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "defaultDebounce",
              "type": {
                "text": "number"
              },
              "static": true,
              "default": "150",
              "description": "Default trailing debounce (ms) for TYPED edits — text, email, password,\ntextarea, number. Every keystroke otherwise re-runs the host's rules,\nvalidation and dependent-option fetches. Per element: the `debounce`\nproperty/attribute; `<baht-form options.inputDebounce>` sets it for a whole\nform. 0 = emit on every keystroke. Selects, checkboxes, radios, toggles,\ndates and files are never debounced — a pick is one event.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "field",
              "type": {
                "text": "FieldDescriptor"
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "unknown"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "showOptional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "attribute": "show-optional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "error",
              "type": {
                "text": "string | null"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "attribute": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typed",
              "type": {
                "text": "{ value: unknown; emitted: boolean } | null"
              },
              "privacy": "private",
              "default": "null",
              "description": "The keystrokes not yet (or just) handed to the host. The control keeps\nrendering `typed.value` until the host's `value` moves, so a re-render\nmid-typing (a sibling field changing) can't snap the text back.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typedTimer",
              "type": {
                "text": "ReturnType<typeof setTimeout> | undefined"
              },
              "privacy": "private",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "onFocusOut",
              "privacy": "private",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "effectiveDebounce",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitTyped",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "A typed edit: emitted after `debounce` ms of quiet (or at once when 0).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "flushTyped",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Hand a pending typed edit to the host now (blur, disconnect, host reads). Idempotent.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownValue",
              "type": {
                "text": "unknown"
              },
              "privacy": "protected",
              "description": "What a typed control shows: pending keystrokes win over a stale host value.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownText",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "description": "`shownValue` as control text: `''` for null/undefined, `String()` otherwise.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "assignedField",
              "type": {
                "text": "FieldDescriptor | undefined"
              },
              "privacy": "protected",
              "description": "`field` as the host may actually have left it: a framework can connect the element\nbefore it binds the descriptor, so internally it is optional until then.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitInput",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Emit the user's edit upward (composed so it crosses any boundary).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "hasFieldIcon",
              "type": {
                "text": "boolean"
              },
              "privacy": "protected",
              "description": "True when `field.icon` names a real icon — gates both the icon markup\nand the control's icon-padding class, so a typo/removed name never\nleaves the control indented for a glyph that isn't there.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderFieldIcon",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Leading icon for text/currency/textarea/dropdown controls (spec: field.icon).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabel",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabelMark",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Required asterisk, or the \"(optional)\" marker when the form asks for it.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "controlId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "labelId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "errorId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "helpId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "describedBy",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "id list for the control's aria-describedby: error first, then help.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "invalidAttr",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "'true' while the field is in error, else absent (styles hook on [aria-invalid]).",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtFieldBase",
            "module": "/src/components/field-base.js"
          },
          "tagName": "baht-number",
          "customElement": true,
          "attributes": [
            {
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "show-optional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "fieldName": "showOptional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "fieldName": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtNumber",
          "declaration": {
            "name": "BahtNumber",
            "module": "src/components/primitives/baht-number.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-number",
          "declaration": {
            "name": "BahtNumber",
            "module": "src/components/primitives/baht-number.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-otp.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "One-time-code input: N boxes, auto-advance, backspace steps back, paste\ndistributes. Emits `baht-change { value }` per edit and `baht-otp-complete { value }`\nwhen every box is filled.\n\n  <baht-otp length=\"6\"></baht-otp>",
          "name": "BahtOtp",
          "members": [
            {
              "kind": "field",
              "name": "length",
              "type": {
                "text": "number"
              },
              "default": "6",
              "attribute": "length"
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "string"
              },
              "default": "''",
              "attribute": "value"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "disabled"
            },
            {
              "kind": "field",
              "name": "mode",
              "type": {
                "text": "'numeric' | 'text'"
              },
              "default": "'numeric'",
              "description": "'numeric' restricts to digits; 'text' allows anything.",
              "attribute": "mode"
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "'One-time code'",
              "description": "Accessible name for the group of boxes.",
              "attribute": "label"
            },
            {
              "kind": "field",
              "name": "_chars",
              "type": {
                "text": "string[]"
              },
              "privacy": "private",
              "default": "[]",
              "description": "Per-box state, index-aligned; '' marks an empty box. This is the source\nof truth for rendering so that clearing box N never shifts box N+1's\ncharacter into its place. `value` stays a derived, compacted (gap-free)\nstring — the existing external contract (docs: a plain \"controlled\"\nstring of the digits typed so far, in order)."
            },
            {
              "kind": "field",
              "name": "_lastValue",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "default": "''",
              "description": "The compacted string `_chars` currently represents. Lets willUpdate tell\nan external `el.value = …` write (e.g. the docs' reset-on-failure\nexample) apart from `commit()` echoing its own assignment, without a\nboolean flag that could get stuck across a no-op property set."
            },
            {
              "kind": "field",
              "name": "_wasFull",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "default": "false",
              "description": "Previous \"every box filled\" state, so `baht-otp-complete` fires only on the\nnot-full → full transition, not on every edit while already full."
            },
            {
              "kind": "method",
              "name": "inputs",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "HTMLInputElement[]"
                }
              }
            },
            {
              "kind": "method",
              "name": "clean",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "raw",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "fill",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "number"
                }
              },
              "parameters": [
                {
                  "name": "start",
                  "type": {
                    "text": "number"
                  }
                },
                {
                  "name": "text",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "Writes `text` into `_chars` starting at `start`. Returns the index just\npast the last box written (may equal `this.length`)."
            },
            {
              "kind": "method",
              "name": "commit",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "onInput",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "i",
                  "type": {
                    "text": "number"
                  }
                },
                {
                  "name": "e",
                  "type": {
                    "text": "Event"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "onKeydown",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "i",
                  "type": {
                    "text": "number"
                  }
                },
                {
                  "name": "e",
                  "type": {
                    "text": "KeyboardEvent"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "onPaste",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "e",
                  "type": {
                    "text": "ClipboardEvent"
                  }
                }
              ]
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "length",
              "type": {
                "text": "number"
              },
              "default": "6",
              "fieldName": "length"
            },
            {
              "name": "value",
              "type": {
                "text": "string"
              },
              "default": "''",
              "fieldName": "value"
            },
            {
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "disabled"
            },
            {
              "name": "mode",
              "type": {
                "text": "'numeric' | 'text'"
              },
              "default": "'numeric'",
              "description": "'numeric' restricts to digits; 'text' allows anything.",
              "fieldName": "mode"
            },
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "'One-time code'",
              "description": "Accessible name for the group of boxes.",
              "fieldName": "label"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-otp",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtOtp",
          "declaration": {
            "name": "BahtOtp",
            "module": "src/components/primitives/baht-otp.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-otp",
          "declaration": {
            "name": "BahtOtp",
            "module": "src/components/primitives/baht-otp.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-pagination.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Server-side pagination control: it never slices data — it only reports the\npage the user asked for via `baht-page-change`; the host fetches that page.\n\n  <baht-pagination page=\"4\" total-pages=\"20\"></baht-pagination>\n  <baht-pagination variant=\"compact\" page=\"1\" total-pages=\"3\"></baht-pagination>\n\n`variant=\"cursor\"` drops page numbers entirely — the host doesn't know a\ntotal, only whether another page exists in either direction:\n\n  <baht-pagination variant=\"cursor\" has-next has-prev></baht-pagination>\n  el.addEventListener('baht-cursor-change', (e) => fetchPage(e.detail.direction));",
          "name": "BahtPagination",
          "members": [
            {
              "kind": "field",
              "name": "page",
              "type": {
                "text": "number"
              },
              "default": "1",
              "attribute": "page"
            },
            {
              "kind": "field",
              "name": "totalPages",
              "type": {
                "text": "number"
              },
              "default": "1",
              "attribute": "total-pages"
            },
            {
              "kind": "field",
              "name": "variant",
              "type": {
                "text": "'numbered' | 'compact' | 'cursor'"
              },
              "default": "'numbered'",
              "description": "'numbered' = 1 … 4 5 6 … 20 · 'compact' = « Page 4 of 20 · 'cursor' = « Prev / Next »",
              "attribute": "variant"
            },
            {
              "kind": "field",
              "name": "siblings",
              "type": {
                "text": "number"
              },
              "default": "1",
              "description": "Numbered pages shown on each side of the current page.",
              "attribute": "siblings"
            },
            {
              "kind": "field",
              "name": "hasNext",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "cursor variant only — whether a next/previous page is available.",
              "attribute": "has-next"
            },
            {
              "kind": "field",
              "name": "hasPrev",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "has-prev"
            },
            {
              "kind": "method",
              "name": "go",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "page",
                  "type": {
                    "text": "number"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "goCursor",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "direction",
                  "type": {
                    "text": "'next' | 'prev'"
                  }
                }
              ]
            },
            {
              "kind": "field",
              "name": "pageItems",
              "type": {
                "text": "(number | null)[]"
              },
              "privacy": "private",
              "description": "Visible page numbers with `null` marking an ellipsis gap.",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "page",
              "type": {
                "text": "number"
              },
              "default": "1",
              "fieldName": "page"
            },
            {
              "name": "total-pages",
              "type": {
                "text": "number"
              },
              "default": "1",
              "fieldName": "totalPages"
            },
            {
              "name": "variant",
              "type": {
                "text": "'numbered' | 'compact' | 'cursor'"
              },
              "default": "'numbered'",
              "description": "'numbered' = 1 … 4 5 6 … 20 · 'compact' = « Page 4 of 20 · 'cursor' = « Prev / Next »",
              "fieldName": "variant"
            },
            {
              "name": "siblings",
              "type": {
                "text": "number"
              },
              "default": "1",
              "description": "Numbered pages shown on each side of the current page.",
              "fieldName": "siblings"
            },
            {
              "name": "has-next",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "cursor variant only — whether a next/previous page is available.",
              "fieldName": "hasNext"
            },
            {
              "name": "has-prev",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "hasPrev"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-pagination",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtPagination",
          "declaration": {
            "name": "BahtPagination",
            "module": "src/components/primitives/baht-pagination.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-pagination",
          "declaration": {
            "name": "BahtPagination",
            "module": "src/components/primitives/baht-pagination.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-popover.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "A floating panel anchored to a trigger — filters, a quick-edit form, a hover card you click\nopen. The FIRST child is the trigger; everything after it becomes the panel (a non-modal\n`role=\"dialog\"`, named by `label`).\n\n  <baht-popover label=\"Filters\" placement=\"bottom-start\">\n    <baht-button variant=\"secondary\" icon=\"search\">Filters</baht-button>\n    <baht-select …></baht-select>\n    <baht-button size=\"sm\">Apply</baht-button>\n  </baht-popover>\n\nClicking the trigger toggles it; opening moves focus to the first field in the panel\n(or the panel). Escape closes it and returns focus to the trigger (marked handled, so a\nsurrounding `<baht-modal>` stays open); a click outside closes it too. `open` can also be\nset by the host. The trigger gets `aria-haspopup=\"dialog\"`, `aria-expanded`, `aria-controls`.",
          "name": "BahtPopover",
          "members": [
            {
              "kind": "field",
              "name": "open",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "open",
              "reflects": true
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Accessible name of the panel.",
              "attribute": "label"
            },
            {
              "kind": "field",
              "name": "placement",
              "type": {
                "text": "PopoverPlacement"
              },
              "default": "'bottom-start'",
              "description": "Where the panel sits relative to the trigger.",
              "attribute": "placement"
            },
            {
              "kind": "field",
              "name": "anchorEl",
              "type": {
                "text": "HTMLElement"
              },
              "privacy": "private"
            },
            {
              "kind": "field",
              "name": "panelEl",
              "type": {
                "text": "HTMLElement"
              },
              "privacy": "private"
            },
            {
              "kind": "field",
              "name": "panelId",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "trigger",
              "type": {
                "text": "HTMLElement | null"
              },
              "privacy": "private",
              "description": "The focusable element that opens the panel (inside the trigger child).",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "wireTrigger",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "setOpen",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "open",
                  "type": {
                    "text": "boolean"
                  }
                },
                {
                  "name": "focus",
                  "type": {
                    "text": "boolean"
                  }
                }
              ]
            },
            {
              "kind": "field",
              "name": "onDocMousedown",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "onKeydown",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "events": [
            {
              "description": "The user opened or closed it. `detail: { open }`.",
              "name": "baht-toggle"
            },
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "open",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "open"
            },
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Accessible name of the panel.",
              "fieldName": "label"
            },
            {
              "name": "placement",
              "type": {
                "text": "PopoverPlacement"
              },
              "default": "'bottom-start'",
              "description": "Where the panel sits relative to the trigger.",
              "fieldName": "placement"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-popover",
          "customElement": true
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtPopover",
          "declaration": {
            "name": "BahtPopover",
            "module": "src/components/primitives/baht-popover.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-popover",
          "declaration": {
            "name": "BahtPopover",
            "module": "src/components/primitives/baht-popover.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-progress-ring.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Circular single-value \"percent used\" ring — the round counterpart to\n`<baht-progress>`'s linear bar. Center shows the rounded percentage; an\noptional caption reads what it's a percentage of.\n\n  <baht-progress-ring value=\"80\" label=\"of budget used\"></baht-progress-ring>",
          "name": "BahtProgressRing",
          "members": [
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "number"
              },
              "default": "0",
              "description": "0-100, clamped.",
              "attribute": "value"
            },
            {
              "kind": "field",
              "name": "tone",
              "type": {
                "text": "ProgressRingTone"
              },
              "default": "'primary'",
              "attribute": "tone"
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Caption under the percentage, e.g. \"of budget used\".",
              "attribute": "label"
            },
            {
              "kind": "field",
              "name": "size",
              "type": {
                "text": "number"
              },
              "default": "112",
              "description": "Rendered pixel size (square).",
              "attribute": "size"
            },
            {
              "kind": "field",
              "name": "R",
              "type": {
                "text": "number"
              },
              "privacy": "private",
              "static": true,
              "readonly": true,
              "default": "48"
            },
            {
              "kind": "field",
              "name": "STROKE",
              "type": {
                "text": "number"
              },
              "privacy": "private",
              "static": true,
              "readonly": true,
              "default": "12"
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "value",
              "type": {
                "text": "number"
              },
              "default": "0",
              "description": "0-100, clamped.",
              "fieldName": "value"
            },
            {
              "name": "tone",
              "type": {
                "text": "ProgressRingTone"
              },
              "default": "'primary'",
              "fieldName": "tone"
            },
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Caption under the percentage, e.g. \"of budget used\".",
              "fieldName": "label"
            },
            {
              "name": "size",
              "type": {
                "text": "number"
              },
              "default": "112",
              "description": "Rendered pixel size (square).",
              "fieldName": "size"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-progress-ring",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtProgressRing",
          "declaration": {
            "name": "BahtProgressRing",
            "module": "src/components/primitives/baht-progress-ring.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-progress-ring",
          "declaration": {
            "name": "BahtProgressRing",
            "module": "src/components/primitives/baht-progress-ring.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-progress.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Progress bar. `value` 0–100; omit (null) for indeterminate.\n\n  <baht-progress value=\"65\" show-label></baht-progress>\n  <baht-progress></baht-progress>                          <!-- indeterminate -->",
          "name": "BahtProgress",
          "members": [
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "number | null"
              },
              "default": "null",
              "attribute": "value"
            },
            {
              "kind": "field",
              "name": "tone",
              "type": {
                "text": "'primary' | 'success' | 'warning' | 'danger'"
              },
              "default": "'primary'",
              "attribute": "tone"
            },
            {
              "kind": "field",
              "name": "showLabel",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "show-label"
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "'Progress'",
              "description": "Accessible name for the progressbar.",
              "attribute": "label"
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "value",
              "type": {
                "text": "number | null"
              },
              "default": "null",
              "fieldName": "value"
            },
            {
              "name": "tone",
              "type": {
                "text": "'primary' | 'success' | 'warning' | 'danger'"
              },
              "default": "'primary'",
              "fieldName": "tone"
            },
            {
              "name": "show-label",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "showLabel"
            },
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "'Progress'",
              "description": "Accessible name for the progressbar.",
              "fieldName": "label"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-progress",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtProgress",
          "declaration": {
            "name": "BahtProgress",
            "module": "src/components/primitives/baht-progress.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-progress",
          "declaration": {
            "name": "BahtProgress",
            "module": "src/components/primitives/baht-progress.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-radio.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "",
          "name": "BahtRadio",
          "members": [
            {
              "kind": "method",
              "name": "renderOption",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "parameters": [
                {
                  "name": "o",
                  "type": {
                    "text": "FieldOption"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "renderCardOption",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "parameters": [
                {
                  "name": "o",
                  "type": {
                    "text": "FieldOption"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "renderControl",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "defaultDebounce",
              "type": {
                "text": "number"
              },
              "static": true,
              "default": "150",
              "description": "Default trailing debounce (ms) for TYPED edits — text, email, password,\ntextarea, number. Every keystroke otherwise re-runs the host's rules,\nvalidation and dependent-option fetches. Per element: the `debounce`\nproperty/attribute; `<baht-form options.inputDebounce>` sets it for a whole\nform. 0 = emit on every keystroke. Selects, checkboxes, radios, toggles,\ndates and files are never debounced — a pick is one event.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "field",
              "type": {
                "text": "FieldDescriptor"
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "unknown"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "showOptional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "attribute": "show-optional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "error",
              "type": {
                "text": "string | null"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "attribute": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typed",
              "type": {
                "text": "{ value: unknown; emitted: boolean } | null"
              },
              "privacy": "private",
              "default": "null",
              "description": "The keystrokes not yet (or just) handed to the host. The control keeps\nrendering `typed.value` until the host's `value` moves, so a re-render\nmid-typing (a sibling field changing) can't snap the text back.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typedTimer",
              "type": {
                "text": "ReturnType<typeof setTimeout> | undefined"
              },
              "privacy": "private",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "onFocusOut",
              "privacy": "private",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "effectiveDebounce",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitTyped",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "A typed edit: emitted after `debounce` ms of quiet (or at once when 0).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "flushTyped",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Hand a pending typed edit to the host now (blur, disconnect, host reads). Idempotent.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownValue",
              "type": {
                "text": "unknown"
              },
              "privacy": "protected",
              "description": "What a typed control shows: pending keystrokes win over a stale host value.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownText",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "description": "`shownValue` as control text: `''` for null/undefined, `String()` otherwise.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "assignedField",
              "type": {
                "text": "FieldDescriptor | undefined"
              },
              "privacy": "protected",
              "description": "`field` as the host may actually have left it: a framework can connect the element\nbefore it binds the descriptor, so internally it is optional until then.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitInput",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Emit the user's edit upward (composed so it crosses any boundary).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "hasFieldIcon",
              "type": {
                "text": "boolean"
              },
              "privacy": "protected",
              "description": "True when `field.icon` names a real icon — gates both the icon markup\nand the control's icon-padding class, so a typo/removed name never\nleaves the control indented for a glyph that isn't there.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderFieldIcon",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Leading icon for text/currency/textarea/dropdown controls (spec: field.icon).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabel",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabelMark",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Required asterisk, or the \"(optional)\" marker when the form asks for it.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "controlId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "labelId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "errorId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "helpId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "describedBy",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "id list for the control's aria-describedby: error first, then help.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "invalidAttr",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "'true' while the field is in error, else absent (styles hook on [aria-invalid]).",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtFieldBase",
            "module": "/src/components/field-base.js"
          },
          "tagName": "baht-radio",
          "customElement": true,
          "attributes": [
            {
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "show-optional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "fieldName": "showOptional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "fieldName": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtRadio",
          "declaration": {
            "name": "BahtRadio",
            "module": "src/components/primitives/baht-radio.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-radio",
          "declaration": {
            "name": "BahtRadio",
            "module": "src/components/primitives/baht-radio.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-range.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Range slider. Two modes, one tag:\n\n- **Standalone** (no `field`): `value` / `min` / `max` / `step` / `label`; emits\n  `baht-change { value }` (a number) on every input.\n\n    <baht-range min=\"0\" max=\"100\" step=\"5\" value=\"40\" label=\"Retry limit\"></baht-range>\n\n- **Form field** (`type: 'range'`, set by `<baht-form>`): bounds from `field.min` /\n  `field.max` / `field.step` (default 0 / 100 / 1), field label / help / error; emits\n  `baht-input { key, value }` debounced while sliding and at once on release. `null`\n  (untouched) parks the thumb at `min` and reads \"—\".",
          "name": "BahtRange",
          "members": [
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "unknown"
              },
              "default": "0",
              "description": "Current value. Standalone: a number. Field mode: `number | null` (null = untouched).",
              "attribute": "value",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "min",
              "type": {
                "text": "number"
              },
              "default": "0",
              "description": "Standalone lower bound; a field uses `field.min`.",
              "attribute": "min"
            },
            {
              "kind": "field",
              "name": "max",
              "type": {
                "text": "number"
              },
              "default": "100",
              "description": "Standalone upper bound; a field uses `field.max`.",
              "attribute": "max"
            },
            {
              "kind": "field",
              "name": "step",
              "type": {
                "text": "number"
              },
              "default": "1",
              "description": "Standalone step; a field uses `field.step`.",
              "attribute": "step"
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Standalone visible label; a field uses its label.",
              "attribute": "label"
            },
            {
              "kind": "field",
              "name": "showValue",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "description": "Show the current value next to the slider.",
              "attribute": "show-value"
            },
            {
              "kind": "field",
              "name": "isField",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "bounds",
              "type": {
                "text": "{ min: number; max: number; step: number }"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "inputId",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "onInput",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "e",
                  "type": {
                    "text": "Event"
                  }
                },
                {
                  "name": "released",
                  "type": {
                    "text": "boolean"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "renderControl",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "defaultDebounce",
              "type": {
                "text": "number"
              },
              "static": true,
              "default": "150",
              "description": "Default trailing debounce (ms) for TYPED edits — text, email, password,\ntextarea, number. Every keystroke otherwise re-runs the host's rules,\nvalidation and dependent-option fetches. Per element: the `debounce`\nproperty/attribute; `<baht-form options.inputDebounce>` sets it for a whole\nform. 0 = emit on every keystroke. Selects, checkboxes, radios, toggles,\ndates and files are never debounced — a pick is one event.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "field",
              "type": {
                "text": "FieldDescriptor"
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "showOptional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "attribute": "show-optional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "error",
              "type": {
                "text": "string | null"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "attribute": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typed",
              "type": {
                "text": "{ value: unknown; emitted: boolean } | null"
              },
              "privacy": "private",
              "default": "null",
              "description": "The keystrokes not yet (or just) handed to the host. The control keeps\nrendering `typed.value` until the host's `value` moves, so a re-render\nmid-typing (a sibling field changing) can't snap the text back.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typedTimer",
              "type": {
                "text": "ReturnType<typeof setTimeout> | undefined"
              },
              "privacy": "private",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "onFocusOut",
              "privacy": "private",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "effectiveDebounce",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitTyped",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "A typed edit: emitted after `debounce` ms of quiet (or at once when 0).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "flushTyped",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Hand a pending typed edit to the host now (blur, disconnect, host reads). Idempotent.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownValue",
              "type": {
                "text": "unknown"
              },
              "privacy": "protected",
              "description": "What a typed control shows: pending keystrokes win over a stale host value.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownText",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "description": "`shownValue` as control text: `''` for null/undefined, `String()` otherwise.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "assignedField",
              "type": {
                "text": "FieldDescriptor | undefined"
              },
              "privacy": "protected",
              "description": "`field` as the host may actually have left it: a framework can connect the element\nbefore it binds the descriptor, so internally it is optional until then.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitInput",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Emit the user's edit upward (composed so it crosses any boundary).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "hasFieldIcon",
              "type": {
                "text": "boolean"
              },
              "privacy": "protected",
              "description": "True when `field.icon` names a real icon — gates both the icon markup\nand the control's icon-padding class, so a typo/removed name never\nleaves the control indented for a glyph that isn't there.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderFieldIcon",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Leading icon for text/currency/textarea/dropdown controls (spec: field.icon).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabel",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabelMark",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Required asterisk, or the \"(optional)\" marker when the form asks for it.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "controlId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "labelId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "errorId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "helpId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "describedBy",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "id list for the control's aria-describedby: error first, then help.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "invalidAttr",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "'true' while the field is in error, else absent (styles hook on [aria-invalid]).",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "events": [
            {
              "description": "Standalone mode: the slider moved. `detail: { value }`.",
              "name": "baht-change"
            },
            {
              "description": "Field mode: the slider moved. `detail: { key, value }`.",
              "name": "baht-input"
            },
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "value",
              "type": {
                "text": "unknown"
              },
              "default": "0",
              "description": "Current value. Standalone: a number. Field mode: `number | null` (null = untouched).",
              "fieldName": "value"
            },
            {
              "name": "min",
              "type": {
                "text": "number"
              },
              "default": "0",
              "description": "Standalone lower bound; a field uses `field.min`.",
              "fieldName": "min"
            },
            {
              "name": "max",
              "type": {
                "text": "number"
              },
              "default": "100",
              "description": "Standalone upper bound; a field uses `field.max`.",
              "fieldName": "max"
            },
            {
              "name": "step",
              "type": {
                "text": "number"
              },
              "default": "1",
              "description": "Standalone step; a field uses `field.step`.",
              "fieldName": "step"
            },
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Standalone visible label; a field uses its label.",
              "fieldName": "label"
            },
            {
              "name": "show-value",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "description": "Show the current value next to the slider.",
              "fieldName": "showValue"
            },
            {
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "show-optional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "fieldName": "showOptional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "fieldName": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtFieldBase",
            "module": "/src/components/field-base.js"
          },
          "tagName": "baht-range",
          "customElement": true
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtRange",
          "declaration": {
            "name": "BahtRange",
            "module": "src/components/primitives/baht-range.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-range",
          "declaration": {
            "name": "BahtRange",
            "module": "src/components/primitives/baht-range.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-rating.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Star rating. Two modes, one tag:\n\n- **Standalone** (no `field`): controlled by `value` / `max` / `label`; emits\n  `baht-change { value }`, where re-picking the current star clears to `0`.\n\n    <baht-rating value=\"3\" max=\"5\"></baht-rating>\n    <baht-rating value=\"4\" readonly></baht-rating>\n\n- **Form field** (`type: 'rating'`, set by `<baht-form>`): `field.max` stars\n  (1–10, default 5), field label / help / error, emits `baht-input { key, value }`\n  with a whole number of stars, or `null` when re-picking the current star clears it.\n\nKeyboard (APG radio group): arrows move the value, Home / End jump the ends.",
          "name": "BahtRating",
          "members": [
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "unknown"
              },
              "default": "0",
              "description": "Picked star count. Standalone: a number (`0` = none). Field mode: `number | null`.",
              "attribute": "value",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "max",
              "type": {
                "text": "number"
              },
              "default": "5",
              "description": "Standalone star count; a field uses `field.max` instead.",
              "attribute": "max"
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "'Rating'",
              "description": "Standalone accessible name for the radiogroup; a field uses its label.",
              "attribute": "label"
            },
            {
              "kind": "field",
              "name": "hover",
              "type": {
                "text": "number"
              },
              "privacy": "private",
              "default": "0"
            },
            {
              "kind": "field",
              "name": "isField",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "starCount",
              "type": {
                "text": "number"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "stars",
              "type": {
                "text": "number"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "locked",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "emitValue",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "n",
                  "type": {
                    "text": "number"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "pick",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "n",
                  "type": {
                    "text": "number"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "onKeydown",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "e",
                  "type": {
                    "text": "KeyboardEvent"
                  }
                },
                {
                  "name": "n",
                  "type": {
                    "text": "number"
                  }
                }
              ],
              "description": "APG radio-group keys: arrows move the value, Home/End jump the ends."
            },
            {
              "kind": "method",
              "name": "setHover",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "n",
                  "type": {
                    "text": "number"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "renderControl",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "defaultDebounce",
              "type": {
                "text": "number"
              },
              "static": true,
              "default": "150",
              "description": "Default trailing debounce (ms) for TYPED edits — text, email, password,\ntextarea, number. Every keystroke otherwise re-runs the host's rules,\nvalidation and dependent-option fetches. Per element: the `debounce`\nproperty/attribute; `<baht-form options.inputDebounce>` sets it for a whole\nform. 0 = emit on every keystroke. Selects, checkboxes, radios, toggles,\ndates and files are never debounced — a pick is one event.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "field",
              "type": {
                "text": "FieldDescriptor"
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "showOptional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "attribute": "show-optional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "error",
              "type": {
                "text": "string | null"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "attribute": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typed",
              "type": {
                "text": "{ value: unknown; emitted: boolean } | null"
              },
              "privacy": "private",
              "default": "null",
              "description": "The keystrokes not yet (or just) handed to the host. The control keeps\nrendering `typed.value` until the host's `value` moves, so a re-render\nmid-typing (a sibling field changing) can't snap the text back.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typedTimer",
              "type": {
                "text": "ReturnType<typeof setTimeout> | undefined"
              },
              "privacy": "private",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "onFocusOut",
              "privacy": "private",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "effectiveDebounce",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitTyped",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "A typed edit: emitted after `debounce` ms of quiet (or at once when 0).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "flushTyped",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Hand a pending typed edit to the host now (blur, disconnect, host reads). Idempotent.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownValue",
              "type": {
                "text": "unknown"
              },
              "privacy": "protected",
              "description": "What a typed control shows: pending keystrokes win over a stale host value.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownText",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "description": "`shownValue` as control text: `''` for null/undefined, `String()` otherwise.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "assignedField",
              "type": {
                "text": "FieldDescriptor | undefined"
              },
              "privacy": "protected",
              "description": "`field` as the host may actually have left it: a framework can connect the element\nbefore it binds the descriptor, so internally it is optional until then.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitInput",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Emit the user's edit upward (composed so it crosses any boundary).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "hasFieldIcon",
              "type": {
                "text": "boolean"
              },
              "privacy": "protected",
              "description": "True when `field.icon` names a real icon — gates both the icon markup\nand the control's icon-padding class, so a typo/removed name never\nleaves the control indented for a glyph that isn't there.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderFieldIcon",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Leading icon for text/currency/textarea/dropdown controls (spec: field.icon).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabel",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabelMark",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Required asterisk, or the \"(optional)\" marker when the form asks for it.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "controlId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "labelId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "errorId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "helpId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "describedBy",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "id list for the control's aria-describedby: error first, then help.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "invalidAttr",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "'true' while the field is in error, else absent (styles hook on [aria-invalid]).",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "events": [
            {
              "description": "Standalone mode: a star was picked. `detail: { value }` (0 = cleared).",
              "name": "baht-change"
            },
            {
              "description": "Field mode: a star was picked. `detail: { key, value }` (null = cleared).",
              "name": "baht-input"
            },
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "value",
              "type": {
                "text": "unknown"
              },
              "default": "0",
              "description": "Picked star count. Standalone: a number (`0` = none). Field mode: `number | null`.",
              "fieldName": "value"
            },
            {
              "name": "max",
              "type": {
                "text": "number"
              },
              "default": "5",
              "description": "Standalone star count; a field uses `field.max` instead.",
              "fieldName": "max"
            },
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "'Rating'",
              "description": "Standalone accessible name for the radiogroup; a field uses its label.",
              "fieldName": "label"
            },
            {
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "show-optional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "fieldName": "showOptional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "fieldName": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtFieldBase",
            "module": "/src/components/field-base.js"
          },
          "tagName": "baht-rating",
          "customElement": true
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtRating",
          "declaration": {
            "name": "BahtRating",
            "module": "src/components/primitives/baht-rating.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-rating",
          "declaration": {
            "name": "BahtRating",
            "module": "src/components/primitives/baht-rating.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-reference-picker.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Reference lookup: read-only input + magnifier opening a typeahead dropdown.\nThe host supplies the data via `fetcher(term)`; the component owns the\ndebounce, the dropdown, and the keyboard interaction.\n\n  const el = document.createElement('baht-reference-picker');\n  el.fetcher = (term) => api.search('sys_user', term);   // Promise<ReferenceOption[]>\n  el.value = '6816f79cc0a8016401c5a33be04be441';\n  el.display = 'Abel Tuter';\n  el.addEventListener('baht-change', (e) => onPick(e.detail)); // { value, label }\n\nClearing emits `baht-change` with `{ value: '', label: '' }`. Set `href` to\nrender an open-record link next to the lookup button.\n\n**Form field** (`type: 'reference'`, set by `<baht-form>`): `lookup` replaces `fetcher` /\n`display` — `<baht-form>` binds `registry.references[field.reference]` with the form data.\nThe value is the picked record's id (`null` when cleared), emitted as\n`baht-input { key, value }`; an existing id is shown by `lookup.resolve(id)`'s label (or\nraw, without a resolver). Field label / help / error as for every field.",
          "name": "BahtReferencePicker",
          "members": [
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "'Reference'",
              "description": "Accessible name for the combobox + its option list (standalone; a field uses its label).",
              "attribute": "label"
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "unknown"
              },
              "default": "''",
              "description": "Selected id (the reference's key). Field mode: `string | null`.",
              "attribute": "value",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "display",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Human-readable label for `value`; falls back to showing the raw id.",
              "attribute": "display"
            },
            {
              "kind": "field",
              "name": "placeholder",
              "type": {
                "text": "string"
              },
              "default": "''",
              "attribute": "placeholder"
            },
            {
              "kind": "field",
              "name": "invalid",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Marks the control invalid (styles + aria-invalid).",
              "attribute": "invalid"
            },
            {
              "kind": "field",
              "name": "href",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Optional link to the selected record, rendered as an external-link button.",
              "attribute": "href"
            },
            {
              "kind": "field",
              "name": "lookupLabel",
              "type": {
                "text": "string"
              },
              "default": "'Look up records'",
              "description": "Accessible name for the lookup button.",
              "attribute": "lookup-label"
            },
            {
              "kind": "field",
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for search calls, ms (default 200).",
              "attribute": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "fetcher",
              "type": {
                "text": "((term: string) => Promise<ReferenceOption[]>) | null"
              },
              "default": "null",
              "description": "Async search: term in, options out. Required for the dropdown to work (standalone)."
            },
            {
              "kind": "field",
              "name": "lookup",
              "type": {
                "text": "FieldReferenceLookup | null"
              },
              "default": "null",
              "description": "Field mode: the record lookup (set by `<baht-form>` from `registry.references`)."
            },
            {
              "kind": "field",
              "name": "labels",
              "privacy": "private",
              "default": "new Map<string, string>()"
            },
            {
              "kind": "field",
              "name": "resolving",
              "privacy": "private",
              "default": "new Set<string>()"
            },
            {
              "kind": "field",
              "name": "open",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "default": "false"
            },
            {
              "kind": "field",
              "name": "term",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "default": "''"
            },
            {
              "kind": "field",
              "name": "options",
              "type": {
                "text": "ReferenceOption[]"
              },
              "privacy": "private",
              "default": "[]"
            },
            {
              "kind": "field",
              "name": "loading",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "default": "false"
            },
            {
              "kind": "field",
              "name": "activeIndex",
              "type": {
                "text": "number"
              },
              "privacy": "private",
              "default": "-1"
            },
            {
              "kind": "field",
              "name": "inputEl",
              "type": {
                "text": "HTMLInputElement | null"
              },
              "privacy": "private"
            },
            {
              "kind": "field",
              "name": "listboxId",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "timer",
              "type": {
                "text": "ReturnType<typeof setTimeout> | undefined"
              },
              "privacy": "private"
            },
            {
              "kind": "field",
              "name": "fetchSeq",
              "type": {
                "text": "number"
              },
              "privacy": "private",
              "default": "0"
            },
            {
              "kind": "field",
              "name": "onDocMousedown",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "isField",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "locked",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "recordId",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "resolveLabel",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "Promise<void>"
                }
              },
              "description": "Field mode: look up the label of an id we have not seen picked."
            },
            {
              "kind": "method",
              "name": "openLookup",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "close",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "search",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "term",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "runFetch",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "Promise<void>"
                }
              },
              "parameters": [
                {
                  "name": "term",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "pick",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "option",
                  "type": {
                    "text": "ReferenceOption"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "clear",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "emitChange",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "label",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "field",
              "name": "onInput",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "onKeydown",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "comboboxAria",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "{\n    label: string | typeof nothing;\n    labelledby: string | typeof nothing;\n    required: string | typeof nothing;\n    describedby: string | typeof nothing;\n    invalid: string | typeof nothing;\n    listName: string;\n  }"
                }
              },
              "description": "ARIA wiring that differs by mode: a field points at its label / help / error."
            },
            {
              "kind": "field",
              "name": "inputText",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "description": "What the closed input shows: the record's label when known, else its id.",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "renderControl",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderClear",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              }
            },
            {
              "kind": "method",
              "name": "renderList",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "parameters": [
                {
                  "name": "id",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "field",
              "name": "defaultDebounce",
              "type": {
                "text": "number"
              },
              "static": true,
              "default": "150",
              "description": "Default trailing debounce (ms) for TYPED edits — text, email, password,\ntextarea, number. Every keystroke otherwise re-runs the host's rules,\nvalidation and dependent-option fetches. Per element: the `debounce`\nproperty/attribute; `<baht-form options.inputDebounce>` sets it for a whole\nform. 0 = emit on every keystroke. Selects, checkboxes, radios, toggles,\ndates and files are never debounced — a pick is one event.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "field",
              "type": {
                "text": "FieldDescriptor"
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "showOptional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "attribute": "show-optional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "error",
              "type": {
                "text": "string | null"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typed",
              "type": {
                "text": "{ value: unknown; emitted: boolean } | null"
              },
              "privacy": "private",
              "default": "null",
              "description": "The keystrokes not yet (or just) handed to the host. The control keeps\nrendering `typed.value` until the host's `value` moves, so a re-render\nmid-typing (a sibling field changing) can't snap the text back.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typedTimer",
              "type": {
                "text": "ReturnType<typeof setTimeout> | undefined"
              },
              "privacy": "private",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "onFocusOut",
              "privacy": "private",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "effectiveDebounce",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitTyped",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "A typed edit: emitted after `debounce` ms of quiet (or at once when 0).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "flushTyped",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Hand a pending typed edit to the host now (blur, disconnect, host reads). Idempotent.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownValue",
              "type": {
                "text": "unknown"
              },
              "privacy": "protected",
              "description": "What a typed control shows: pending keystrokes win over a stale host value.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownText",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "description": "`shownValue` as control text: `''` for null/undefined, `String()` otherwise.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "assignedField",
              "type": {
                "text": "FieldDescriptor | undefined"
              },
              "privacy": "protected",
              "description": "`field` as the host may actually have left it: a framework can connect the element\nbefore it binds the descriptor, so internally it is optional until then.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitInput",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Emit the user's edit upward (composed so it crosses any boundary).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "hasFieldIcon",
              "type": {
                "text": "boolean"
              },
              "privacy": "protected",
              "description": "True when `field.icon` names a real icon — gates both the icon markup\nand the control's icon-padding class, so a typo/removed name never\nleaves the control indented for a glyph that isn't there.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderFieldIcon",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Leading icon for text/currency/textarea/dropdown controls (spec: field.icon).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabel",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabelMark",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Required asterisk, or the \"(optional)\" marker when the form asks for it.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "controlId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "labelId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "errorId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "helpId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "describedBy",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "id list for the control's aria-describedby: error first, then help.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "invalidAttr",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "'true' while the field is in error, else absent (styles hook on [aria-invalid]).",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "events": [
            {
              "description": "Standalone mode: a record was picked or cleared. `detail: { value, label }`.",
              "name": "baht-change"
            },
            {
              "description": "Field mode: a record was picked or cleared. `detail: { key, value }`.",
              "name": "baht-input"
            },
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "'Reference'",
              "description": "Accessible name for the combobox + its option list (standalone; a field uses its label).",
              "fieldName": "label"
            },
            {
              "name": "value",
              "type": {
                "text": "unknown"
              },
              "default": "''",
              "description": "Selected id (the reference's key). Field mode: `string | null`.",
              "fieldName": "value"
            },
            {
              "name": "display",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Human-readable label for `value`; falls back to showing the raw id.",
              "fieldName": "display"
            },
            {
              "name": "placeholder",
              "type": {
                "text": "string"
              },
              "default": "''",
              "fieldName": "placeholder"
            },
            {
              "name": "invalid",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Marks the control invalid (styles + aria-invalid).",
              "fieldName": "invalid"
            },
            {
              "name": "href",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Optional link to the selected record, rendered as an external-link button.",
              "fieldName": "href"
            },
            {
              "name": "lookup-label",
              "type": {
                "text": "string"
              },
              "default": "'Look up records'",
              "description": "Accessible name for the lookup button.",
              "fieldName": "lookupLabel"
            },
            {
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for search calls, ms (default 200).",
              "fieldName": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "show-optional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "fieldName": "showOptional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtFieldBase",
            "module": "/src/components/field-base.js"
          },
          "tagName": "baht-reference-picker",
          "customElement": true
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "ReferenceOption",
          "declaration": {
            "name": "ReferenceOption",
            "module": "../../core/types.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtReferencePicker",
          "declaration": {
            "name": "BahtReferencePicker",
            "module": "src/components/primitives/baht-reference-picker.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-reference-picker",
          "declaration": {
            "name": "BahtReferencePicker",
            "module": "src/components/primitives/baht-reference-picker.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-repeater.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "<baht-repeater> — array-of-rows control (spec 01 §10). `value` is an array\nof row objects; every row renders the same `field.fields` sub-descriptors\n(one level deep — nested repeaters are skipped). Controlled like every\nprimitive: edits emit the WHOLE array via `baht-input`; the host re-feeds.",
          "name": "BahtRepeater",
          "members": [
            {
              "kind": "field",
              "name": "rowErrors",
              "type": {
                "text": "ValidationError[]"
              },
              "default": "[]",
              "description": "Row-scoped errors from the host form, keyed `key[i].subKey`."
            },
            {
              "kind": "field",
              "name": "rowStates",
              "type": {
                "text": "Record<string, DerivedFieldState>"
              },
              "default": "{}",
              "description": "Rule-derived states of the row sub-fields, keyed `key[i].sub` (spec 02\n§2a). Absent = every sub-field visible with its descriptor defaults."
            },
            {
              "kind": "field",
              "name": "rows",
              "type": {
                "text": "Record<string, unknown>[]"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "subFieldsSource",
              "type": {
                "text": "FieldDescriptor[] | undefined"
              },
              "privacy": "private"
            },
            {
              "kind": "field",
              "name": "subFieldsCache",
              "type": {
                "text": "FieldDescriptor[]"
              },
              "privacy": "private",
              "default": "[]"
            },
            {
              "kind": "field",
              "name": "subFields",
              "type": {
                "text": "FieldDescriptor[]"
              },
              "privacy": "private",
              "description": "Ordered sub-descriptors, cached per  identity (read per row per render).",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "patchRow",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "index",
                  "type": {
                    "text": "number"
                  }
                },
                {
                  "name": "key",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "addRow",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "removeRow",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "index",
                  "type": {
                    "text": "number"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "flushTyped",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Pending keystrokes in any row land in the array before the host reads it.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "errorFor",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "string | null"
                }
              },
              "parameters": [
                {
                  "name": "index",
                  "type": {
                    "text": "number"
                  }
                },
                {
                  "name": "key",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "renderSub",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "parameters": [
                {
                  "name": "row",
                  "type": {
                    "text": "Record<string, unknown>"
                  }
                },
                {
                  "name": "index",
                  "type": {
                    "text": "number"
                  }
                },
                {
                  "name": "sub",
                  "type": {
                    "text": "FieldDescriptor"
                  }
                }
              ],
              "description": "Sub-controls render declaratively (one static-tag template per primitive, rows\nkeyed by index) so Lit reuses the same node across re-renders — typing keeps\nfocus, same as <baht-form> — and the whole thing renders on the server."
            },
            {
              "kind": "method",
              "name": "renderControl",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "defaultDebounce",
              "type": {
                "text": "number"
              },
              "static": true,
              "default": "150",
              "description": "Default trailing debounce (ms) for TYPED edits — text, email, password,\ntextarea, number. Every keystroke otherwise re-runs the host's rules,\nvalidation and dependent-option fetches. Per element: the `debounce`\nproperty/attribute; `<baht-form options.inputDebounce>` sets it for a whole\nform. 0 = emit on every keystroke. Selects, checkboxes, radios, toggles,\ndates and files are never debounced — a pick is one event.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "field",
              "type": {
                "text": "FieldDescriptor"
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "unknown"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "showOptional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "attribute": "show-optional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "error",
              "type": {
                "text": "string | null"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "attribute": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typed",
              "type": {
                "text": "{ value: unknown; emitted: boolean } | null"
              },
              "privacy": "private",
              "default": "null",
              "description": "The keystrokes not yet (or just) handed to the host. The control keeps\nrendering `typed.value` until the host's `value` moves, so a re-render\nmid-typing (a sibling field changing) can't snap the text back.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typedTimer",
              "type": {
                "text": "ReturnType<typeof setTimeout> | undefined"
              },
              "privacy": "private",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "onFocusOut",
              "privacy": "private",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "effectiveDebounce",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitTyped",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "A typed edit: emitted after `debounce` ms of quiet (or at once when 0).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownValue",
              "type": {
                "text": "unknown"
              },
              "privacy": "protected",
              "description": "What a typed control shows: pending keystrokes win over a stale host value.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownText",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "description": "`shownValue` as control text: `''` for null/undefined, `String()` otherwise.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "assignedField",
              "type": {
                "text": "FieldDescriptor | undefined"
              },
              "privacy": "protected",
              "description": "`field` as the host may actually have left it: a framework can connect the element\nbefore it binds the descriptor, so internally it is optional until then.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitInput",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Emit the user's edit upward (composed so it crosses any boundary).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "hasFieldIcon",
              "type": {
                "text": "boolean"
              },
              "privacy": "protected",
              "description": "True when `field.icon` names a real icon — gates both the icon markup\nand the control's icon-padding class, so a typo/removed name never\nleaves the control indented for a glyph that isn't there.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderFieldIcon",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Leading icon for text/currency/textarea/dropdown controls (spec: field.icon).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabel",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabelMark",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Required asterisk, or the \"(optional)\" marker when the form asks for it.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "controlId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "labelId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "errorId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "helpId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "describedBy",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "id list for the control's aria-describedby: error first, then help.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "invalidAttr",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "'true' while the field is in error, else absent (styles hook on [aria-invalid]).",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtFieldBase",
            "module": "/src/components/field-base.js"
          },
          "tagName": "baht-repeater",
          "customElement": true,
          "attributes": [
            {
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "show-optional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "fieldName": "showOptional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "fieldName": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtRepeater",
          "declaration": {
            "name": "BahtRepeater",
            "module": "src/components/primitives/baht-repeater.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-repeater",
          "declaration": {
            "name": "BahtRepeater",
            "module": "src/components/primitives/baht-repeater.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-rule-builder.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Edits a workflow's `rules` without code: \"when all / any of <field> <is>\n<value>, then show / hide / make mandatory / set value / skip step\". Takes\nthe `workflow` (its fields and steps are the choices) and emits\n`baht-change` with `{ rules }` on every edit. A rule it cannot represent\n(nested conditions) is shown as such and returned untouched.",
          "name": "BahtRuleBuilder",
          "members": [
            {
              "kind": "field",
              "name": "workflow",
              "type": {
                "text": "WorkflowDefinition | null"
              },
              "default": "null"
            },
            {
              "kind": "field",
              "name": "rows",
              "type": {
                "text": "RuleRow[]"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "fields",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "steps",
              "type": {
                "text": "string[]"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "emitRows",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "rows",
                  "type": {
                    "text": "RuleRow[]"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "change",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "i",
                  "type": {
                    "text": "number"
                  }
                },
                {
                  "name": "fn",
                  "type": {
                    "text": "(row: RuleRow) => RuleRow"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "firstField",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "string"
                }
              }
            },
            {
              "kind": "method",
              "name": "actionFor",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "RuleAction"
                }
              },
              "parameters": [
                {
                  "name": "kind",
                  "type": {
                    "text": "RuleAction['action']"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "needsValue",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "boolean"
                }
              },
              "parameters": [
                {
                  "name": "op",
                  "type": {
                    "text": "ConditionOp"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "renderRule",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "parameters": [
                {
                  "name": "row",
                  "type": {
                    "text": "RuleRow"
                  }
                },
                {
                  "name": "i",
                  "type": {
                    "text": "number"
                  }
                }
              ]
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-rule-builder",
          "customElement": true,
          "attributes": [
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtRuleBuilder",
          "declaration": {
            "name": "BahtRuleBuilder",
            "module": "src/components/primitives/baht-rule-builder.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-rule-builder",
          "declaration": {
            "name": "BahtRuleBuilder",
            "module": "src/components/primitives/baht-rule-builder.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-section.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Section divider (`type: \"section\"`): heading + rule, no value, no emits.",
          "name": "BahtSection",
          "members": [
            {
              "kind": "field",
              "name": "field",
              "type": {
                "text": "FieldDescriptor"
              }
            },
            {
              "kind": "field",
              "name": "assignedField",
              "type": {
                "text": "FieldDescriptor | undefined"
              },
              "privacy": "private",
              "description": "`field` as the host may actually have left it: a framework can bind it after connecting.",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-section",
          "customElement": true,
          "attributes": [
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtSection",
          "declaration": {
            "name": "BahtSection",
            "module": "src/components/primitives/baht-section.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-section",
          "declaration": {
            "name": "BahtSection",
            "module": "src/components/primitives/baht-section.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-select.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Single-choice dropdown. Renders ITS OWN list (light DOM, positioned under\nthe trigger) instead of the native `<select>` — so the picker looks the same\non iOS/macOS as everywhere else (no UIKit wheel, no AppKit menu), and every\noption is styleable with the tokens.\n\nARIA: APG \"select-only combobox\". The trigger is a `<button role=\"combobox\">`\n(so `<label for>` still names it); `aria-activedescendant` tracks the\nhighlighted option while focus stays on the trigger. Keys: Arrow Up/Down,\nHome/End, Enter/Space pick, Escape closes, Tab picks the highlighted option\nand moves on, typing jumps to the first option starting with those letters\n(while closed it picks it directly, like a native select).\n\nAn option's `description` renders as a muted second line under its label in\nthe list, and after the label on the closed trigger while it is selected\n(e.g. label \"Food\", description \"฿580 left\").\n\nValue contract unchanged: option `key`, or `null` for the placeholder row.",
          "name": "BahtSelect",
          "members": [
            {
              "kind": "field",
              "name": "open",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "default": "false"
            },
            {
              "kind": "field",
              "name": "active",
              "type": {
                "text": "number"
              },
              "privacy": "private",
              "default": "0",
              "description": "Index into `rows` (0 = the placeholder row) — the highlighted option."
            },
            {
              "kind": "field",
              "name": "typeBuffer",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "default": "''"
            },
            {
              "kind": "field",
              "name": "typeTimer",
              "type": {
                "text": "ReturnType<typeof setTimeout> | undefined"
              },
              "privacy": "private"
            },
            {
              "kind": "field",
              "name": "onDocMousedown",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "listId",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "optionId",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "index",
                  "type": {
                    "text": "number"
                  }
                }
              ]
            },
            {
              "kind": "field",
              "name": "rows",
              "type": {
                "text": "FieldOption[]"
              },
              "privacy": "private",
              "description": "Placeholder row first (picks `null`), then the field's options.",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "currentKey",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "selectedIndex",
              "type": {
                "text": "number"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "interactive",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "openList",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "close",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "toggle",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "commit",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "index",
                  "type": {
                    "text": "number"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "highlight",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "index",
                  "type": {
                    "text": "number"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "move",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "delta",
                  "type": {
                    "text": "number"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "typeahead",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "ch",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "Type-to-select: first option (after the highlighted one) starting with the buffer."
            },
            {
              "kind": "method",
              "name": "onKeydown",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "e",
                  "type": {
                    "text": "KeyboardEvent"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "renderControl",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "defaultDebounce",
              "type": {
                "text": "number"
              },
              "static": true,
              "default": "150",
              "description": "Default trailing debounce (ms) for TYPED edits — text, email, password,\ntextarea, number. Every keystroke otherwise re-runs the host's rules,\nvalidation and dependent-option fetches. Per element: the `debounce`\nproperty/attribute; `<baht-form options.inputDebounce>` sets it for a whole\nform. 0 = emit on every keystroke. Selects, checkboxes, radios, toggles,\ndates and files are never debounced — a pick is one event.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "field",
              "type": {
                "text": "FieldDescriptor"
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "unknown"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "showOptional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "attribute": "show-optional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "error",
              "type": {
                "text": "string | null"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "attribute": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typed",
              "type": {
                "text": "{ value: unknown; emitted: boolean } | null"
              },
              "privacy": "private",
              "default": "null",
              "description": "The keystrokes not yet (or just) handed to the host. The control keeps\nrendering `typed.value` until the host's `value` moves, so a re-render\nmid-typing (a sibling field changing) can't snap the text back.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typedTimer",
              "type": {
                "text": "ReturnType<typeof setTimeout> | undefined"
              },
              "privacy": "private",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "onFocusOut",
              "privacy": "private",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "effectiveDebounce",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitTyped",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "A typed edit: emitted after `debounce` ms of quiet (or at once when 0).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "flushTyped",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Hand a pending typed edit to the host now (blur, disconnect, host reads). Idempotent.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownValue",
              "type": {
                "text": "unknown"
              },
              "privacy": "protected",
              "description": "What a typed control shows: pending keystrokes win over a stale host value.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownText",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "description": "`shownValue` as control text: `''` for null/undefined, `String()` otherwise.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "assignedField",
              "type": {
                "text": "FieldDescriptor | undefined"
              },
              "privacy": "protected",
              "description": "`field` as the host may actually have left it: a framework can connect the element\nbefore it binds the descriptor, so internally it is optional until then.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitInput",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Emit the user's edit upward (composed so it crosses any boundary).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "hasFieldIcon",
              "type": {
                "text": "boolean"
              },
              "privacy": "protected",
              "description": "True when `field.icon` names a real icon — gates both the icon markup\nand the control's icon-padding class, so a typo/removed name never\nleaves the control indented for a glyph that isn't there.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderFieldIcon",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Leading icon for text/currency/textarea/dropdown controls (spec: field.icon).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabel",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabelMark",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Required asterisk, or the \"(optional)\" marker when the form asks for it.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "controlId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "labelId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "errorId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "helpId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "describedBy",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "id list for the control's aria-describedby: error first, then help.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "invalidAttr",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "'true' while the field is in error, else absent (styles hook on [aria-invalid]).",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtFieldBase",
            "module": "/src/components/field-base.js"
          },
          "tagName": "baht-select",
          "customElement": true,
          "attributes": [
            {
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "show-optional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "fieldName": "showOptional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "fieldName": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtSelect",
          "declaration": {
            "name": "BahtSelect",
            "module": "src/components/primitives/baht-select.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-select",
          "declaration": {
            "name": "BahtSelect",
            "module": "src/components/primitives/baht-select.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-skeleton.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Loading placeholder (opacity pulse — the 20baht system bans gradients in\ncore UI, so no shimmer).\n\n  <baht-skeleton variant=\"text\" width=\"60%\"></baht-skeleton>\n  <baht-skeleton variant=\"circle\" width=\"40px\" height=\"40px\"></baht-skeleton>\n  <baht-skeleton height=\"120px\"></baht-skeleton>",
          "name": "BahtSkeleton",
          "members": [
            {
              "kind": "field",
              "name": "variant",
              "type": {
                "text": "'rect' | 'text' | 'circle'"
              },
              "default": "'rect'",
              "attribute": "variant"
            },
            {
              "kind": "field",
              "name": "width",
              "type": {
                "text": "string"
              },
              "default": "'100%'",
              "attribute": "width"
            },
            {
              "kind": "field",
              "name": "height",
              "type": {
                "text": "string"
              },
              "default": "''",
              "attribute": "height"
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "variant",
              "type": {
                "text": "'rect' | 'text' | 'circle'"
              },
              "default": "'rect'",
              "fieldName": "variant"
            },
            {
              "name": "width",
              "type": {
                "text": "string"
              },
              "default": "'100%'",
              "fieldName": "width"
            },
            {
              "name": "height",
              "type": {
                "text": "string"
              },
              "default": "''",
              "fieldName": "height"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-skeleton",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtSkeleton",
          "declaration": {
            "name": "BahtSkeleton",
            "module": "src/components/primitives/baht-skeleton.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-skeleton",
          "declaration": {
            "name": "BahtSkeleton",
            "module": "src/components/primitives/baht-skeleton.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-sparkline.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Micro trend line — no axes, no ticks, no tooltip. Used inside `<baht-stat>`\nand anywhere a number needs its recent shape beside it.\n\n  <baht-sparkline values=\"[4,7,6,9,12]\" accent-last></baht-sparkline>",
          "name": "BahtSparkline",
          "members": [
            {
              "kind": "field",
              "name": "values",
              "type": {
                "text": "number[]"
              },
              "default": "[]",
              "description": "The points, oldest first. Fewer than two points renders nothing.",
              "attribute": "values"
            },
            {
              "kind": "field",
              "name": "width",
              "type": {
                "text": "number"
              },
              "default": "96",
              "description": "Drawing width in px.",
              "attribute": "width"
            },
            {
              "kind": "field",
              "name": "height",
              "type": {
                "text": "number"
              },
              "default": "24",
              "description": "Drawing height in px.",
              "attribute": "height"
            },
            {
              "kind": "field",
              "name": "accentLast",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "description": "Mark the newest point with an accent dot.",
              "attribute": "accent-last"
            },
            {
              "kind": "field",
              "name": "color",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Line color; defaults to the de-emphasis chart token.",
              "attribute": "color"
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Accessible name; falls back to a plain \"Trend of N points\" sentence.",
              "attribute": "label"
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "values",
              "type": {
                "text": "number[]"
              },
              "default": "[]",
              "description": "The points, oldest first. Fewer than two points renders nothing.",
              "fieldName": "values"
            },
            {
              "name": "width",
              "type": {
                "text": "number"
              },
              "default": "96",
              "description": "Drawing width in px.",
              "fieldName": "width"
            },
            {
              "name": "height",
              "type": {
                "text": "number"
              },
              "default": "24",
              "description": "Drawing height in px.",
              "fieldName": "height"
            },
            {
              "name": "accent-last",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "description": "Mark the newest point with an accent dot.",
              "fieldName": "accentLast"
            },
            {
              "name": "color",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Line color; defaults to the de-emphasis chart token.",
              "fieldName": "color"
            },
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Accessible name; falls back to a plain \"Trend of N points\" sentence.",
              "fieldName": "label"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-sparkline",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtSparkline",
          "declaration": {
            "name": "BahtSparkline",
            "module": "src/components/primitives/baht-sparkline.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-sparkline",
          "declaration": {
            "name": "BahtSparkline",
            "module": "src/components/primitives/baht-sparkline.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-spinner.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Loading spinner — the single animated icon the 20baht system allows.\n\n  <baht-spinner></baht-spinner>\n  <baht-spinner size=\"lg\"></baht-spinner>",
          "name": "BahtSpinner",
          "members": [
            {
              "kind": "field",
              "name": "size",
              "type": {
                "text": "'sm' | 'md' | 'lg'"
              },
              "default": "'md'",
              "attribute": "size"
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "'Loading'",
              "attribute": "label"
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "size",
              "type": {
                "text": "'sm' | 'md' | 'lg'"
              },
              "default": "'md'",
              "fieldName": "size"
            },
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "'Loading'",
              "fieldName": "label"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-spinner",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtSpinner",
          "declaration": {
            "name": "BahtSpinner",
            "module": "src/components/primitives/baht-spinner.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-spinner",
          "declaration": {
            "name": "BahtSpinner",
            "module": "src/components/primitives/baht-spinner.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-split-button.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Split button: a main action plus a ▾ toggle that opens a menu of related actions\n(NOTES 2026-10-31). Each action can carry a keyboard `shortcut` — the main one shows\nin the main button's tooltip, item ones as a right-aligned hint in the menu — and all\nof them are bound document-wide (same scoping as `<baht-button shortcut>`).\n\n  <baht-split-button label=\"Save\" shortcut=\"alt+s\"></baht-split-button>\n  el.items = [{ value: 'save-close', label: 'Save and close', shortcut: 'shift+alt+s' }];\n  el.addEventListener('baht-click', save);\n  el.addEventListener('baht-select', (e) => run(e.detail.value));\n\nKeyboard: ↓ / Enter / Space on the toggle opens on the first item, ↑ on the last;\nin the menu ↑ ↓ (wrapping, skipping disabled) · Home · End · Enter/Space picks ·\nEscape closes back to the toggle (and is marked handled, so a surrounding\n`<baht-modal>` stays open) · Tab closes and moves on. A click outside closes.",
          "name": "BahtSplitButton",
          "members": [
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Main action label.",
              "attribute": "label"
            },
            {
              "kind": "field",
              "name": "variant",
              "type": {
                "text": "ButtonVariant"
              },
              "default": "'primary'",
              "attribute": "variant"
            },
            {
              "kind": "field",
              "name": "size",
              "type": {
                "text": "ButtonSize"
              },
              "default": "'md'",
              "attribute": "size"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "disabled",
              "reflects": true
            },
            {
              "kind": "field",
              "name": "shortcut",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Shortcut for the main action, e.g. `alt+s` (see `<baht-button shortcut>`).",
              "attribute": "shortcut"
            },
            {
              "kind": "field",
              "name": "items",
              "type": {
                "text": "MenuItem[]"
              },
              "default": "[]",
              "description": "Menu entries. Set as a property: `el.items = [...]`."
            },
            {
              "kind": "field",
              "name": "align",
              "type": {
                "text": "'start' | 'end'"
              },
              "default": "'end'",
              "description": "Menu edge aligned with the button: `'end'` (default, right in LTR) or `'start'`.",
              "attribute": "align"
            },
            {
              "kind": "field",
              "name": "menuLabel",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Accessible name of the ▾ toggle. Defaults to the localized \"More actions\".",
              "attribute": "menu-label"
            },
            {
              "kind": "field",
              "name": "menu",
              "privacy": "private",
              "readonly": true,
              "default": "new MenuController(this, { items: () => arr(this.items), trigger: () => this.querySelector<HTMLButtonElement>('.baht-split-button-toggle'), onPick: (item) => { this.emit('baht-select', { value: item.value, item }); }, })"
            },
            {
              "kind": "field",
              "name": "menuId",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "events": [
            {
              "description": "The main action was activated (click or its shortcut).",
              "name": "baht-click"
            },
            {
              "description": "A menu item was picked. `detail: { value, item }`.",
              "name": "baht-select"
            },
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Main action label.",
              "fieldName": "label"
            },
            {
              "name": "variant",
              "type": {
                "text": "ButtonVariant"
              },
              "default": "'primary'",
              "fieldName": "variant"
            },
            {
              "name": "size",
              "type": {
                "text": "ButtonSize"
              },
              "default": "'md'",
              "fieldName": "size"
            },
            {
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "disabled"
            },
            {
              "name": "shortcut",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Shortcut for the main action, e.g. `alt+s` (see `<baht-button shortcut>`).",
              "fieldName": "shortcut"
            },
            {
              "name": "align",
              "type": {
                "text": "'start' | 'end'"
              },
              "default": "'end'",
              "description": "Menu edge aligned with the button: `'end'` (default, right in LTR) or `'start'`.",
              "fieldName": "align"
            },
            {
              "name": "menu-label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Accessible name of the ▾ toggle. Defaults to the localized \"More actions\".",
              "fieldName": "menuLabel"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-split-button",
          "customElement": true
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "MenuItem",
          "declaration": {
            "name": "MenuItem",
            "module": "../menu-controller.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtSplitButton",
          "declaration": {
            "name": "BahtSplitButton",
            "module": "src/components/primitives/baht-split-button.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-split-button",
          "declaration": {
            "name": "BahtSplitButton",
            "module": "src/components/primitives/baht-split-button.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-stat-chart.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Big single-number stat (report type \"count\").\n\n  <baht-stat-chart total=\"1284\" label=\"Open incidents\"></baht-stat-chart>",
          "name": "BahtStatChart",
          "members": [
            {
              "kind": "field",
              "name": "total",
              "type": {
                "text": "number"
              },
              "default": "0",
              "attribute": "total"
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "attribute": "label"
            },
            {
              "kind": "field",
              "name": "color",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Overrides the number color (defaults to the primary token).",
              "attribute": "color"
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "total",
              "type": {
                "text": "number"
              },
              "default": "0",
              "fieldName": "total"
            },
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "fieldName": "label"
            },
            {
              "name": "color",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Overrides the number color (defaults to the primary token).",
              "fieldName": "color"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-stat-chart",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtStatChart",
          "declaration": {
            "name": "BahtStatChart",
            "module": "src/components/primitives/baht-stat-chart.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-stat-chart",
          "declaration": {
            "name": "BahtStatChart",
            "module": "src/components/primitives/baht-stat-chart.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-stat.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Stat tile: label, one figure, an optional delta against a named period and an\noptional sparkline. Supersedes `<baht-stat-chart>`.\n\n  <baht-stat label=\"Out\" value=\"4200\" format=\"currency\"\n             delta=\"-8\" delta-kind=\"pct\" delta-label=\"vs August\"\n             up-is-good=\"false\"></baht-stat>\n\nThe figure is never colored by a series hue — only the delta carries color,\nand it always ships an arrow glyph plus a worded label so direction never\nrides on color alone.",
          "name": "BahtStat",
          "members": [
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Sentence-case caption above the figure, no trailing colon.",
              "attribute": "label"
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "number"
              },
              "default": "0",
              "description": "The figure.",
              "attribute": "value"
            },
            {
              "kind": "field",
              "name": "format",
              "type": {
                "text": "ChartFormat"
              },
              "default": "'number'",
              "description": "How the figure reads: number | currency | percent | compact.",
              "attribute": "format"
            },
            {
              "kind": "field",
              "name": "currency",
              "type": {
                "text": "string"
              },
              "default": "'THB'",
              "description": "ISO currency code for `format=\"currency\"` (THB renders `฿`).",
              "attribute": "currency"
            },
            {
              "kind": "field",
              "name": "delta",
              "type": {
                "text": "number | null"
              },
              "default": "null",
              "description": "Change against the previous period. `null` hides the delta row.\nWith `delta-kind=\"pct\"` it is a percentage (18 → \"18%\"); with `\"abs\"` it is\na raw amount rendered with this tile's `format`.",
              "attribute": "delta"
            },
            {
              "kind": "field",
              "name": "deltaKind",
              "type": {
                "text": "'abs' | 'pct'"
              },
              "default": "'pct'",
              "description": "Whether `delta` is a percentage or an absolute amount.",
              "attribute": "delta-kind"
            },
            {
              "kind": "field",
              "name": "deltaLabel",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "What the delta is measured against, e.g. \"vs August\". With no `delta` it is\nstill rendered on its own as a muted caption, so a figure can name its period.",
              "attribute": "delta-label"
            },
            {
              "kind": "field",
              "name": "upIsGood",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "description": "Is a rise good news? Spending tiles set `up-is-good=\"false\"`.",
              "attribute": "up-is-good"
            },
            {
              "kind": "field",
              "name": "trend",
              "type": {
                "text": "number[]"
              },
              "default": "[]",
              "description": "Recent points drawn as a muted sparkline with an accent on the newest.",
              "attribute": "trend"
            },
            {
              "kind": "field",
              "name": "size",
              "type": {
                "text": "'md' | 'hero'"
              },
              "default": "'md'",
              "description": "`hero` is the one 48px+ figure a view leads with.",
              "attribute": "size"
            },
            {
              "kind": "field",
              "name": "icon",
              "type": {
                "text": "string | undefined"
              },
              "description": "Icon name from the curated set (see icons.ts), shown in a chip before the label.",
              "attribute": "icon"
            },
            {
              "kind": "field",
              "name": "tone",
              "type": {
                "text": "'good' | 'bad' | 'flat'"
              },
              "privacy": "private",
              "description": "Direction of the delta paired with whether up is good.",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "arrow",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "deltaText",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Sentence-case caption above the figure, no trailing colon.",
              "fieldName": "label"
            },
            {
              "name": "value",
              "type": {
                "text": "number"
              },
              "default": "0",
              "description": "The figure.",
              "fieldName": "value"
            },
            {
              "name": "format",
              "type": {
                "text": "ChartFormat"
              },
              "default": "'number'",
              "description": "How the figure reads: number | currency | percent | compact.",
              "fieldName": "format"
            },
            {
              "name": "currency",
              "type": {
                "text": "string"
              },
              "default": "'THB'",
              "description": "ISO currency code for `format=\"currency\"` (THB renders `฿`).",
              "fieldName": "currency"
            },
            {
              "name": "delta",
              "type": {
                "text": "number | null"
              },
              "default": "null",
              "description": "Change against the previous period. `null` hides the delta row.\nWith `delta-kind=\"pct\"` it is a percentage (18 → \"18%\"); with `\"abs\"` it is\na raw amount rendered with this tile's `format`.",
              "fieldName": "delta"
            },
            {
              "name": "delta-kind",
              "type": {
                "text": "'abs' | 'pct'"
              },
              "default": "'pct'",
              "description": "Whether `delta` is a percentage or an absolute amount.",
              "fieldName": "deltaKind"
            },
            {
              "name": "delta-label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "What the delta is measured against, e.g. \"vs August\". With no `delta` it is\nstill rendered on its own as a muted caption, so a figure can name its period.",
              "fieldName": "deltaLabel"
            },
            {
              "name": "up-is-good",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "description": "Is a rise good news? Spending tiles set `up-is-good=\"false\"`.",
              "fieldName": "upIsGood"
            },
            {
              "name": "trend",
              "type": {
                "text": "number[]"
              },
              "default": "[]",
              "description": "Recent points drawn as a muted sparkline with an accent on the newest.",
              "fieldName": "trend"
            },
            {
              "name": "size",
              "type": {
                "text": "'md' | 'hero'"
              },
              "default": "'md'",
              "description": "`hero` is the one 48px+ figure a view leads with.",
              "fieldName": "size"
            },
            {
              "name": "icon",
              "type": {
                "text": "string | undefined"
              },
              "description": "Icon name from the curated set (see icons.ts), shown in a chip before the label.",
              "fieldName": "icon"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-stat",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtStat",
          "declaration": {
            "name": "BahtStat",
            "module": "src/components/primitives/baht-stat.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-stat",
          "declaration": {
            "name": "BahtStat",
            "module": "src/components/primitives/baht-stat.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-steps.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "<baht-steps> — wizard progress indicator (spec 03). Standalone display\nprimitive: numbered markers + labels, the current one highlighted, done\nones checked. <baht-workflow show-steps> renders it automatically from its\nvisible forms.",
          "name": "BahtSteps",
          "members": [
            {
              "kind": "field",
              "name": "steps",
              "type": {
                "text": "string[]"
              },
              "default": "[]",
              "description": "Step labels in order."
            },
            {
              "kind": "field",
              "name": "current",
              "type": {
                "text": "number"
              },
              "default": "0",
              "description": "0-based index of the current step.",
              "attribute": "current"
            },
            {
              "kind": "field",
              "name": "variant",
              "type": {
                "text": "'default' | 'sidebar'"
              },
              "default": "'default'",
              "description": "'default' = horizontal numbered markers; 'sidebar' = vertical nav list, current pilled.",
              "attribute": "variant"
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "current",
              "type": {
                "text": "number"
              },
              "default": "0",
              "description": "0-based index of the current step.",
              "fieldName": "current"
            },
            {
              "name": "variant",
              "type": {
                "text": "'default' | 'sidebar'"
              },
              "default": "'default'",
              "description": "'default' = horizontal numbered markers; 'sidebar' = vertical nav list, current pilled.",
              "fieldName": "variant"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-steps",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtSteps",
          "declaration": {
            "name": "BahtSteps",
            "module": "src/components/primitives/baht-steps.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-steps",
          "declaration": {
            "name": "BahtSteps",
            "module": "src/components/primitives/baht-steps.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-swipe-row.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Row container for touch lists: the children are the row, `actions` sit behind\nit on the right and are revealed by swiping the row left.\n\n  <baht-swipe-row><my-expense-row …></my-expense-row></baht-swipe-row>\n  row.actions = [{ key: 'edit', label: 'Edit' }, { key: 'delete', label: 'Delete', tone: 'danger' }];\n  row.addEventListener('baht-action', (e) => handle(e.detail.key));\n\nPointer events (touch, pen, mouse): a horizontal drag moves the row; released\nmore than 40px left it snaps open, more than 40px right (from open) it snaps\nshut, otherwise it springs back. Vertical drags are left to the page\n(`touch-action: pan-y`). An open row closes on a pointerdown outside it, on a\ntap on the row (that tap is swallowed, so the row's own click handler does not\nfire), on Escape, and after an action is pressed. The click that ends a drag\nis swallowed too.\n\nKeyboard: the actions are real buttons after the row content in tab order;\nfocusing one reveals the row, focus leaving the row hides it again. The\ngesture is physical (swipe left, actions on the right) in either text direction.",
          "name": "BahtSwipeRow",
          "members": [
            {
              "kind": "field",
              "name": "actions",
              "type": {
                "text": "SwipeAction[]"
              },
              "default": "[]",
              "description": "Actions revealed by the swipe, in order: `{ key, label, tone? }`."
            },
            {
              "kind": "field",
              "name": "open",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Revealed state. Reflected; set it to open or close the row from the host.",
              "attribute": "open",
              "reflects": true
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Accessible name of the action group (default: the i18n `rowActions` string).",
              "attribute": "label"
            },
            {
              "kind": "field",
              "name": "dragX",
              "type": {
                "text": "number | null"
              },
              "privacy": "private",
              "default": "null",
              "description": "Content offset in px while a drag is in progress (`null` = not dragging)."
            },
            {
              "kind": "field",
              "name": "start",
              "type": {
                "text": "DragStart | null"
              },
              "privacy": "private",
              "default": "null"
            },
            {
              "kind": "field",
              "name": "swallowClick",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "default": "false",
              "description": "A drag just ended: swallow the click the browser fires after pointerup."
            },
            {
              "kind": "field",
              "name": "onDocPointerdown",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "hasActions",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "revealWidth",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "number"
                }
              },
              "description": "Width of the action strip — how far the row slides when open (0 without layout)."
            },
            {
              "kind": "method",
              "name": "onPointerdown",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "e",
                  "type": {
                    "text": "PointerEvent"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "onPointermove",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "e",
                  "type": {
                    "text": "PointerEvent"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "onPointerup",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "e",
                  "type": {
                    "text": "PointerEvent"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "onPointercancel",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "onContentClick",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "e",
                  "type": {
                    "text": "Event"
                  }
                }
              ],
              "description": "Capture-phase click on the row content: eat the post-drag click and the closing tap."
            },
            {
              "kind": "method",
              "name": "onFocusout",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "e",
                  "type": {
                    "text": "FocusEvent"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "reveal",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Keyboard path: focus on an action uncovers the strip."
            },
            {
              "kind": "method",
              "name": "onKeydown",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "e",
                  "type": {
                    "text": "KeyboardEvent"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "pick",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "key",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "contentStyle",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "string"
                }
              }
            },
            {
              "kind": "method",
              "name": "renderContent",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "description": "The row itself: children are adopted in here; it carries the drag."
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "open",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Revealed state. Reflected; set it to open or close the row from the host.",
              "fieldName": "open"
            },
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Accessible name of the action group (default: the i18n `rowActions` string).",
              "fieldName": "label"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-swipe-row",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtSwipeRow",
          "declaration": {
            "name": "BahtSwipeRow",
            "module": "src/components/primitives/baht-swipe-row.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-swipe-row",
          "declaration": {
            "name": "BahtSwipeRow",
            "module": "src/components/primitives/baht-swipe-row.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-table.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Server-side data table. `items` is ONE page of rows — the component never\nslices or fetches; on `baht-page-change` the host fetches the next page and\nre-feeds `items`/`page`. While that fetch runs, set `loading` to show\nskeleton rows.\n\n  const t = document.querySelector('baht-table');\n  t.columns = { name: 'Name', created_at: 'Created' };\n  t.items = pageRows;                 // current page only\n  t.loading = false; t.page = 1; t.totalPages = 12;\n  t.addEventListener('baht-page-change', (e) => fetchPage(e.detail.page));\n  t.addEventListener('baht-row-click', (e) => open(e.detail.id));\n\nSet `cursor-mode` for cursor-based APIs (no total count) — the footer\nbecomes a Prev/Next pair gated by `has-next`/`has-prev`, and the host\nlistens for `baht-cursor-change` instead of `baht-page-change`:\n\n  t.cursorMode = true; t.hasNext = true; t.hasPrev = false;\n  t.addEventListener('baht-cursor-change', (e) => fetchPage(e.detail.direction));\n\nA built-in \"Columns\" button is ON by default — it opens a ServiceNow-style\nAvailable/Selected dual-list modal (add/remove, reorder, Select all/Clear\nall) derived from `columns` (or the first row's keys), no host wiring\nrequired. Set `t.columnPicker = false` (JS property — a boolean attribute\ncan't express \"off\") to hide it. OK emits `baht-columns-change` with the\nchosen keys and their labels; persist that and feed it back as\n`visibleColumns` to remember a person's layout:\n\n  t.addEventListener('baht-columns-change', (e) => save(e.detail.visibleColumns));\n\nDot-walking (spec: reference columns). A column may declare `fields`, in\nwhich case the picker lets the person expand it and pick a sub-field —\nthe key becomes `requester.department`, the header reads\n\"Requested by › Department\", and the cell resolves the path on the row.\nRows whose values are plain objects get the same treatment automatically\nwhen no `columns` map is given.\n\n  t.columns = {\n    number: 'Number',\n    requester: { label: 'Requested by', fields: { name: 'Name', department: 'Department' } },\n  };\n  t.visibleColumns = ['number', 'requester.name'];\n\n`visibleColumns` still works standalone for a host-controlled subset (no\nrefetch) — pass it explicitly and the built-in picker (if also enabled)\nstarts from that selection and keeps emitting updates for it.\n\nToolbar, selection, sorting, row actions (all server-side, all off by default):\n\n  t.total = 143;                      // \"143 results\" in the toolbar (search/filter UI lives outside)\n  t.selectable = true; t.selected = ['g1'];   // checkbox column, controlled by row key\n  t.addEventListener('baht-selection-change', (e) => (t.selected = e.detail.selected));\n  t.columns = { amount: { label: 'Amount', numeric: true, sortable: true } };\n  t.sort = { key: 'amount', direction: 'desc' };\n  t.addEventListener('baht-sort-change', (e) => refetch({ sort: e.detail }));\n  t.rowActions = true;                // trailing \"...\" button -> baht-row-actions { row, index, id }\n\nGrouping (ServiceNow \"Group by\" on a list): `group-by` names a (dotted)\nrow key, or pass a function as the property. Every row on the CURRENT page\nis bucketed by that value in first-appearance order; each bucket is its own\n`<tbody>` headed by a `th[scope=rowgroup]` disclosure reading\n\"Column: value (n)\". Click the header to collapse/expand the group\n(`baht-group-toggle`); `group-collapsed` starts them all closed, and the\nopen/closed state resets when `items`/`page` change. Grouping is per page\nonly — it rides on the existing pagination and never fetches or sorts, so\na value split across pages shows up on each. `groupLabel` replaces the\ndefault header text (it still sits inside the toggle). Row numbers and\nevent indexes stay page-global. `hide-header` drops the column header row\nfor list-style layouts.\n\n  t.groupBy = 'state';                 // \"State: Open (12)\"\n  t.groupBy = (row) => row.occurred_at.slice(0, 10);\n  t.groupLabel = (day, rows) => `${formatDay(day)} · ${rows.length}`;\n  t.groupCollapsed = true;\n  t.addEventListener('baht-group-toggle', (e) => console.log(e.detail)); // { value, collapsed }",
          "name": "BahtTable",
          "members": [
            {
              "kind": "field",
              "name": "items",
              "type": {
                "text": "Record<string, unknown>[]"
              },
              "default": "[]",
              "description": "Rows of the CURRENT page."
            },
            {
              "kind": "field",
              "name": "columns",
              "type": {
                "text": "ColumnMap"
              },
              "default": "{}",
              "description": "column key -> display name, or a reference column with `fields` (property); empty = derive keys from the first row (`snake_case` -> `Title Case`)."
            },
            {
              "kind": "field",
              "name": "loading",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "loading"
            },
            {
              "kind": "field",
              "name": "error",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "error"
            },
            {
              "kind": "field",
              "name": "errorMessage",
              "type": {
                "text": "string"
              },
              "default": "\"Couldn't load data. Try again.\"",
              "attribute": "error-message"
            },
            {
              "kind": "field",
              "name": "emptyMessage",
              "type": {
                "text": "string"
              },
              "default": "'No records yet.'",
              "attribute": "empty-message"
            },
            {
              "kind": "field",
              "name": "showIndex",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "description": "Row-number column (No.). Offset lets numbering continue across pages.",
              "attribute": "show-index"
            },
            {
              "kind": "field",
              "name": "indexOffset",
              "type": {
                "text": "number"
              },
              "default": "0",
              "attribute": "index-offset"
            },
            {
              "kind": "field",
              "name": "skeletonRows",
              "type": {
                "text": "number"
              },
              "default": "10",
              "attribute": "skeleton-rows"
            },
            {
              "kind": "field",
              "name": "rowKey",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Which row key identifies a row in baht-row-click detail.id (e.g. 'group_id').",
              "attribute": "row-key"
            },
            {
              "kind": "field",
              "name": "clickable",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "description": "Rows emit baht-row-click + get hover/keyboard affordances.",
              "attribute": "clickable"
            },
            {
              "kind": "field",
              "name": "renderers",
              "type": {
                "text": "Record<string, CellRenderer>"
              },
              "default": "{}",
              "description": "Custom cell renderers by column key, dotted keys included (functions — a property, never JSON)."
            },
            {
              "kind": "field",
              "name": "visibleColumns",
              "type": {
                "text": "string[]"
              },
              "default": "[]",
              "description": "Subset + order of columns to render (dotted keys allowed); empty/omitted = show all top-level columns."
            },
            {
              "kind": "field",
              "name": "groupBy",
              "type": {
                "text": "GroupKey | undefined"
              },
              "description": "Group the page's rows by this (dotted) column key — or a function of the row (property). Unset = no grouping.",
              "attribute": "group-by"
            },
            {
              "kind": "field",
              "name": "groupLabel",
              "type": {
                "text": "GroupLabelRenderer | undefined"
              },
              "description": "Group header content (property); default is \"Column: value (n)\"."
            },
            {
              "kind": "field",
              "name": "groupCollapsible",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "description": "Group headers are disclosures (click to collapse). Set the JS property to `false` for static headers.",
              "attribute": "group-collapsible"
            },
            {
              "kind": "field",
              "name": "groupCollapsed",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Start every group collapsed (per page — resets when `items`/`page` change).",
              "attribute": "group-collapsed"
            },
            {
              "kind": "field",
              "name": "hideHeader",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Drop the column header row (list-style tables, e.g. grouped ledgers).",
              "attribute": "hide-header"
            },
            {
              "kind": "field",
              "name": "columnPicker",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "description": "Built-in \"Columns\" toggle — derives its options from `columns`/rows. Set `column-picker=\"false\"` to hide it.",
              "attribute": "column-picker"
            },
            {
              "kind": "field",
              "name": "total",
              "type": {
                "text": "number | undefined | undefined"
              },
              "description": "Total matching rows across all pages — renders \"{n} results\" in the toolbar. Unset = no count.",
              "attribute": "total"
            },
            {
              "kind": "field",
              "name": "selectable",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "selectable"
            },
            {
              "kind": "field",
              "name": "selected",
              "type": {
                "text": "unknown[]"
              },
              "default": "[]"
            },
            {
              "kind": "field",
              "name": "sortable",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Make every column sortable (or set `sortable` per column in `columns`).",
              "attribute": "sortable"
            },
            {
              "kind": "field",
              "name": "sort",
              "type": {
                "text": "SortState | null"
              },
              "default": "null",
              "description": "Current sort, mirrored in the header (`aria-sort`); the host keeps it in sync with the fetch."
            },
            {
              "kind": "field",
              "name": "rowActions",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Trailing \"...\" button per row; emits `baht-row-actions { row, index, id }`.",
              "attribute": "row-actions"
            },
            {
              "kind": "field",
              "name": "page",
              "type": {
                "text": "number"
              },
              "default": "1",
              "attribute": "page"
            },
            {
              "kind": "field",
              "name": "totalPages",
              "type": {
                "text": "number"
              },
              "default": "1",
              "attribute": "total-pages"
            },
            {
              "kind": "field",
              "name": "cursorMode",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Switch the footer to Prev/Next (cursor-based API, no total count).",
              "attribute": "cursor-mode"
            },
            {
              "kind": "field",
              "name": "hasNext",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "has-next"
            },
            {
              "kind": "field",
              "name": "hasPrev",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "has-prev"
            },
            {
              "kind": "field",
              "name": "pickerOpen",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "default": "false"
            },
            {
              "kind": "field",
              "name": "pickerTitleId",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "pickedColumns",
              "type": {
                "text": "string[] | null"
              },
              "privacy": "private",
              "default": "null",
              "description": "User's picks once they've touched the picker; null = follow `visibleColumns`/all."
            },
            {
              "kind": "field",
              "name": "draftColumns",
              "type": {
                "text": "string[]"
              },
              "privacy": "private",
              "default": "[]",
              "description": "Working copy edited inside the modal; committed to `pickedColumns` on OK."
            },
            {
              "kind": "field",
              "name": "pickAvail",
              "type": {
                "text": "string[]"
              },
              "privacy": "private",
              "default": "[]",
              "description": "Highlighted (not yet moved) options in each list."
            },
            {
              "kind": "field",
              "name": "pickSel",
              "type": {
                "text": "string[]"
              },
              "privacy": "private",
              "default": "[]"
            },
            {
              "kind": "field",
              "name": "expanded",
              "type": {
                "text": "string[]"
              },
              "privacy": "private",
              "default": "[]",
              "description": "Reference columns unfolded in the Available tree (dot-walk)."
            },
            {
              "kind": "field",
              "name": "toggledGroups",
              "type": {
                "text": "string[]"
              },
              "privacy": "private",
              "default": "[]",
              "description": "Group keys the person toggled away from `groupCollapsed`; reset on a new page."
            },
            {
              "kind": "field",
              "name": "pickerPreviousFocus",
              "type": {
                "text": "HTMLElement | null"
              },
              "privacy": "private",
              "default": "null",
              "description": "Element focused before the picker opened — focus returns there on close."
            },
            {
              "kind": "field",
              "name": "onPickerKeydown",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "pickerFocusables",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "HTMLElement[]"
                }
              }
            },
            {
              "kind": "method",
              "name": "trapPickerFocus",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "e",
                  "type": {
                    "text": "KeyboardEvent"
                  }
                }
              ],
              "description": "Keep Tab cycling inside the column-picker dialog (no escape to the page behind)."
            },
            {
              "kind": "field",
              "name": "spec",
              "type": {
                "text": "ColumnMap"
              },
              "privacy": "private",
              "description": "The declared map, or one derived from the first row (nested objects become reference columns).",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "specAt",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "ColumnSpec | undefined"
                }
              },
              "parameters": [
                {
                  "name": "path",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "Walk a dotted key through the spec; undefined when no such column exists."
            },
            {
              "kind": "method",
              "name": "isReference",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "boolean"
                }
              },
              "parameters": [
                {
                  "name": "path",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "childrenOf",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "string[]"
                }
              },
              "parameters": [
                {
                  "name": "path",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "allPaths",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "string[]"
                }
              },
              "parameters": [
                {
                  "name": "prefix",
                  "default": "''"
                }
              ],
              "description": "Every pickable key, reference fields included (`requester`, `requester.name`, ...)."
            },
            {
              "kind": "field",
              "name": "allColumnKeys",
              "type": {
                "text": "string[]"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "columnKeys",
              "type": {
                "text": "string[]"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "labelFor",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "path",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "\"Requested by › Department\" for a dotted key; the plain label otherwise."
            },
            {
              "kind": "method",
              "name": "valueAt",
              "privacy": "private",
              "static": true,
              "return": {
                "type": {
                  "text": "unknown"
                }
              },
              "parameters": [
                {
                  "name": "row",
                  "type": {
                    "text": "Record<string, unknown>"
                  }
                },
                {
                  "name": "path",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "The row's value at a dotted key (`requester.department`)."
            },
            {
              "kind": "method",
              "name": "openPicker",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "closePicker",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "selectedValues",
              "privacy": "private",
              "static": true,
              "return": {
                "type": {
                  "text": "string[]"
                }
              },
              "parameters": [
                {
                  "name": "e",
                  "type": {
                    "text": "Event"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "toggleAvail",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "key",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "toggleExpanded",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "key",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "addToSelected",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "removeFromSelected",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "moveSelected",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "dir",
                  "type": {
                    "text": "-1 | 1"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "confirmPicker",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "idOf",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "unknown"
                }
              },
              "parameters": [
                {
                  "name": "row",
                  "type": {
                    "text": "Record<string, unknown>"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "emitRow",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "row",
                  "type": {
                    "text": "Record<string, unknown>"
                  }
                },
                {
                  "name": "index",
                  "type": {
                    "text": "number"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "keyOf",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "unknown"
                }
              },
              "parameters": [
                {
                  "name": "row",
                  "type": {
                    "text": "Record<string, unknown>"
                  }
                },
                {
                  "name": "index",
                  "type": {
                    "text": "number"
                  }
                }
              ],
              "description": "Selection key of a row: its `rowKey` value, else its index on this page."
            },
            {
              "kind": "method",
              "name": "isSelected",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "boolean"
                }
              },
              "parameters": [
                {
                  "name": "row",
                  "type": {
                    "text": "Record<string, unknown>"
                  }
                },
                {
                  "name": "index",
                  "type": {
                    "text": "number"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "emitSelection",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "selected",
                  "type": {
                    "text": "unknown[]"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "toggleRow",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "row",
                  "type": {
                    "text": "Record<string, unknown>"
                  }
                },
                {
                  "name": "index",
                  "type": {
                    "text": "number"
                  }
                }
              ]
            },
            {
              "kind": "field",
              "name": "pageKeys",
              "type": {
                "text": "unknown[]"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "allOnPageSelected",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "someOnPageSelected",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "toggleAll",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "isSortable",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "boolean"
                }
              },
              "parameters": [
                {
                  "name": "key",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "requestSort",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "key",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "alignClass",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "key",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "Alignment class for a column (explicit `align` beats `numeric`)."
            },
            {
              "kind": "method",
              "name": "cell",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "unknown"
                }
              },
              "parameters": [
                {
                  "name": "row",
                  "type": {
                    "text": "Record<string, unknown>"
                  }
                },
                {
                  "name": "key",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "span",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "number"
                }
              },
              "parameters": [
                {
                  "name": "cols",
                  "type": {
                    "text": "string[]"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "groupValue",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "unknown"
                }
              },
              "parameters": [
                {
                  "name": "row",
                  "type": {
                    "text": "Record<string, unknown>"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "groupId",
              "privacy": "private",
              "static": true,
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Stable identity of a group value for the collapsed set (objects by JSON, else by type+string)."
            },
            {
              "kind": "field",
              "name": "groups",
              "type": {
                "text": "{\n    id: string;\n    value: unknown;\n    rows: { row: Record<string, unknown>; index: number }[];\n  }[]"
              },
              "privacy": "private",
              "description": "The page's rows bucketed by group value, in first-appearance order. Each\nrow keeps its page index so numbering and event indexes stay host-order.",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "isGrouped",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "isCollapsed",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "boolean"
                }
              },
              "parameters": [
                {
                  "name": "id",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "toggleGroup",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "id",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "defaultGroupLabel",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                },
                {
                  "name": "count",
                  "type": {
                    "text": "number"
                  }
                }
              ],
              "description": "Default header: \"Column: value (n)\" — no column prefix for a function key."
            },
            {
              "kind": "method",
              "name": "renderGroups",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "parameters": [
                {
                  "name": "cols",
                  "type": {
                    "text": "string[]"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "renderBody",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "parameters": [
                {
                  "name": "cols",
                  "type": {
                    "text": "string[]"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "renderRow",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "parameters": [
                {
                  "name": "row",
                  "type": {
                    "text": "Record<string, unknown>"
                  }
                },
                {
                  "name": "i",
                  "type": {
                    "text": "number"
                  }
                },
                {
                  "name": "cols",
                  "type": {
                    "text": "string[]"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "renderHeaderCell",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "parameters": [
                {
                  "name": "key",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "field",
              "name": "hasToolbar",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "renderToolbar",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              }
            },
            {
              "kind": "method",
              "name": "renderColumnToggle",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              }
            },
            {
              "kind": "method",
              "name": "renderAvailRow",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "parameters": [
                {
                  "name": "key",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "depth",
                  "type": {
                    "text": "number"
                  }
                }
              ],
              "description": "One row of the Available tree. A reference column gets an expander that\nunfolds its fields (the dot-walk); every row is a toggle button so the\nlist works from the keyboard without the native multi-select."
            },
            {
              "kind": "method",
              "name": "renderColumnModal",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              }
            },
            {
              "kind": "method",
              "name": "renderHead",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "parameters": [
                {
                  "name": "cols",
                  "type": {
                    "text": "string[]"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "renderFooter",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              }
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "loading",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "loading"
            },
            {
              "name": "error",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "error"
            },
            {
              "name": "error-message",
              "type": {
                "text": "string"
              },
              "default": "\"Couldn't load data. Try again.\"",
              "fieldName": "errorMessage"
            },
            {
              "name": "empty-message",
              "type": {
                "text": "string"
              },
              "default": "'No records yet.'",
              "fieldName": "emptyMessage"
            },
            {
              "name": "show-index",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "description": "Row-number column (No.). Offset lets numbering continue across pages.",
              "fieldName": "showIndex"
            },
            {
              "name": "index-offset",
              "type": {
                "text": "number"
              },
              "default": "0",
              "fieldName": "indexOffset"
            },
            {
              "name": "skeleton-rows",
              "type": {
                "text": "number"
              },
              "default": "10",
              "fieldName": "skeletonRows"
            },
            {
              "name": "row-key",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Which row key identifies a row in baht-row-click detail.id (e.g. 'group_id').",
              "fieldName": "rowKey"
            },
            {
              "name": "clickable",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "description": "Rows emit baht-row-click + get hover/keyboard affordances.",
              "fieldName": "clickable"
            },
            {
              "name": "group-by",
              "type": {
                "text": "GroupKey | undefined"
              },
              "description": "Group the page's rows by this (dotted) column key — or a function of the row (property). Unset = no grouping.",
              "fieldName": "groupBy"
            },
            {
              "name": "group-collapsible",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "description": "Group headers are disclosures (click to collapse). Set the JS property to `false` for static headers.",
              "fieldName": "groupCollapsible"
            },
            {
              "name": "group-collapsed",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Start every group collapsed (per page — resets when `items`/`page` change).",
              "fieldName": "groupCollapsed"
            },
            {
              "name": "hide-header",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Drop the column header row (list-style tables, e.g. grouped ledgers).",
              "fieldName": "hideHeader"
            },
            {
              "name": "column-picker",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "description": "Built-in \"Columns\" toggle — derives its options from `columns`/rows. Set `column-picker=\"false\"` to hide it.",
              "fieldName": "columnPicker"
            },
            {
              "name": "total",
              "type": {
                "text": "number | undefined | undefined"
              },
              "description": "Total matching rows across all pages — renders \"{n} results\" in the toolbar. Unset = no count.",
              "fieldName": "total"
            },
            {
              "name": "selectable",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "selectable"
            },
            {
              "name": "sortable",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Make every column sortable (or set `sortable` per column in `columns`).",
              "fieldName": "sortable"
            },
            {
              "name": "row-actions",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Trailing \"...\" button per row; emits `baht-row-actions { row, index, id }`.",
              "fieldName": "rowActions"
            },
            {
              "name": "page",
              "type": {
                "text": "number"
              },
              "default": "1",
              "fieldName": "page"
            },
            {
              "name": "total-pages",
              "type": {
                "text": "number"
              },
              "default": "1",
              "fieldName": "totalPages"
            },
            {
              "name": "cursor-mode",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Switch the footer to Prev/Next (cursor-based API, no total count).",
              "fieldName": "cursorMode"
            },
            {
              "name": "has-next",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "hasNext"
            },
            {
              "name": "has-prev",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "hasPrev"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-table",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtTable",
          "declaration": {
            "name": "BahtTable",
            "module": "src/components/primitives/baht-table.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-table",
          "declaration": {
            "name": "BahtTable",
            "module": "src/components/primitives/baht-table.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-tabs.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Tabs (APG tab pattern). The tab strip comes from `tabs`; the panels are your own children,\nmatched by `data-tab=\"<key>\"` — they get `role=\"tabpanel\"`, ids and `hidden` for you.\n\n  <baht-tabs label=\"Ticket\">\n    <section data-tab=\"details\">…</section>\n    <section data-tab=\"history\">…</section>\n  </baht-tabs>\n  el.tabs = [{ key: 'details', label: 'Details' }, { key: 'history', label: 'History', badge: '3' }];\n  el.addEventListener('baht-change', (e) => (location.hash = e.detail.value));\n\n`value` is the selected key (the first enabled tab when unset or unknown). Keyboard: ←/→\nmove between tabs (wrapping, skipping disabled), Home/End jump; with `activation=\"manual\"`\nthe arrows only move focus and Enter/Space selects. Only the selected tab is in the Tab order.",
          "name": "BahtTabs",
          "members": [
            {
              "kind": "field",
              "name": "tabs",
              "type": {
                "text": "TabItem[]"
              },
              "default": "[]",
              "description": "The tab strip. Set as a property: `el.tabs = [...]`."
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Selected tab key.",
              "attribute": "value",
              "reflects": true
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Accessible name of the tab list.",
              "attribute": "label"
            },
            {
              "kind": "field",
              "name": "activation",
              "type": {
                "text": "'automatic' | 'manual'"
              },
              "default": "'automatic'",
              "description": "`automatic` (default): arrows select. `manual`: arrows focus, Enter/Space selects.",
              "attribute": "activation"
            },
            {
              "kind": "field",
              "name": "variant",
              "type": {
                "text": "'line' | 'pill'"
              },
              "default": "'line'",
              "description": "`line` (default): an underline strip. `pill`: rounded chips; the active fill is `--baht-tabs-pill-active`.",
              "attribute": "variant"
            },
            {
              "kind": "field",
              "name": "panelKeys",
              "type": {
                "text": "readonly string[]"
              },
              "privacy": "private",
              "default": "[]"
            },
            {
              "kind": "field",
              "name": "panelsEl",
              "type": {
                "text": "HTMLElement"
              },
              "privacy": "private"
            },
            {
              "kind": "method",
              "name": "tabId",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "key",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "panelId",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "key",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "field",
              "name": "selected",
              "type": {
                "text": "string"
              },
              "description": "The tab actually shown: `value` when it names an enabled tab, else the first enabled one.",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "syncPanels",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "select",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "key",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "focusTab",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "key",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "field",
              "name": "onKeydown",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "events": [
            {
              "description": "The user selected a tab. `detail: { value }`. Setting `value` does not fire it.",
              "name": "baht-change"
            },
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "value",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Selected tab key.",
              "fieldName": "value"
            },
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Accessible name of the tab list.",
              "fieldName": "label"
            },
            {
              "name": "activation",
              "type": {
                "text": "'automatic' | 'manual'"
              },
              "default": "'automatic'",
              "description": "`automatic` (default): arrows select. `manual`: arrows focus, Enter/Space selects.",
              "fieldName": "activation"
            },
            {
              "name": "variant",
              "type": {
                "text": "'line' | 'pill'"
              },
              "default": "'line'",
              "description": "`line` (default): an underline strip. `pill`: rounded chips; the active fill is `--baht-tabs-pill-active`.",
              "fieldName": "variant"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-tabs",
          "customElement": true
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtTabs",
          "declaration": {
            "name": "BahtTabs",
            "module": "src/components/primitives/baht-tabs.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-tabs",
          "declaration": {
            "name": "BahtTabs",
            "module": "src/components/primitives/baht-tabs.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-tags.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Creatable chip input: value is `string[]` (unique, trimmed, in entry\norder). Type text + Enter or comma to add a chip; Backspace on an empty\ninput removes the last chip; pasting \"a, b, c\" adds three at once.\n\nSuggestions come from `field.options` — the SAME list every other\noption-bearing field reads, already resolved by `<baht-form>` when the\ndescriptor uses `options_from` (spec 01 §1: dynamic options are merged\ninto `field.options` before the primitive ever sees them, so this\ncomponent needs no fetcher of its own). They filter as you type\n(case-insensitive, prefix matches first) and exclude tags already chosen.\nFree text becomes a chip unless `field.allow_new === false`, in which case\nonly a suggestion's `key` (matched case-insensitively) can become one.\n\n  el.field = { type: 'tags', key: 'labels', options: [...], max_items: 5 };\n  el.addEventListener('baht-input', (e) => (draft.labels = e.detail.value));\n\nARIA: APG editable combobox with list autocomplete, same pattern as\n<baht-typeahead> — the input is the combobox, the chips sit before it in\nthe same control, `aria-activedescendant` walks the listbox.",
          "name": "BahtTags",
          "members": [
            {
              "kind": "field",
              "name": "inputText",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "default": "''"
            },
            {
              "kind": "field",
              "name": "open",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "default": "false"
            },
            {
              "kind": "field",
              "name": "activeIndex",
              "type": {
                "text": "number"
              },
              "privacy": "private",
              "default": "-1"
            },
            {
              "kind": "field",
              "name": "hint",
              "type": {
                "text": "string | null"
              },
              "privacy": "private",
              "default": "null",
              "description": "Transient reason the last chip attempt was refused (max_length /\nmax_items / allow_new / duplicate) — cleared on the next successful\nadd or edit, never persisted, never blocks anything by itself."
            },
            {
              "kind": "field",
              "name": "inputEl",
              "type": {
                "text": "HTMLInputElement | null"
              },
              "privacy": "private"
            },
            {
              "kind": "field",
              "name": "onDocMousedown",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "tags",
              "type": {
                "text": "string[]"
              },
              "privacy": "private",
              "description": "The host value as canonical tags — a store/host can hand in anything\n(`[1, null]`), and a non-string entry must not crash the render.",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "chipLabel",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "tag",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "A chip shows the matching option's label when the tag happens to be one\n(case-insensitive) — same fallback the readonly display (`displayValue`)\nalready applies; free text with no match shows as typed."
            },
            {
              "kind": "field",
              "name": "maxLength",
              "type": {
                "text": "number"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "allowNew",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "suggestions",
              "type": {
                "text": "FieldOption[]"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "inputId",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "description": "Same id the base label's `for` points at — clicking the field label\nfocuses the input natively, no click handler of our own needed.",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "listboxId",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "hintId",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "controlDescribedBy",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "private",
              "description": "Base `describedBy` (error/help) plus the transient refusal hint, when\none is showing.",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "optionId",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "i",
                  "type": {
                    "text": "number"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "rejectionFor",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TagRejection | null"
                }
              },
              "parameters": [
                {
                  "name": "current",
                  "type": {
                    "text": "string[]"
                  }
                },
                {
                  "name": "trimmed",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "lower",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "Why `trimmed` can't join `current` right now, or null when it can —\nsame rules bank20baht-validator re-checks server-side."
            },
            {
              "kind": "method",
              "name": "nextWithTag",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TagAttempt | null"
                }
              },
              "parameters": [
                {
                  "name": "current",
                  "type": {
                    "text": "string[]"
                  }
                },
                {
                  "name": "raw",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "`current` + one more chip, or the reason it was refused — null only for\nblank input (nothing worth reporting). Pure (no emit) so `addMany` can\nfold several candidates into ONE next array before telling the host,\ninstead of racing `this.value` across several back-to-back emits."
            },
            {
              "kind": "method",
              "name": "hintFor",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "reason",
                  "type": {
                    "text": "TagRejection"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "addTag",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "boolean"
                }
              },
              "parameters": [
                {
                  "name": "raw",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "Attempt to add one chip; returns whether it landed. A refusal shows a\nbrief inline hint instead of failing silently."
            },
            {
              "kind": "method",
              "name": "removeTag",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "tag",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "addMany",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "raw",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "Split pasted / bulk text on commas (and newlines) into separate chips,\nemitted as ONE array (see `nextWithTag`). Reports the last refusal only\nwhen NOTHING from the paste landed."
            },
            {
              "kind": "method",
              "name": "listen",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "close",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "highlight",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "index",
                  "type": {
                    "text": "number"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "commitTyped",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "pick",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "option",
                  "type": {
                    "text": "FieldOption"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "onInput",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "e",
                  "type": {
                    "text": "Event"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "onEnter",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "e",
                  "type": {
                    "text": "KeyboardEvent"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "onBackspace",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "e",
                  "type": {
                    "text": "KeyboardEvent"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "onArrowDown",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "e",
                  "type": {
                    "text": "KeyboardEvent"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "onArrowUp",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "e",
                  "type": {
                    "text": "KeyboardEvent"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "onEscape",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "e",
                  "type": {
                    "text": "KeyboardEvent"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "onKeydown",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "e",
                  "type": {
                    "text": "KeyboardEvent"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "onPaste",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "e",
                  "type": {
                    "text": "ClipboardEvent"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "onBlur",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "renderControl",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "defaultDebounce",
              "type": {
                "text": "number"
              },
              "static": true,
              "default": "150",
              "description": "Default trailing debounce (ms) for TYPED edits — text, email, password,\ntextarea, number. Every keystroke otherwise re-runs the host's rules,\nvalidation and dependent-option fetches. Per element: the `debounce`\nproperty/attribute; `<baht-form options.inputDebounce>` sets it for a whole\nform. 0 = emit on every keystroke. Selects, checkboxes, radios, toggles,\ndates and files are never debounced — a pick is one event.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "field",
              "type": {
                "text": "FieldDescriptor"
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "unknown"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "showOptional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "attribute": "show-optional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "error",
              "type": {
                "text": "string | null"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "attribute": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typed",
              "type": {
                "text": "{ value: unknown; emitted: boolean } | null"
              },
              "privacy": "private",
              "default": "null",
              "description": "The keystrokes not yet (or just) handed to the host. The control keeps\nrendering `typed.value` until the host's `value` moves, so a re-render\nmid-typing (a sibling field changing) can't snap the text back.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typedTimer",
              "type": {
                "text": "ReturnType<typeof setTimeout> | undefined"
              },
              "privacy": "private",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "onFocusOut",
              "privacy": "private",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "effectiveDebounce",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitTyped",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "A typed edit: emitted after `debounce` ms of quiet (or at once when 0).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "flushTyped",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Hand a pending typed edit to the host now (blur, disconnect, host reads). Idempotent.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownValue",
              "type": {
                "text": "unknown"
              },
              "privacy": "protected",
              "description": "What a typed control shows: pending keystrokes win over a stale host value.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownText",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "description": "`shownValue` as control text: `''` for null/undefined, `String()` otherwise.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "assignedField",
              "type": {
                "text": "FieldDescriptor | undefined"
              },
              "privacy": "protected",
              "description": "`field` as the host may actually have left it: a framework can connect the element\nbefore it binds the descriptor, so internally it is optional until then.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitInput",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Emit the user's edit upward (composed so it crosses any boundary).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "hasFieldIcon",
              "type": {
                "text": "boolean"
              },
              "privacy": "protected",
              "description": "True when `field.icon` names a real icon — gates both the icon markup\nand the control's icon-padding class, so a typo/removed name never\nleaves the control indented for a glyph that isn't there.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderFieldIcon",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Leading icon for text/currency/textarea/dropdown controls (spec: field.icon).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabel",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabelMark",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Required asterisk, or the \"(optional)\" marker when the form asks for it.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "controlId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "labelId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "errorId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "helpId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "describedBy",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "id list for the control's aria-describedby: error first, then help.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "invalidAttr",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "'true' while the field is in error, else absent (styles hook on [aria-invalid]).",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtFieldBase",
            "module": "/src/components/field-base.js"
          },
          "tagName": "baht-tags",
          "customElement": true,
          "attributes": [
            {
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "show-optional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "fieldName": "showOptional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "fieldName": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtTags",
          "declaration": {
            "name": "BahtTags",
            "module": "src/components/primitives/baht-tags.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-tags",
          "declaration": {
            "name": "BahtTags",
            "module": "src/components/primitives/baht-tags.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-text.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Static text block (`type: \"label\"`): no value, no emits.",
          "name": "BahtText",
          "members": [
            {
              "kind": "field",
              "name": "field",
              "type": {
                "text": "FieldDescriptor"
              }
            },
            {
              "kind": "field",
              "name": "assignedField",
              "type": {
                "text": "FieldDescriptor | undefined"
              },
              "privacy": "private",
              "description": "`field` as the host may actually have left it: a framework can bind it after connecting.",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-text",
          "customElement": true,
          "attributes": [
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtText",
          "declaration": {
            "name": "BahtText",
            "module": "src/components/primitives/baht-text.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-text",
          "declaration": {
            "name": "BahtText",
            "module": "src/components/primitives/baht-text.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-textarea.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "",
          "name": "BahtTextarea",
          "members": [
            {
              "kind": "method",
              "name": "renderControl",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "defaultDebounce",
              "type": {
                "text": "number"
              },
              "static": true,
              "default": "150",
              "description": "Default trailing debounce (ms) for TYPED edits — text, email, password,\ntextarea, number. Every keystroke otherwise re-runs the host's rules,\nvalidation and dependent-option fetches. Per element: the `debounce`\nproperty/attribute; `<baht-form options.inputDebounce>` sets it for a whole\nform. 0 = emit on every keystroke. Selects, checkboxes, radios, toggles,\ndates and files are never debounced — a pick is one event.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "field",
              "type": {
                "text": "FieldDescriptor"
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "unknown"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "showOptional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "attribute": "show-optional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "error",
              "type": {
                "text": "string | null"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "attribute": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typed",
              "type": {
                "text": "{ value: unknown; emitted: boolean } | null"
              },
              "privacy": "private",
              "default": "null",
              "description": "The keystrokes not yet (or just) handed to the host. The control keeps\nrendering `typed.value` until the host's `value` moves, so a re-render\nmid-typing (a sibling field changing) can't snap the text back.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typedTimer",
              "type": {
                "text": "ReturnType<typeof setTimeout> | undefined"
              },
              "privacy": "private",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "onFocusOut",
              "privacy": "private",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "effectiveDebounce",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitTyped",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "A typed edit: emitted after `debounce` ms of quiet (or at once when 0).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "flushTyped",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Hand a pending typed edit to the host now (blur, disconnect, host reads). Idempotent.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownValue",
              "type": {
                "text": "unknown"
              },
              "privacy": "protected",
              "description": "What a typed control shows: pending keystrokes win over a stale host value.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownText",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "description": "`shownValue` as control text: `''` for null/undefined, `String()` otherwise.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "assignedField",
              "type": {
                "text": "FieldDescriptor | undefined"
              },
              "privacy": "protected",
              "description": "`field` as the host may actually have left it: a framework can connect the element\nbefore it binds the descriptor, so internally it is optional until then.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitInput",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Emit the user's edit upward (composed so it crosses any boundary).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "hasFieldIcon",
              "type": {
                "text": "boolean"
              },
              "privacy": "protected",
              "description": "True when `field.icon` names a real icon — gates both the icon markup\nand the control's icon-padding class, so a typo/removed name never\nleaves the control indented for a glyph that isn't there.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderFieldIcon",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Leading icon for text/currency/textarea/dropdown controls (spec: field.icon).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabel",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabelMark",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Required asterisk, or the \"(optional)\" marker when the form asks for it.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "controlId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "labelId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "errorId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "helpId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "describedBy",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "id list for the control's aria-describedby: error first, then help.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "invalidAttr",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "'true' while the field is in error, else absent (styles hook on [aria-invalid]).",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtFieldBase",
            "module": "/src/components/field-base.js"
          },
          "tagName": "baht-textarea",
          "customElement": true,
          "attributes": [
            {
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "show-optional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "fieldName": "showOptional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "fieldName": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtTextarea",
          "declaration": {
            "name": "BahtTextarea",
            "module": "src/components/primitives/baht-textarea.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-textarea",
          "declaration": {
            "name": "BahtTextarea",
            "module": "src/components/primitives/baht-textarea.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-theme-toggle.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Light / dark switch for the 20baht themes. Sets `data-baht-theme` on `<html>` (or on the\n`target` element), so every `--baht-*` token follows.\n\n  <baht-theme-toggle></baht-theme-toggle>\n  <baht-theme-toggle default=\"system\"></baht-theme-toggle>   <!-- first visit follows the OS -->\n  <baht-theme-toggle target=\"#preview\" storage-key=\"\"></baht-theme-toggle>\n\nStarting theme: the one saved in `localStorage[storage-key]`, else the theme already on the\ntarget, else `default`. Clicking flips it, saves it and fires `baht-theme-change`. Every\ntoggle watches its target's attribute, so several toggles (or the app's own settings page)\nstay in sync. To avoid a flash of the wrong theme on load, apply the saved theme before\npaint with an inline script (see the docs page).\n\nA11y: an APG toggle button — fixed localized name (\"Dark theme\"), `aria-pressed` = dark.",
          "name": "BahtThemeToggle",
          "members": [
            {
              "kind": "field",
              "name": "theme",
              "type": {
                "text": "ThemeName"
              },
              "default": "'light'",
              "description": "Current theme. Setting it applies it to the target (not saved, no event).",
              "attribute": "theme",
              "reflects": true
            },
            {
              "kind": "field",
              "name": "default",
              "type": {
                "text": "ThemeName | 'system'"
              },
              "default": "'light'",
              "description": "Theme when nothing is saved and the target has none: `light`, `dark`, or `system`.",
              "attribute": "default"
            },
            {
              "kind": "field",
              "name": "target",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "CSS selector of the element that carries `data-baht-theme`. Default: `<html>`.",
              "attribute": "target"
            },
            {
              "kind": "field",
              "name": "storageKey",
              "type": {
                "text": "string"
              },
              "default": "'baht-theme'",
              "description": "localStorage key for the user's choice; `\"\"` turns persistence off.",
              "attribute": "storage-key"
            },
            {
              "kind": "field",
              "name": "targetEl",
              "type": {
                "text": "Element | null"
              },
              "privacy": "private",
              "default": "null"
            },
            {
              "kind": "field",
              "name": "observer",
              "type": {
                "text": "MutationObserver | null"
              },
              "privacy": "private",
              "default": "null"
            },
            {
              "kind": "method",
              "name": "attachTarget",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "initialTheme",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "ThemeName"
                }
              },
              "parameters": [
                {
                  "name": "el",
                  "type": {
                    "text": "Element"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "read",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "string | null"
                }
              }
            },
            {
              "kind": "method",
              "name": "save",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "theme",
                  "type": {
                    "text": "ThemeName"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "toggle",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Flip light ↔ dark, save it and fire `baht-theme-change` (what a click does)."
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "events": [
            {
              "description": "The user switched theme. `detail: { theme: 'light' | 'dark' }`.",
              "name": "baht-theme-change"
            },
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "theme",
              "type": {
                "text": "ThemeName"
              },
              "default": "'light'",
              "description": "Current theme. Setting it applies it to the target (not saved, no event).",
              "fieldName": "theme"
            },
            {
              "name": "default",
              "type": {
                "text": "ThemeName | 'system'"
              },
              "default": "'light'",
              "description": "Theme when nothing is saved and the target has none: `light`, `dark`, or `system`.",
              "fieldName": "default"
            },
            {
              "name": "target",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "CSS selector of the element that carries `data-baht-theme`. Default: `<html>`.",
              "fieldName": "target"
            },
            {
              "name": "storage-key",
              "type": {
                "text": "string"
              },
              "default": "'baht-theme'",
              "description": "localStorage key for the user's choice; `\"\"` turns persistence off.",
              "fieldName": "storageKey"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-theme-toggle",
          "customElement": true
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtThemeToggle",
          "declaration": {
            "name": "BahtThemeToggle",
            "module": "src/components/primitives/baht-theme-toggle.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-theme-toggle",
          "declaration": {
            "name": "BahtThemeToggle",
            "module": "src/components/primitives/baht-theme-toggle.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-timeline.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Vertical timeline (run history, audit log).\n\n  el.items = [\n    { title: 'Run started', time: '09:12', tone: 'muted' },\n    { title: 'Webhook sent', time: '09:12' },\n    { title: 'Failed', description: \"Couldn't reach the webhook.\", time: '09:13', tone: 'danger' },\n  ];",
          "name": "BahtTimeline",
          "members": [
            {
              "kind": "field",
              "name": "items",
              "type": {
                "text": "TimelineItem[]"
              },
              "default": "[]"
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-timeline",
          "customElement": true,
          "attributes": [
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtTimeline",
          "declaration": {
            "name": "BahtTimeline",
            "module": "src/components/primitives/baht-timeline.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-timeline",
          "declaration": {
            "name": "BahtTimeline",
            "module": "src/components/primitives/baht-timeline.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-toast.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Toast host — put ONE <baht-toast> on the page and call show():\n\n  const toast = document.querySelector('baht-toast');\n  toast.show({ message: 'Saved.', tone: 'success' });\n\nCopy: short and dry (\"Saved.\", not \"Successfully saved your changes!\").",
          "name": "BahtToast",
          "members": [
            {
              "kind": "field",
              "name": "duration",
              "type": {
                "text": "number"
              },
              "default": "4000",
              "description": "Default auto-dismiss (ms) when show() gets no duration.",
              "attribute": "duration"
            },
            {
              "kind": "field",
              "name": "entries",
              "type": {
                "text": "ToastEntry[]"
              },
              "privacy": "private",
              "default": "[]"
            },
            {
              "kind": "field",
              "name": "counter",
              "type": {
                "text": "number"
              },
              "privacy": "private",
              "static": true,
              "default": "0"
            },
            {
              "kind": "field",
              "name": "timers",
              "privacy": "private",
              "default": "new Map<number, ReturnType<typeof setTimeout>>()"
            },
            {
              "kind": "method",
              "name": "show",
              "return": {
                "type": {
                  "text": "number"
                }
              },
              "parameters": [
                {
                  "name": "options",
                  "type": {
                    "text": "ToastOptions"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "dismiss",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "id",
                  "type": {
                    "text": "number"
                  }
                }
              ]
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "duration",
              "type": {
                "text": "number"
              },
              "default": "4000",
              "description": "Default auto-dismiss (ms) when show() gets no duration.",
              "fieldName": "duration"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-toast",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtToast",
          "declaration": {
            "name": "BahtToast",
            "module": "src/components/primitives/baht-toast.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-toast",
          "declaration": {
            "name": "BahtToast",
            "module": "src/components/primitives/baht-toast.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-toggle.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "",
          "name": "BahtToggle",
          "members": [
            {
              "kind": "method",
              "name": "renderLabel",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "typeof nothing"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderControl",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "defaultDebounce",
              "type": {
                "text": "number"
              },
              "static": true,
              "default": "150",
              "description": "Default trailing debounce (ms) for TYPED edits — text, email, password,\ntextarea, number. Every keystroke otherwise re-runs the host's rules,\nvalidation and dependent-option fetches. Per element: the `debounce`\nproperty/attribute; `<baht-form options.inputDebounce>` sets it for a whole\nform. 0 = emit on every keystroke. Selects, checkboxes, radios, toggles,\ndates and files are never debounced — a pick is one event.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "field",
              "type": {
                "text": "FieldDescriptor"
              },
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "unknown"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "showOptional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "attribute": "show-optional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "error",
              "type": {
                "text": "string | null"
              },
              "default": "null",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "attribute": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typed",
              "type": {
                "text": "{ value: unknown; emitted: boolean } | null"
              },
              "privacy": "private",
              "default": "null",
              "description": "The keystrokes not yet (or just) handed to the host. The control keeps\nrendering `typed.value` until the host's `value` moves, so a re-render\nmid-typing (a sibling field changing) can't snap the text back.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "typedTimer",
              "type": {
                "text": "ReturnType<typeof setTimeout> | undefined"
              },
              "privacy": "private",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "onFocusOut",
              "privacy": "private",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "effectiveDebounce",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitTyped",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "A typed edit: emitted after `debounce` ms of quiet (or at once when 0).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "flushTyped",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Hand a pending typed edit to the host now (blur, disconnect, host reads). Idempotent.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownValue",
              "type": {
                "text": "unknown"
              },
              "privacy": "protected",
              "description": "What a typed control shows: pending keystrokes win over a stale host value.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "shownText",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "description": "`shownValue` as control text: `''` for null/undefined, `String()` otherwise.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "assignedField",
              "type": {
                "text": "FieldDescriptor | undefined"
              },
              "privacy": "protected",
              "description": "`field` as the host may actually have left it: a framework can connect the element\nbefore it binds the descriptor, so internally it is optional until then.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emitInput",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Emit the user's edit upward (composed so it crosses any boundary).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "hasFieldIcon",
              "type": {
                "text": "boolean"
              },
              "privacy": "protected",
              "description": "True when `field.icon` names a real icon — gates both the icon markup\nand the control's icon-padding class, so a typo/removed name never\nleaves the control indented for a glyph that isn't there.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderFieldIcon",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Leading icon for text/currency/textarea/dropdown controls (spec: field.icon).",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "method",
              "name": "renderLabelMark",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "description": "Required asterisk, or the \"(optional)\" marker when the form asks for it.",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "controlId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "labelId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "errorId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "helpId",
              "type": {
                "text": "string"
              },
              "privacy": "protected",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "describedBy",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "id list for the control's aria-describedby: error first, then help.",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "invalidAttr",
              "type": {
                "text": "string | typeof nothing"
              },
              "privacy": "protected",
              "description": "'true' while the field is in error, else absent (styles hook on [aria-invalid]).",
              "readonly": true,
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtFieldBase",
            "module": "/src/components/field-base.js"
          },
          "tagName": "baht-toggle",
          "customElement": true,
          "attributes": [
            {
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "disabled",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "readonly",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "readonly",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "required",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "show-optional",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Append the localized \"(optional)\" marker to the label when not required (set by <baht-form show-optional>).",
              "fieldName": "showOptional",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "debounce",
              "type": {
                "text": "number | undefined"
              },
              "description": "Debounce for typed edits (ms); unset = BahtFieldBase.defaultDebounce.",
              "fieldName": "debounce",
              "inheritedFrom": {
                "name": "BahtFieldBase",
                "module": "src/components/field-base.ts"
              }
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtToggle",
          "declaration": {
            "name": "BahtToggle",
            "module": "src/components/primitives/baht-toggle.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-toggle",
          "declaration": {
            "name": "BahtToggle",
            "module": "src/components/primitives/baht-toggle.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-tooltip.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Hover/focus tooltip. Wraps its children; pure CSS show/hide (120ms fade).\nEscape hides it without moving focus (WCAG 1.4.13); it re-arms on leave/blur.\n\n  <baht-tooltip text=\"Posted as JSON when the trigger fires\">\n    <baht-button variant=\"ghost\" label=\"?\"></baht-button>\n  </baht-tooltip>",
          "name": "BahtTooltip",
          "members": [
            {
              "kind": "field",
              "name": "text",
              "type": {
                "text": "string"
              },
              "default": "''",
              "attribute": "text"
            },
            {
              "kind": "field",
              "name": "position",
              "type": {
                "text": "'top' | 'bottom' | 'left' | 'right'"
              },
              "default": "'top'",
              "attribute": "position"
            },
            {
              "kind": "field",
              "name": "anchorEl",
              "type": {
                "text": "HTMLElement"
              },
              "privacy": "private"
            },
            {
              "kind": "field",
              "name": "dismissed",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "default": "false"
            },
            {
              "kind": "field",
              "name": "describedTarget",
              "type": {
                "text": "HTMLElement | null"
              },
              "privacy": "private",
              "default": "null"
            },
            {
              "kind": "field",
              "name": "tooltipId",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "wireDescribedBy",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Point aria-describedby at the tooltip from the focusable child (light DOM,\nso the id reference works). No focusable child -> the anchor itself becomes\none, so keyboard users can still surface the tooltip."
            },
            {
              "kind": "method",
              "name": "unwireDescribedBy",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "field",
              "name": "onKeydown",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "rearm",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "text",
              "type": {
                "text": "string"
              },
              "default": "''",
              "fieldName": "text"
            },
            {
              "name": "position",
              "type": {
                "text": "'top' | 'bottom' | 'left' | 'right'"
              },
              "default": "'top'",
              "fieldName": "position"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-tooltip",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtTooltip",
          "declaration": {
            "name": "BahtTooltip",
            "module": "src/components/primitives/baht-tooltip.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-tooltip",
          "declaration": {
            "name": "BahtTooltip",
            "module": "src/components/primitives/baht-tooltip.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-typeahead.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "Text input with suggestions (autocomplete). The value IS the text — pick a\nsuggestion and the input shows its label; keep typing and the text stands\non its own (`free-text`, default) or is only a filter (`free-text=\"false\"`,\nblur then reverts to the last picked option).\n\nSuggestions come from a static `options` list (filtered here — labels that\nstart with the term rank first, then labels that contain it) or from an\nasync `fetcher(term)`. Typing is debounced (`debounce`, 150 ms) before the\nhost hears `baht-change` and before a fetcher runs.\n\n  const el = document.createElement('baht-typeahead');\n  el.options = [{ key: 'th', label: 'Thailand' }, { key: 'tw', label: 'Taiwan' }];\n  el.addEventListener('baht-change', (e) => (draft.country = e.detail.value));\n  el.addEventListener('baht-select', (e) => (draft.countryCode = e.detail.option.key));\n\nARIA: APG editable combobox with list autocomplete — the input is the\ncombobox, `aria-activedescendant` walks the listbox, Escape closes, Enter\npicks. Unlike <baht-reference-picker> the input is always editable and the\ntext itself is a valid value; unlike <baht-select> the list is a filter of\nwhat was typed, not a fixed menu.",
          "name": "BahtTypeahead",
          "members": [
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "'Search'",
              "description": "Accessible name (also the listbox name).",
              "attribute": "label"
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "The text. Controlled: re-feed after `baht-change` (or don't — the input keeps what was typed).",
              "attribute": "value"
            },
            {
              "kind": "field",
              "name": "placeholder",
              "type": {
                "text": "string"
              },
              "default": "''",
              "attribute": "placeholder"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "disabled"
            },
            {
              "kind": "field",
              "name": "invalid",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Marks the control invalid (styles + aria-invalid).",
              "attribute": "invalid"
            },
            {
              "kind": "field",
              "name": "options",
              "type": {
                "text": "TypeaheadOption[]"
              },
              "default": "[]",
              "description": "Static suggestion list, filtered client-side. Ignored when `fetcher` is set."
            },
            {
              "kind": "field",
              "name": "fetcher",
              "type": {
                "text": "((term: string) => Promise<TypeaheadOption[]>) | null"
              },
              "default": "null",
              "description": "Async suggestions: term in, options out. Errors show as \"no matches\"."
            },
            {
              "kind": "field",
              "name": "debounce",
              "type": {
                "text": "number"
              },
              "default": "150",
              "description": "Quiet time (ms) before the host hears the text and suggestions are (re)computed.",
              "attribute": "debounce"
            },
            {
              "kind": "field",
              "name": "minChars",
              "type": {
                "text": "number"
              },
              "default": "1",
              "description": "Characters typed before suggestions appear (0 = suggest on focus/arrow too).",
              "attribute": "min-chars"
            },
            {
              "kind": "field",
              "name": "maxItems",
              "type": {
                "text": "number"
              },
              "default": "8",
              "description": "Cap on suggestions shown.",
              "attribute": "max-items"
            },
            {
              "kind": "field",
              "name": "freeText",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "description": "false = the text must be a picked option; blur reverts otherwise.",
              "attribute": "free-text"
            },
            {
              "kind": "field",
              "name": "autocomplete",
              "type": {
                "text": "string"
              },
              "default": "'off'",
              "description": "HTML autocomplete token forwarded to the input ('off' keeps the browser's own list away).",
              "attribute": "autocomplete"
            },
            {
              "kind": "field",
              "name": "term",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "default": "''"
            },
            {
              "kind": "field",
              "name": "open",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "default": "false"
            },
            {
              "kind": "field",
              "name": "results",
              "type": {
                "text": "TypeaheadOption[]"
              },
              "privacy": "private",
              "default": "[]"
            },
            {
              "kind": "field",
              "name": "loading",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "default": "false"
            },
            {
              "kind": "field",
              "name": "activeIndex",
              "type": {
                "text": "number"
              },
              "privacy": "private",
              "default": "-1"
            },
            {
              "kind": "field",
              "name": "inputEl",
              "type": {
                "text": "HTMLInputElement | null"
              },
              "privacy": "private"
            },
            {
              "kind": "field",
              "name": "timer",
              "type": {
                "text": "ReturnType<typeof setTimeout> | undefined"
              },
              "privacy": "private"
            },
            {
              "kind": "field",
              "name": "fetchSeq",
              "type": {
                "text": "number"
              },
              "privacy": "private",
              "default": "0"
            },
            {
              "kind": "field",
              "name": "picked",
              "type": {
                "text": "TypeaheadOption | null"
              },
              "privacy": "private",
              "default": "null",
              "description": "The text currently IS this picked option (null once the user types again)."
            },
            {
              "kind": "field",
              "name": "lastPicked",
              "type": {
                "text": "TypeaheadOption | null"
              },
              "privacy": "private",
              "default": "null",
              "description": "Most recent pick ever — what `free-text=\"false\"` reverts to on blur."
            },
            {
              "kind": "field",
              "name": "onDocMousedown",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "inputId",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "listboxId",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "optionId",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "i",
                  "type": {
                    "text": "number"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "filterStatic",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TypeaheadOption[]"
                }
              },
              "parameters": [
                {
                  "name": "term",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "suggest",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "Promise<void>"
                }
              },
              "parameters": [
                {
                  "name": "term",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "highlight",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "index",
                  "type": {
                    "text": "number"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "listen",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "close",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "emitChange",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "option",
                  "type": {
                    "text": "TypeaheadOption | null"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "onInput",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "e",
                  "type": {
                    "text": "Event"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "flush",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Hand pending text to the host now (blur, Enter)."
            },
            {
              "kind": "method",
              "name": "pick",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "option",
                  "type": {
                    "text": "TypeaheadOption"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "onBlur",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              }
            },
            {
              "kind": "method",
              "name": "onKeydown",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "e",
                  "type": {
                    "text": "KeyboardEvent"
                  }
                }
              ]
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "'Search'",
              "description": "Accessible name (also the listbox name).",
              "fieldName": "label"
            },
            {
              "name": "value",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "The text. Controlled: re-feed after `baht-change` (or don't — the input keeps what was typed).",
              "fieldName": "value"
            },
            {
              "name": "placeholder",
              "type": {
                "text": "string"
              },
              "default": "''",
              "fieldName": "placeholder"
            },
            {
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "disabled"
            },
            {
              "name": "invalid",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Marks the control invalid (styles + aria-invalid).",
              "fieldName": "invalid"
            },
            {
              "name": "debounce",
              "type": {
                "text": "number"
              },
              "default": "150",
              "description": "Quiet time (ms) before the host hears the text and suggestions are (re)computed.",
              "fieldName": "debounce"
            },
            {
              "name": "min-chars",
              "type": {
                "text": "number"
              },
              "default": "1",
              "description": "Characters typed before suggestions appear (0 = suggest on focus/arrow too).",
              "fieldName": "minChars"
            },
            {
              "name": "max-items",
              "type": {
                "text": "number"
              },
              "default": "8",
              "description": "Cap on suggestions shown.",
              "fieldName": "maxItems"
            },
            {
              "name": "free-text",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "description": "false = the text must be a picked option; blur reverts otherwise.",
              "fieldName": "freeText"
            },
            {
              "name": "autocomplete",
              "type": {
                "text": "string"
              },
              "default": "'off'",
              "description": "HTML autocomplete token forwarded to the input ('off' keeps the browser's own list away).",
              "fieldName": "autocomplete"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-typeahead",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtTypeahead",
          "declaration": {
            "name": "BahtTypeahead",
            "module": "src/components/primitives/baht-typeahead.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-typeahead",
          "declaration": {
            "name": "BahtTypeahead",
            "module": "src/components/primitives/baht-typeahead.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/baht-upload.ts",
      "declarations": [
        {
          "kind": "class",
          "description": "File upload against an HTTP endpoint. Picking (or dropping) a file sends it **immediately**\nas `multipart/form-data` to `url`; the endpoint answers with where it stored the file and\nthat URL becomes the value. Nothing waits for a form submit, and no host code is needed:\nthe whole contract is attributes.\n\n  <baht-upload url=\"/api/uploads\" accept=\".pdf,image/*\" max-size=\"10485760\"></baht-upload>\n\nExpected response: `2xx` with JSON `{ \"url\": \"…\" }` (change the key with `response-key`,\ndotted paths allowed) or a plain-text URL body. Anything else is an upload error the\nuser can retry.\n\n  el.addEventListener('baht-change', (e) => e.detail.value);   // string | string[] | null\n\nAuth: set `headers` (property) and/or `with-credentials`. Progress: `baht-upload-progress`.\nValue is controlled the usual way — feed it back on `baht-change`, or pre-fill with the\nURLs already on record and the chips render from them.",
          "name": "BahtUpload",
          "members": [
            {
              "kind": "field",
              "name": "url",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Endpoint that receives the file and returns its stored URL. Required.",
              "attribute": "url"
            },
            {
              "kind": "field",
              "name": "method",
              "type": {
                "text": "string"
              },
              "default": "'POST'",
              "description": "HTTP method for the upload request.",
              "attribute": "method"
            },
            {
              "kind": "field",
              "name": "fieldName",
              "type": {
                "text": "string"
              },
              "default": "'file'",
              "description": "Form-data key the file is sent under.",
              "attribute": "field-name"
            },
            {
              "kind": "field",
              "name": "responseKey",
              "type": {
                "text": "string"
              },
              "default": "'url'",
              "description": "Where the stored URL lives in a JSON response (dotted path). Empty = the body itself.",
              "attribute": "response-key"
            },
            {
              "kind": "field",
              "name": "headers",
              "type": {
                "text": "Record<string, string>"
              },
              "default": "{}",
              "description": "Extra request headers (e.g. Authorization). Property only."
            },
            {
              "kind": "field",
              "name": "withCredentials",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Send cookies on cross-origin requests.",
              "attribute": "with-credentials"
            },
            {
              "kind": "field",
              "name": "value",
              "type": {
                "text": "string | string[] | null"
              },
              "default": "null",
              "description": "Stored URL(s). `string`, `string[]` when `multiple`, or `null`. Property only."
            },
            {
              "kind": "field",
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Visible label.",
              "attribute": "label"
            },
            {
              "kind": "field",
              "name": "hint",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Helper text under the control. Defaults to the accept / size limits when set.",
              "attribute": "hint"
            },
            {
              "kind": "field",
              "name": "accept",
              "type": {
                "text": "string | undefined"
              },
              "description": "Native `accept` filter (`.pdf,image/*`).",
              "attribute": "accept"
            },
            {
              "kind": "field",
              "name": "multiple",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Allow several files; the value becomes an array.",
              "attribute": "multiple"
            },
            {
              "kind": "field",
              "name": "maxSize",
              "type": {
                "text": "number | undefined"
              },
              "description": "Reject files over this many bytes before sending.",
              "attribute": "max-size"
            },
            {
              "kind": "field",
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "disabled"
            },
            {
              "kind": "field",
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "attribute": "required"
            },
            {
              "kind": "field",
              "name": "error",
              "type": {
                "text": "string | null"
              },
              "default": "null",
              "description": "Validation message to display (marks the control invalid).",
              "attribute": "error"
            },
            {
              "kind": "field",
              "name": "pending",
              "type": {
                "text": "Pending[]"
              },
              "privacy": "private",
              "default": "[]"
            },
            {
              "kind": "field",
              "name": "rejectedNames",
              "type": {
                "text": "string[]"
              },
              "privacy": "private",
              "default": "[]"
            },
            {
              "kind": "field",
              "name": "dragging",
              "type": {
                "text": "boolean"
              },
              "privacy": "private",
              "default": "false"
            },
            {
              "kind": "field",
              "name": "known",
              "privacy": "private",
              "default": "new Map<string, UploadedFile>()",
              "description": "What is known about each stored URL (from the upload that produced it)."
            },
            {
              "kind": "field",
              "name": "seq",
              "type": {
                "text": "number"
              },
              "privacy": "private",
              "default": "0"
            },
            {
              "kind": "field",
              "name": "urls",
              "type": {
                "text": "string[]"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "inputId",
              "type": {
                "text": "string"
              },
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "fileFor",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "UploadedFile"
                }
              },
              "parameters": [
                {
                  "name": "url",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "clear",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Empty the value (does not delete anything on the server)."
            },
            {
              "kind": "method",
              "name": "emitValue",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "urls",
                  "type": {
                    "text": "string[]"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "accept_",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "files",
                  "type": {
                    "text": "File[]"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "onPick",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "e",
                  "type": {
                    "text": "Event"
                  }
                }
              ]
            },
            {
              "kind": "field",
              "name": "onDragOver",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "onDragLeave",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "field",
              "name": "onDrop",
              "privacy": "private",
              "readonly": true
            },
            {
              "kind": "method",
              "name": "start",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "file",
                  "type": {
                    "text": "File"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "patch",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "id",
                  "type": {
                    "text": "number"
                  }
                },
                {
                  "name": "patch",
                  "type": {
                    "text": "Partial<Pending>"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "send",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "entry",
                  "type": {
                    "text": "Pending"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "failed",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "entry",
                  "type": {
                    "text": "Pending"
                  }
                },
                {
                  "name": "status",
                  "type": {
                    "text": "number"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "retry",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "entry",
                  "type": {
                    "text": "Pending"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "dismiss",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "entry",
                  "type": {
                    "text": "Pending"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "defaultHint",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "string"
                }
              }
            },
            {
              "kind": "method",
              "name": "renderLabel",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              }
            },
            {
              "kind": "method",
              "name": "renderList",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "parameters": [
                {
                  "name": "busy",
                  "type": {
                    "text": "boolean"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "renderRejected",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              }
            },
            {
              "kind": "method",
              "name": "renderStored",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "parameters": [
                {
                  "name": "url",
                  "type": {
                    "text": "string"
                  }
                }
              ]
            },
            {
              "kind": "method",
              "name": "renderPending",
              "privacy": "private",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "parameters": [
                {
                  "name": "p",
                  "type": {
                    "text": "Pending"
                  }
                }
              ]
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "url",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Endpoint that receives the file and returns its stored URL. Required.",
              "fieldName": "url"
            },
            {
              "name": "method",
              "type": {
                "text": "string"
              },
              "default": "'POST'",
              "description": "HTTP method for the upload request.",
              "fieldName": "method"
            },
            {
              "name": "field-name",
              "type": {
                "text": "string"
              },
              "default": "'file'",
              "description": "Form-data key the file is sent under.",
              "fieldName": "fieldName"
            },
            {
              "name": "response-key",
              "type": {
                "text": "string"
              },
              "default": "'url'",
              "description": "Where the stored URL lives in a JSON response (dotted path). Empty = the body itself.",
              "fieldName": "responseKey"
            },
            {
              "name": "with-credentials",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Send cookies on cross-origin requests.",
              "fieldName": "withCredentials"
            },
            {
              "name": "label",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Visible label.",
              "fieldName": "label"
            },
            {
              "name": "hint",
              "type": {
                "text": "string"
              },
              "default": "''",
              "description": "Helper text under the control. Defaults to the accept / size limits when set.",
              "fieldName": "hint"
            },
            {
              "name": "accept",
              "type": {
                "text": "string | undefined"
              },
              "description": "Native `accept` filter (`.pdf,image/*`).",
              "fieldName": "accept"
            },
            {
              "name": "multiple",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Allow several files; the value becomes an array.",
              "fieldName": "multiple"
            },
            {
              "name": "max-size",
              "type": {
                "text": "number | undefined"
              },
              "description": "Reject files over this many bytes before sending.",
              "fieldName": "maxSize"
            },
            {
              "name": "disabled",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "disabled"
            },
            {
              "name": "required",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "fieldName": "required"
            },
            {
              "name": "error",
              "type": {
                "text": "string | null"
              },
              "default": "null",
              "description": "Validation message to display (marks the control invalid).",
              "fieldName": "error"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "tagName": "baht-upload",
          "customElement": true,
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "BahtUpload",
          "declaration": {
            "name": "BahtUpload",
            "module": "src/components/primitives/baht-upload.ts"
          }
        },
        {
          "kind": "custom-element-definition",
          "name": "baht-upload",
          "declaration": {
            "name": "BahtUpload",
            "module": "src/components/primitives/baht-upload.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/charts.ts",
      "declarations": [
        {
          "kind": "function",
          "name": "chartColor",
          "return": {
            "type": {
              "text": "string"
            }
          },
          "parameters": [
            {
              "name": "i",
              "type": {
                "text": "number"
              }
            },
            {
              "name": "override",
              "optional": true,
              "type": {
                "text": "string"
              }
            }
          ],
          "description": "CSS color for series `i` — `override` wins for the first series only."
        },
        {
          "kind": "function",
          "name": "chartSeqColor",
          "return": {
            "type": {
              "text": "string"
            }
          },
          "parameters": [
            {
              "name": "i",
              "type": {
                "text": "number"
              }
            },
            {
              "name": "steps",
              "default": "5"
            }
          ],
          "description": "Sequential ramp step `i` (0-based, light → dark in light mode)."
        },
        {
          "kind": "function",
          "name": "formatValue",
          "return": {
            "type": {
              "text": "string"
            }
          },
          "parameters": [
            {
              "name": "value",
              "type": {
                "text": "number"
              }
            },
            {
              "name": "format",
              "default": "'number'",
              "type": {
                "text": "ChartFormat"
              }
            },
            {
              "name": "currency",
              "default": "'THB'"
            }
          ],
          "description": "Render a number as display text.\n\n- `number` — grouped integer (`4,200`)\n- `currency` — narrow symbol, no decimals; THB renders `฿4,200`\n- `percent` — the value is a fraction (`0.185` → `18.5%`)\n- `compact` — `12.9K`, `4.2M`"
        },
        {
          "kind": "function",
          "name": "niceTicks",
          "return": {
            "type": {
              "text": "number[]"
            }
          },
          "parameters": [
            {
              "name": "max",
              "type": {
                "text": "number"
              }
            },
            {
              "name": "count",
              "default": "4"
            }
          ],
          "description": "Axis ticks rounded to clean numbers: `0 … max` in 1 / 2 / 2.5 / 5 × 10ⁿ steps,\nalways including 0 and a top step at or above `max` (marks-and-anatomy.md)."
        },
        {
          "kind": "function",
          "name": "linearScale",
          "return": {
            "type": {
              "text": "(value: number) => number"
            }
          },
          "parameters": [
            {
              "name": "domain",
              "type": {
                "text": "readonly [number, number]"
              }
            },
            {
              "name": "range",
              "type": {
                "text": "readonly [number, number]"
              }
            }
          ],
          "description": "`v → px` over a linear domain. Degenerate domains map to the range start."
        },
        {
          "kind": "function",
          "name": "foldOther",
          "return": {
            "type": {
              "text": "ChartGroup[]"
            }
          },
          "parameters": [
            {
              "name": "groups",
              "type": {
                "text": "ChartGroup[]"
              }
            },
            {
              "name": "max",
              "type": {
                "text": "number"
              }
            },
            {
              "name": "label",
              "default": "'Other'"
            }
          ],
          "description": "Fold the tail of a group list into a single grey \"Other\" bucket — never cycle\nor generate a ninth hue (anti-patterns.md)."
        },
        {
          "kind": "function",
          "name": "renderTableTwin",
          "return": {
            "type": {
              "text": "TemplateResult"
            }
          },
          "parameters": [
            {
              "name": "caption",
              "type": {
                "text": "string"
              }
            },
            {
              "name": "columns",
              "type": {
                "text": "string[]"
              }
            },
            {
              "name": "rows",
              "type": {
                "text": "(string | number)[][]"
              }
            },
            {
              "name": "summary",
              "default": "'View as table'"
            }
          ],
          "description": "The table twin every chart ships: the same numbers as real text, behind a\n`<details>` so it never competes with the marks. Cells are bound as text, so\nuntrusted series/category names can never inject markup."
        },
        {
          "kind": "class",
          "description": "Base for every chart element: the empty/loading contract, the value\nformatter, the table twin toggle and one floating tooltip per chart.\n\n`loading` holds the previous render at reduced opacity instead of flashing a\nskeleton (interaction.md): the data snapshot the chart draws is frozen while\nthe attribute is set, and picks up the new props when it clears.",
          "name": "BahtChartBase",
          "members": [
            {
              "kind": "field",
              "name": "emptyMessage",
              "type": {
                "text": "string"
              },
              "default": "'No data to chart'",
              "description": "Shown instead of the marks when there is nothing to plot.",
              "attribute": "empty-message"
            },
            {
              "kind": "field",
              "name": "loading",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Hold the previous render at reduced opacity while new data loads.",
              "attribute": "loading",
              "reflects": true
            },
            {
              "kind": "field",
              "name": "showTable",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "description": "Render the \"View as table\" twin under the chart.",
              "attribute": "show-table"
            },
            {
              "kind": "field",
              "name": "format",
              "type": {
                "text": "ChartFormat"
              },
              "default": "'number'",
              "description": "How values are rendered in labels, ticks, tooltips and the table twin.",
              "attribute": "format"
            },
            {
              "kind": "field",
              "name": "currency",
              "type": {
                "text": "string"
              },
              "default": "'THB'",
              "description": "ISO currency code for `format=\"currency\"` (THB renders `฿`).",
              "attribute": "currency"
            },
            {
              "kind": "field",
              "name": "tipEl",
              "type": {
                "text": "HTMLElement | undefined"
              },
              "privacy": "private"
            },
            {
              "kind": "field",
              "name": "held",
              "type": {
                "text": "unknown"
              },
              "privacy": "private",
              "default": "null"
            },
            {
              "kind": "method",
              "name": "fmt",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "value",
                  "type": {
                    "text": "number"
                  }
                }
              ],
              "description": "Value → display text using this chart's `format` / `currency`."
            },
            {
              "kind": "method",
              "name": "hold",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "T"
                }
              },
              "parameters": [
                {
                  "name": "next",
                  "type": {
                    "text": "T"
                  }
                }
              ],
              "description": "The snapshot to draw. While `loading` is set the previous one is returned,\nso a refetch dims the chart instead of emptying it."
            },
            {
              "kind": "method",
              "name": "rootClass",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "string"
                }
              },
              "parameters": [
                {
                  "name": "extra",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "Root class list: `baht-chart` plus the loading modifier."
            },
            {
              "kind": "method",
              "name": "renderTooltip",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "description": "The single floating tooltip node; rendered by the template, never appended."
            },
            {
              "kind": "method",
              "name": "showTip",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "event",
                  "type": {
                    "text": "Event"
                  }
                },
                {
                  "name": "text",
                  "type": {
                    "text": "string"
                  }
                }
              ],
              "description": "Show `text` near the pointer (or, on keyboard focus, near the mark).\nContent is assigned with `textContent`: category and series names are\nuntrusted data (interaction.md)."
            },
            {
              "kind": "method",
              "name": "hideTip",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "description": "Hide the tooltip (pointerleave / blur)."
            },
            {
              "kind": "method",
              "name": "renderEmpty",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult"
                }
              },
              "description": "The empty placeholder, or `nothing` when there is data."
            },
            {
              "kind": "method",
              "name": "renderLegend",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "TemplateResult | typeof nothing"
                }
              },
              "parameters": [
                {
                  "name": "entries",
                  "type": {
                    "text": "{ label: string; color: string; value?: string; share?: string }[]"
                  }
                },
                {
                  "name": "kind",
                  "default": "'rect'",
                  "type": {
                    "text": "'rect' | 'line'"
                  }
                }
              ],
              "description": "Legend rows — only ever rendered for 2+ series (marks-and-anatomy.md)."
            },
            {
              "kind": "field",
              "name": "uid",
              "type": {
                "text": "number"
              },
              "privacy": "protected",
              "default": "0",
              "description": "Per-instance sequence for unique DOM ids (`for`/`id`/`aria-*` pairs). Stays `0` for the\nserver render and for the client's hydrating render so both produce identical markup.\nThe number is allocated at the first update — not in `connectedCallback`, which the\nHTML parser can fire before the server-rendered children exist: plain client-side\nmounts get it just before their first render (single render, as before), hydrated\nones right after hydration (one extra render that rewrites the ids).",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            },
            {
              "kind": "method",
              "name": "emit",
              "privacy": "protected",
              "return": {
                "type": {
                  "text": "void"
                }
              },
              "parameters": [
                {
                  "name": "name",
                  "type": {
                    "text": "string"
                  }
                },
                {
                  "name": "detail",
                  "optional": true,
                  "type": {
                    "text": "unknown"
                  }
                }
              ],
              "description": "Dispatch a bubbling, composed CustomEvent — crosses any light/shadow DOM boundary.",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "attributes": [
            {
              "name": "empty-message",
              "type": {
                "text": "string"
              },
              "default": "'No data to chart'",
              "description": "Shown instead of the marks when there is nothing to plot.",
              "fieldName": "emptyMessage"
            },
            {
              "name": "loading",
              "type": {
                "text": "boolean"
              },
              "default": "false",
              "description": "Hold the previous render at reduced opacity while new data loads.",
              "fieldName": "loading"
            },
            {
              "name": "show-table",
              "type": {
                "text": "boolean"
              },
              "default": "true",
              "description": "Render the \"View as table\" twin under the chart.",
              "fieldName": "showTable"
            },
            {
              "name": "format",
              "type": {
                "text": "ChartFormat"
              },
              "default": "'number'",
              "description": "How values are rendered in labels, ticks, tooltips and the table twin.",
              "fieldName": "format"
            },
            {
              "name": "currency",
              "type": {
                "text": "string"
              },
              "default": "'THB'",
              "description": "ISO currency code for `format=\"currency\"` (THB renders `฿`).",
              "fieldName": "currency"
            },
            {
              "name": "defer-hydration",
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ],
          "superclass": {
            "name": "BahtElement",
            "module": "/src/components/base.js"
          },
          "events": [
            {
              "name": "name",
              "type": {
                "text": "CustomEvent"
              },
              "inheritedFrom": {
                "name": "BahtElement",
                "module": "src/components/base.ts"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "chartColor",
          "declaration": {
            "name": "chartColor",
            "module": "src/components/primitives/charts.ts"
          }
        },
        {
          "kind": "js",
          "name": "chartSeqColor",
          "declaration": {
            "name": "chartSeqColor",
            "module": "src/components/primitives/charts.ts"
          }
        },
        {
          "kind": "js",
          "name": "formatValue",
          "declaration": {
            "name": "formatValue",
            "module": "src/components/primitives/charts.ts"
          }
        },
        {
          "kind": "js",
          "name": "niceTicks",
          "declaration": {
            "name": "niceTicks",
            "module": "src/components/primitives/charts.ts"
          }
        },
        {
          "kind": "js",
          "name": "linearScale",
          "declaration": {
            "name": "linearScale",
            "module": "src/components/primitives/charts.ts"
          }
        },
        {
          "kind": "js",
          "name": "foldOther",
          "declaration": {
            "name": "foldOther",
            "module": "src/components/primitives/charts.ts"
          }
        },
        {
          "kind": "js",
          "name": "renderTableTwin",
          "declaration": {
            "name": "renderTableTwin",
            "module": "src/components/primitives/charts.ts"
          }
        },
        {
          "kind": "js",
          "name": "BahtChartBase",
          "declaration": {
            "name": "BahtChartBase",
            "module": "src/components/primitives/charts.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/illustrations.ts",
      "declarations": [
        {
          "kind": "function",
          "name": "isIllustrationName",
          "return": {
            "type": {
              "text": "v is IllustrationName"
            }
          },
          "parameters": [
            {
              "name": "v",
              "type": {
                "text": "string"
              }
            }
          ]
        },
        {
          "kind": "function",
          "name": "renderIllustration",
          "return": {
            "type": {
              "text": "TemplateResult"
            }
          },
          "parameters": [
            {
              "name": "name",
              "type": {
                "text": "IllustrationName"
              }
            }
          ],
          "description": "Render a named illustration as an inline SVG that inherits `color`."
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "isIllustrationName",
          "declaration": {
            "name": "isIllustrationName",
            "module": "src/components/primitives/illustrations.ts"
          }
        },
        {
          "kind": "js",
          "name": "renderIllustration",
          "declaration": {
            "name": "renderIllustration",
            "module": "src/components/primitives/illustrations.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/index.ts",
      "declarations": [],
      "exports": [
        {
          "kind": "js",
          "name": "BahtButton",
          "declaration": {
            "name": "BahtButton",
            "module": "./baht-button.js"
          }
        },
        {
          "kind": "js",
          "name": "ButtonVariant",
          "declaration": {
            "name": "ButtonVariant",
            "module": "./baht-button.js"
          }
        },
        {
          "kind": "js",
          "name": "ButtonSize",
          "declaration": {
            "name": "ButtonSize",
            "module": "./baht-button.js"
          }
        },
        {
          "kind": "js",
          "name": "renderIcon",
          "declaration": {
            "name": "renderIcon",
            "module": "./icons.js"
          }
        },
        {
          "kind": "js",
          "name": "isIconName",
          "declaration": {
            "name": "isIconName",
            "module": "./icons.js"
          }
        },
        {
          "kind": "js",
          "name": "IconName",
          "declaration": {
            "name": "IconName",
            "module": "./icons.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtBadge",
          "declaration": {
            "name": "BahtBadge",
            "module": "./baht-badge.js"
          }
        },
        {
          "kind": "js",
          "name": "BadgeTone",
          "declaration": {
            "name": "BadgeTone",
            "module": "./baht-badge.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtAvatar",
          "declaration": {
            "name": "BahtAvatar",
            "module": "./baht-avatar.js"
          }
        },
        {
          "kind": "js",
          "name": "AvatarSize",
          "declaration": {
            "name": "AvatarSize",
            "module": "./baht-avatar.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtCode",
          "declaration": {
            "name": "BahtCode",
            "module": "./baht-code.js"
          }
        },
        {
          "kind": "js",
          "name": "CodeVariant",
          "declaration": {
            "name": "CodeVariant",
            "module": "./baht-code.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtTable",
          "declaration": {
            "name": "BahtTable",
            "module": "./baht-table.js"
          }
        },
        {
          "kind": "js",
          "name": "CellRenderer",
          "declaration": {
            "name": "CellRenderer",
            "module": "./baht-table.js"
          }
        },
        {
          "kind": "js",
          "name": "ColumnAlign",
          "declaration": {
            "name": "ColumnAlign",
            "module": "./baht-table.js"
          }
        },
        {
          "kind": "js",
          "name": "ColumnMap",
          "declaration": {
            "name": "ColumnMap",
            "module": "./baht-table.js"
          }
        },
        {
          "kind": "js",
          "name": "ColumnSpec",
          "declaration": {
            "name": "ColumnSpec",
            "module": "./baht-table.js"
          }
        },
        {
          "kind": "js",
          "name": "ColumnsChangeDetail",
          "declaration": {
            "name": "ColumnsChangeDetail",
            "module": "./baht-table.js"
          }
        },
        {
          "kind": "js",
          "name": "GroupKey",
          "declaration": {
            "name": "GroupKey",
            "module": "./baht-table.js"
          }
        },
        {
          "kind": "js",
          "name": "GroupLabelRenderer",
          "declaration": {
            "name": "GroupLabelRenderer",
            "module": "./baht-table.js"
          }
        },
        {
          "kind": "js",
          "name": "GroupToggleDetail",
          "declaration": {
            "name": "GroupToggleDetail",
            "module": "./baht-table.js"
          }
        },
        {
          "kind": "js",
          "name": "SortDirection",
          "declaration": {
            "name": "SortDirection",
            "module": "./baht-table.js"
          }
        },
        {
          "kind": "js",
          "name": "SortState",
          "declaration": {
            "name": "SortState",
            "module": "./baht-table.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtList",
          "declaration": {
            "name": "BahtList",
            "module": "./baht-list.js"
          }
        },
        {
          "kind": "js",
          "name": "ListItem",
          "declaration": {
            "name": "ListItem",
            "module": "./baht-list.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtPagination",
          "declaration": {
            "name": "BahtPagination",
            "module": "./baht-pagination.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtModal",
          "declaration": {
            "name": "BahtModal",
            "module": "./baht-modal.js"
          }
        },
        {
          "kind": "js",
          "name": "ModalPlacement",
          "declaration": {
            "name": "ModalPlacement",
            "module": "./baht-modal.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtToast",
          "declaration": {
            "name": "BahtToast",
            "module": "./baht-toast.js"
          }
        },
        {
          "kind": "js",
          "name": "ToastOptions",
          "declaration": {
            "name": "ToastOptions",
            "module": "./baht-toast.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtTooltip",
          "declaration": {
            "name": "BahtTooltip",
            "module": "./baht-tooltip.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtThemeToggle",
          "declaration": {
            "name": "BahtThemeToggle",
            "module": "./baht-theme-toggle.js"
          }
        },
        {
          "kind": "js",
          "name": "ThemeName",
          "declaration": {
            "name": "ThemeName",
            "module": "./baht-theme-toggle.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtSplitButton",
          "declaration": {
            "name": "BahtSplitButton",
            "module": "./baht-split-button.js"
          }
        },
        {
          "kind": "js",
          "name": "MenuItem",
          "declaration": {
            "name": "MenuItem",
            "module": "./baht-split-button.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtMenu",
          "declaration": {
            "name": "BahtMenu",
            "module": "./baht-menu.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtTabs",
          "declaration": {
            "name": "BahtTabs",
            "module": "./baht-tabs.js"
          }
        },
        {
          "kind": "js",
          "name": "TabItem",
          "declaration": {
            "name": "TabItem",
            "module": "./baht-tabs.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtPopover",
          "declaration": {
            "name": "BahtPopover",
            "module": "./baht-popover.js"
          }
        },
        {
          "kind": "js",
          "name": "PopoverPlacement",
          "declaration": {
            "name": "PopoverPlacement",
            "module": "./baht-popover.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtAlert",
          "declaration": {
            "name": "BahtAlert",
            "module": "./baht-alert.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtRating",
          "declaration": {
            "name": "BahtRating",
            "module": "./baht-rating.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtRange",
          "declaration": {
            "name": "BahtRange",
            "module": "./baht-range.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtOtp",
          "declaration": {
            "name": "BahtOtp",
            "module": "./baht-otp.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtFilter",
          "declaration": {
            "name": "BahtFilter",
            "module": "./baht-filter.js"
          }
        },
        {
          "kind": "js",
          "name": "FilterVariant",
          "declaration": {
            "name": "FilterVariant",
            "module": "./baht-filter.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtSwipeRow",
          "declaration": {
            "name": "BahtSwipeRow",
            "module": "./baht-swipe-row.js"
          }
        },
        {
          "kind": "js",
          "name": "SwipeAction",
          "declaration": {
            "name": "SwipeAction",
            "module": "./baht-swipe-row.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtSkeleton",
          "declaration": {
            "name": "BahtSkeleton",
            "module": "./baht-skeleton.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtProgress",
          "declaration": {
            "name": "BahtProgress",
            "module": "./baht-progress.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtProgressRing",
          "declaration": {
            "name": "BahtProgressRing",
            "module": "./baht-progress-ring.js"
          }
        },
        {
          "kind": "js",
          "name": "ProgressRingTone",
          "declaration": {
            "name": "ProgressRingTone",
            "module": "./baht-progress-ring.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtSpinner",
          "declaration": {
            "name": "BahtSpinner",
            "module": "./baht-spinner.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtLoadingOverlay",
          "declaration": {
            "name": "BahtLoadingOverlay",
            "module": "./baht-loading-overlay.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtCard",
          "declaration": {
            "name": "BahtCard",
            "module": "./baht-card.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtFieldset",
          "declaration": {
            "name": "BahtFieldset",
            "module": "./baht-fieldset.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtTimeline",
          "declaration": {
            "name": "BahtTimeline",
            "module": "./baht-timeline.js"
          }
        },
        {
          "kind": "js",
          "name": "TimelineItem",
          "declaration": {
            "name": "TimelineItem",
            "module": "./baht-timeline.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtAccordion",
          "declaration": {
            "name": "BahtAccordion",
            "module": "./baht-accordion.js"
          }
        },
        {
          "kind": "js",
          "name": "AccordionItem",
          "declaration": {
            "name": "AccordionItem",
            "module": "./baht-accordion.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtLink",
          "declaration": {
            "name": "BahtLink",
            "module": "./baht-link.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtBreadcrumbs",
          "declaration": {
            "name": "BahtBreadcrumbs",
            "module": "./baht-breadcrumbs.js"
          }
        },
        {
          "kind": "js",
          "name": "Crumb",
          "declaration": {
            "name": "Crumb",
            "module": "./baht-breadcrumbs.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtInput",
          "declaration": {
            "name": "BahtInput",
            "module": "./baht-input.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtTextarea",
          "declaration": {
            "name": "BahtTextarea",
            "module": "./baht-textarea.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtNumber",
          "declaration": {
            "name": "BahtNumber",
            "module": "./baht-number.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtCurrency",
          "declaration": {
            "name": "BahtCurrency",
            "module": "./baht-currency.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtSelect",
          "declaration": {
            "name": "BahtSelect",
            "module": "./baht-select.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtMultiselect",
          "declaration": {
            "name": "BahtMultiselect",
            "module": "./baht-multiselect.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtTags",
          "declaration": {
            "name": "BahtTags",
            "module": "./baht-tags.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtCheckbox",
          "declaration": {
            "name": "BahtCheckbox",
            "module": "./baht-checkbox.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtRadio",
          "declaration": {
            "name": "BahtRadio",
            "module": "./baht-radio.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtToggle",
          "declaration": {
            "name": "BahtToggle",
            "module": "./baht-toggle.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtDatepicker",
          "declaration": {
            "name": "BahtDatepicker",
            "module": "./baht-datepicker.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtFile",
          "declaration": {
            "name": "BahtFile",
            "module": "./baht-file.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtUpload",
          "declaration": {
            "name": "BahtUpload",
            "module": "./baht-upload.js"
          }
        },
        {
          "kind": "js",
          "name": "UploadChangeDetail",
          "declaration": {
            "name": "UploadChangeDetail",
            "module": "./baht-upload.js"
          }
        },
        {
          "kind": "js",
          "name": "UploadProgressDetail",
          "declaration": {
            "name": "UploadProgressDetail",
            "module": "./baht-upload.js"
          }
        },
        {
          "kind": "js",
          "name": "UploadErrorDetail",
          "declaration": {
            "name": "UploadErrorDetail",
            "module": "./baht-upload.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtText",
          "declaration": {
            "name": "BahtText",
            "module": "./baht-text.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtSection",
          "declaration": {
            "name": "BahtSection",
            "module": "./baht-section.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtStatChart",
          "declaration": {
            "name": "BahtStatChart",
            "module": "./baht-stat-chart.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtStat",
          "declaration": {
            "name": "BahtStat",
            "module": "./baht-stat.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtSparkline",
          "declaration": {
            "name": "BahtSparkline",
            "module": "./baht-sparkline.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtDonutChart",
          "declaration": {
            "name": "BahtDonutChart",
            "module": "./baht-donut-chart.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtBarChart",
          "declaration": {
            "name": "BahtBarChart",
            "module": "./baht-bar-chart.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtLineChart",
          "declaration": {
            "name": "BahtLineChart",
            "module": "./baht-line-chart.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtHeatmap",
          "declaration": {
            "name": "BahtHeatmap",
            "module": "./baht-heatmap.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtMeter",
          "declaration": {
            "name": "BahtMeter",
            "module": "./baht-meter.js"
          }
        },
        {
          "kind": "js",
          "name": "MeterThresholds",
          "declaration": {
            "name": "MeterThresholds",
            "module": "./baht-meter.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtChartBase",
          "declaration": {
            "name": "BahtChartBase",
            "module": "./charts.js"
          }
        },
        {
          "kind": "js",
          "name": "chartColor",
          "declaration": {
            "name": "chartColor",
            "module": "./charts.js"
          }
        },
        {
          "kind": "js",
          "name": "chartSeqColor",
          "declaration": {
            "name": "chartSeqColor",
            "module": "./charts.js"
          }
        },
        {
          "kind": "js",
          "name": "foldOther",
          "declaration": {
            "name": "foldOther",
            "module": "./charts.js"
          }
        },
        {
          "kind": "js",
          "name": "formatValue",
          "declaration": {
            "name": "formatValue",
            "module": "./charts.js"
          }
        },
        {
          "kind": "js",
          "name": "linearScale",
          "declaration": {
            "name": "linearScale",
            "module": "./charts.js"
          }
        },
        {
          "kind": "js",
          "name": "niceTicks",
          "declaration": {
            "name": "niceTicks",
            "module": "./charts.js"
          }
        },
        {
          "kind": "js",
          "name": "renderTableTwin",
          "declaration": {
            "name": "renderTableTwin",
            "module": "./charts.js"
          }
        },
        {
          "kind": "js",
          "name": "ChartDatePoint",
          "declaration": {
            "name": "ChartDatePoint",
            "module": "./charts.js"
          }
        },
        {
          "kind": "js",
          "name": "ChartFormat",
          "declaration": {
            "name": "ChartFormat",
            "module": "./charts.js"
          }
        },
        {
          "kind": "js",
          "name": "ChartGroup",
          "declaration": {
            "name": "ChartGroup",
            "module": "./charts.js"
          }
        },
        {
          "kind": "js",
          "name": "ChartMarker",
          "declaration": {
            "name": "ChartMarker",
            "module": "./charts.js"
          }
        },
        {
          "kind": "js",
          "name": "ChartSeries",
          "declaration": {
            "name": "ChartSeries",
            "module": "./charts.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtEmptyState",
          "declaration": {
            "name": "BahtEmptyState",
            "module": "./baht-empty-state.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtErrorState",
          "declaration": {
            "name": "BahtErrorState",
            "module": "./baht-error-state.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtKeyvalueEditor",
          "declaration": {
            "name": "BahtKeyvalueEditor",
            "module": "./baht-keyvalue-editor.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtReferencePicker",
          "declaration": {
            "name": "BahtReferencePicker",
            "module": "./baht-reference-picker.js"
          }
        },
        {
          "kind": "js",
          "name": "FieldReferenceLookup",
          "declaration": {
            "name": "FieldReferenceLookup",
            "module": "./baht-reference-picker.js"
          }
        },
        {
          "kind": "js",
          "name": "ReferenceOption",
          "declaration": {
            "name": "ReferenceOption",
            "module": "./baht-reference-picker.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtTypeahead",
          "declaration": {
            "name": "BahtTypeahead",
            "module": "./baht-typeahead.js"
          }
        },
        {
          "kind": "js",
          "name": "TypeaheadOption",
          "declaration": {
            "name": "TypeaheadOption",
            "module": "./baht-typeahead.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtRepeater",
          "declaration": {
            "name": "BahtRepeater",
            "module": "./baht-repeater.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtSteps",
          "declaration": {
            "name": "BahtSteps",
            "module": "./baht-steps.js"
          }
        },
        {
          "kind": "js",
          "name": "TAG_FOR_TYPE",
          "declaration": {
            "name": "TAG_FOR_TYPE",
            "module": "./tag-map.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtComments",
          "declaration": {
            "name": "BahtComments",
            "module": "./baht-comments.js"
          }
        },
        {
          "kind": "js",
          "name": "CommentEntry",
          "declaration": {
            "name": "CommentEntry",
            "module": "./baht-comments.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtEditTable",
          "declaration": {
            "name": "BahtEditTable",
            "module": "./baht-edit-table.js"
          }
        },
        {
          "kind": "js",
          "name": "EditColumn",
          "declaration": {
            "name": "EditColumn",
            "module": "./baht-edit-table.js"
          }
        },
        {
          "kind": "js",
          "name": "EditRow",
          "declaration": {
            "name": "EditRow",
            "module": "./baht-edit-table.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtNotificationBell",
          "declaration": {
            "name": "BahtNotificationBell",
            "module": "./baht-notification-bell.js"
          }
        },
        {
          "kind": "js",
          "name": "NotificationItem",
          "declaration": {
            "name": "NotificationItem",
            "module": "./baht-notification-bell.js"
          }
        },
        {
          "kind": "js",
          "name": "BahtRuleBuilder",
          "declaration": {
            "name": "BahtRuleBuilder",
            "module": "./baht-rule-builder.js"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/kbd.ts",
      "declarations": [
        {
          "kind": "function",
          "name": "renderKbd",
          "return": {
            "type": {
              "text": "TemplateResult | typeof nothing"
            }
          },
          "parameters": [
            {
              "name": "spec",
              "type": {
                "text": "string"
              }
            },
            {
              "name": "mac",
              "type": {
                "text": "boolean"
              }
            }
          ],
          "description": "`<kbd class=\"baht-kbd\">⌥Q</kbd>` for a shortcut spec (`Alt+Q` off Mac); nothing when\nthe spec does not parse. Shared by the button tooltip and menu item hints."
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "renderKbd",
          "declaration": {
            "name": "renderKbd",
            "module": "src/components/primitives/kbd.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/listbox.ts",
      "declarations": [
        {
          "kind": "function",
          "name": "listenOutside",
          "return": {
            "type": {
              "text": "void"
            }
          },
          "parameters": [
            {
              "name": "handler",
              "type": {
                "text": "(e: MouseEvent) => void"
              }
            }
          ],
          "description": "Start watching for a mousedown outside an open listbox."
        },
        {
          "kind": "function",
          "name": "unlistenOutside",
          "return": {
            "type": {
              "text": "void"
            }
          },
          "parameters": [
            {
              "name": "handler",
              "type": {
                "text": "(e: MouseEvent) => void"
              }
            }
          ],
          "description": "Stop watching for a mousedown outside a listbox."
        },
        {
          "kind": "function",
          "name": "scrollOptionIntoView",
          "return": {
            "type": {
              "text": "void"
            }
          },
          "parameters": [
            {
              "name": "host",
              "type": {
                "text": "Element"
              }
            },
            {
              "name": "open",
              "type": {
                "text": "boolean"
              }
            },
            {
              "name": "index",
              "type": {
                "text": "number"
              }
            },
            {
              "name": "id",
              "type": {
                "text": "string"
              }
            }
          ],
          "description": "Keep the active option of an open listbox in view."
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "listenOutside",
          "declaration": {
            "name": "listenOutside",
            "module": "src/components/primitives/listbox.ts"
          }
        },
        {
          "kind": "js",
          "name": "unlistenOutside",
          "declaration": {
            "name": "unlistenOutside",
            "module": "src/components/primitives/listbox.ts"
          }
        },
        {
          "kind": "js",
          "name": "scrollOptionIntoView",
          "declaration": {
            "name": "scrollOptionIntoView",
            "module": "src/components/primitives/listbox.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/rule-rows.ts",
      "declarations": [
        {
          "kind": "variable",
          "name": "CONDITION_OPS",
          "type": {
            "text": "readonly { op: ConditionOp; label: string; needsValue: boolean }[]"
          },
          "default": "[ { op: 'eq', label: 'is', needsValue: true }, { op: 'ne', label: 'is not', needsValue: true }, { op: 'in', label: 'is one of', needsValue: true }, { op: 'notIn', label: 'is none of', needsValue: true }, { op: 'contains', label: 'contains', needsValue: true }, { op: 'gt', label: '>', needsValue: true }, { op: 'lt', label: '<', needsValue: true }, { op: 'isEmpty', label: 'is empty', needsValue: false }, { op: 'isNotEmpty', label: 'is not empty', needsValue: false }, ]"
        },
        {
          "kind": "variable",
          "name": "ACTIONS",
          "type": {
            "text": "readonly { action: RuleAction['action']; label: string }[]"
          },
          "default": "[ { action: 'show', label: 'Show' }, { action: 'hide', label: 'Hide' }, { action: 'required', label: 'Make mandatory' }, { action: 'optional', label: 'Make optional' }, { action: 'readonly', label: 'Make read-only' }, { action: 'setValue', label: 'Set value of' }, { action: 'skipForm', label: 'Skip step' }, ]"
        },
        {
          "kind": "function",
          "name": "fieldChoices",
          "return": {
            "type": {
              "text": "{ ref: string; label: string; type: string }[]"
            }
          },
          "parameters": [
            {
              "name": "draft",
              "type": {
                "text": "WorkflowDefinition"
              }
            }
          ],
          "description": "Every input field across the workflow, as `Form_Name.key` with a readable label."
        },
        {
          "kind": "function",
          "name": "toRows",
          "return": {
            "type": {
              "text": "RuleRow[]"
            }
          },
          "parameters": [
            {
              "name": "rules",
              "type": {
                "text": "readonly Rule[]"
              }
            }
          ]
        },
        {
          "kind": "function",
          "name": "toRules",
          "return": {
            "type": {
              "text": "Rule[]"
            }
          },
          "parameters": [
            {
              "name": "rows",
              "type": {
                "text": "readonly RuleRow[]"
              }
            },
            {
              "name": "draft",
              "type": {
                "text": "WorkflowDefinition"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "CONDITION_OPS",
          "declaration": {
            "name": "CONDITION_OPS",
            "module": "src/components/primitives/rule-rows.ts"
          }
        },
        {
          "kind": "js",
          "name": "ACTIONS",
          "declaration": {
            "name": "ACTIONS",
            "module": "src/components/primitives/rule-rows.ts"
          }
        },
        {
          "kind": "js",
          "name": "fieldChoices",
          "declaration": {
            "name": "fieldChoices",
            "module": "src/components/primitives/rule-rows.ts"
          }
        },
        {
          "kind": "js",
          "name": "toRows",
          "declaration": {
            "name": "toRows",
            "module": "src/components/primitives/rule-rows.ts"
          }
        },
        {
          "kind": "js",
          "name": "toRules",
          "declaration": {
            "name": "toRules",
            "module": "src/components/primitives/rule-rows.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/components/primitives/tag-map.ts",
      "declarations": [
        {
          "kind": "variable",
          "name": "TAG_FOR_TYPE",
          "type": {
            "text": "Record<FieldType, string>"
          },
          "default": "{ text: 'baht-input', email: 'baht-input', password: 'baht-input', textarea: 'baht-textarea', number: 'baht-number', currency: 'baht-currency', dropdown: 'baht-select', multiselect: 'baht-multiselect', checkbox: 'baht-checkbox', radio: 'baht-radio', toggle: 'baht-toggle', date: 'baht-datepicker', file: 'baht-file', label: 'baht-text', section: 'baht-section', repeater: 'baht-repeater', tags: 'baht-tags', rating: 'baht-rating', range: 'baht-range', reference: 'baht-reference-picker', }",
          "description": "field descriptor `type` -> primitive tag (used by <baht-form>, <baht-repeater>\nand the builder). Lives in its own module so baht-repeater can read it\nwithout importing the primitives barrel (which would be circular)."
        },
        {
          "kind": "variable",
          "name": "WIDTH_CLASS",
          "type": {
            "text": "Record<string, string>"
          },
          "default": "{ '1/4': 'baht-field--w-1-4', '1/2': 'baht-field--w-1-2', '3/4': 'baht-field--w-3-4', full: 'baht-field--w-full', }",
          "description": "`field.width` -> layout class, shared by <baht-form> and <baht-repeater>."
        },
        {
          "kind": "function",
          "name": "staticTag",
          "return": {
            "type": {
              "text": "StaticValue"
            }
          },
          "parameters": [
            {
              "name": "tag",
              "type": {
                "text": "string"
              }
            }
          ]
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "TAG_FOR_TYPE",
          "declaration": {
            "name": "TAG_FOR_TYPE",
            "module": "src/components/primitives/tag-map.ts"
          }
        },
        {
          "kind": "js",
          "name": "WIDTH_CLASS",
          "declaration": {
            "name": "WIDTH_CLASS",
            "module": "src/components/primitives/tag-map.ts"
          }
        },
        {
          "kind": "js",
          "name": "staticTag",
          "declaration": {
            "name": "staticTag",
            "module": "src/components/primitives/tag-map.ts"
          }
        }
      ]
    },
    {
      "kind": "javascript-module",
      "path": "src/overlay.ts",
      "declarations": [
        {
          "kind": "variable",
          "name": "dialog",
          "type": {
            "text": "object"
          },
          "default": "{ /** Yes/no question. Resolves true only on explicit confirm. */ async confirm(message: string, options: DialogOptions = {}): Promise<boolean> { const result = await showDialog({ title: 'Are you sure?', confirmText: 'Confirm', ...options, message, showCancel: true, showInput: false, }); return result.confirmed; }, /** One-button notice. Resolves when acknowledged. */ async alert(message: string, options: DialogOptions = {}): Promise<void> { await showDialog({ title: 'Notice', ...options, message, showCancel: false, showInput: false, }); }, /** Error notice — danger tone, optional monospace `detail`. */ async error(message: string, options: DialogOptions = {}): Promise<void> { await showDialog({ title: 'Something went wrong', tone: 'danger', ...options, message, showCancel: false, showInput: false, }); }, /** Single text input. Resolves the value, or null on cancel/dismiss. */ async prompt(message: string, options: PromptOptions = {}): Promise<string | null> { const result = await showDialog({ title: 'Input needed', confirmText: 'OK', ...options, message, showCancel: true, showInput: true, }); return result.confirmed ? (result.value ?? '') : null; }, }"
        },
        {
          "kind": "variable",
          "name": "toast",
          "type": {
            "text": "object"
          },
          "default": "{ show(message: string, options: Omit<ToastOptions, 'message'> = {}): number { return ensureToastHost().show({ message, ...options }); }, success: toneShorthand('success'), info: toneShorthand('info'), warning: toneShorthand('warning'), danger: toneShorthand('danger'), dismiss(id: number): void { toastHost?.dismiss(id); }, }"
        }
      ],
      "exports": [
        {
          "kind": "js",
          "name": "dialog",
          "declaration": {
            "name": "dialog",
            "module": "src/overlay.ts"
          }
        },
        {
          "kind": "js",
          "name": "toast",
          "declaration": {
            "name": "toast",
            "module": "src/overlay.ts"
          }
        }
      ]
    }
  ]
}
