bitboss-ui 3.0.0-beta.45 → 3.0.0-beta.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/bin/bitboss-ui.mjs +6 -1
  2. package/dist/ai/BbDialog.md +12 -10
  3. package/dist/ai/BbDropzone.md +2 -2
  4. package/dist/ai/BbForm.md +2 -2
  5. package/dist/ai/BbOffCanvas.md +3 -3
  6. package/dist/ai/BbPopover.md +1 -1
  7. package/dist/ai/BbRating.md +1 -1
  8. package/dist/ai/BbTable.md +2 -2
  9. package/dist/ai/BbTabs.md +4 -4
  10. package/dist/ai/BbTextInput.md +13 -11
  11. package/dist/ai/BbTextarea.md +8 -7
  12. package/dist/ai/changelog.json +17 -3
  13. package/dist/ai/components.json +5 -4
  14. package/dist/ai/guides/installation-and-plugin-setup.md +31 -5
  15. package/dist/ai/guides/migration/v2-to-v3.md +10 -0
  16. package/dist/ai/guides/validation-libraries.md +7 -4
  17. package/dist/ai/manifest/components/BbTextInput.json +4 -3
  18. package/dist/ai/manifest/components/BbTextarea.json +2 -1
  19. package/dist/ai/manifest/index.json +2 -2
  20. package/dist/ai/manifest/meta.json +1 -0
  21. package/dist/ai/manifest/types.advanced.json +1 -0
  22. package/dist/ai/recipes/inertia/approvals-inbox.md +8 -6
  23. package/dist/ai/recipes/nuxt/approvals-inbox.md +8 -6
  24. package/dist/ai/recipes/vue/approvals-inbox.md +8 -6
  25. package/dist/ai/source/BbTextInput.md +44 -12
  26. package/dist/ai/source/BbTextarea.md +45 -13
  27. package/dist/components/BbTextInput/BbTextInput.vue.d.ts +31 -39
  28. package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +19 -18
  29. package/dist/components/BbTextInput/types.d.ts +17 -4
  30. package/dist/components/BbTextarea/BbTextarea.vue.d.ts +31 -37
  31. package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +40 -39
  32. package/dist/components/BbTextarea/types.d.ts +17 -4
  33. package/dist/composables/useSegmentedFields.js +4 -4
  34. package/dist/index.d.ts +1 -0
  35. package/dist/llms-full.txt +120 -70
  36. package/dist/llms-medium.txt +31 -5
  37. package/dist/project-dts.d.ts +8 -0
  38. package/dist/project-dts.js +6 -3
  39. package/dist/styles.css +1 -1
  40. package/dist/types/Config.d.ts +26 -8
  41. package/dist/utils/versionCheck.js +1 -1
  42. package/dist/vite-plugin.d.ts +6 -4
  43. package/dist/vite.js +182 -181
  44. package/package.json +1 -1
  45. package/scripts/lib/eslint-disable.mjs +2 -0
  46. package/scripts/lib/eslint-plugin.d.ts +2 -0
  47. package/scripts/lib/eslint-plugin.mjs +117 -0
  48. package/scripts/lib/text-null-value.mjs +260 -0
  49. package/scripts/lib/validate-bb-markup.mjs +4 -0
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
3
  "library": "bitboss-ui",
4
- "version": "3.0.0-beta.45",
5
- "generatedAt": "2026-10-02T12:07:33.079Z",
4
+ "version": "3.0.0-beta.46",
5
+ "generatedAt": "2026-10-05T12:36:31.120Z",
6
6
  "legend": {
7
7
  "referenceOnly": "true = internal building block, documented so trees and sources can be read. Never write it in a template; most are not exported.",
8
8
  "types[].usage": "api = the type of a prop, event or slot value you pass; wrapper = a component Props/Events/Slots type (its component entry lists every field); advanced = everything else.",
@@ -419,6 +419,7 @@
419
419
  {"name":"DynamicConfig","usage":"advanced","component":null,"usedBy":[],"definition":"type DynamicConfig = Pick<EditableConfig, 'locale'>;","fields":["locale: \"pt\" | \"cs\" | \"da\" | \"de\" | \"el\" | \"en\" | \"es\" | \"fi\" | \"fr\" | \"hu\" | \"it\" | \"ja\" | \"ko\" | \"nb\" | \"nl\" | \"pl\" | \"ro\" | \"ru\" | \"sv\" | \"tr\" | \"uk\" | \"zh-cn\""]},
420
420
  {"name":"ElementOrComponentRef","usage":"api","component":null,"usedBy":[{"component":"BbColorPalette","surface":"prop","name":"activator"},{"component":"BbColorPalette","surface":"prop","name":"anchor"},{"component":"BbDatePicker","surface":"prop","name":"activator"},{"component":"BbDatePicker","surface":"prop","name":"anchor"},{"component":"BbPopover","surface":"prop","name":"activator"},{"component":"BbTimePicker","surface":"prop","name":"activator"},{"component":"BbTimePicker","surface":"prop","name":"anchor"},{"component":"BbTooltip","surface":"prop","name":"activator"}],"definition":"type ElementOrComponentRef = HTMLElement | ComponentPublicInstance | Pick<ComponentPublicInstance, '$el'> | null;"},
421
421
  {"name":"ElementOrComponentRefOrSelector","usage":"api","component":null,"usedBy":[{"component":"BbColorPalette","surface":"prop","name":"boundary"},{"component":"BbDatePicker","surface":"prop","name":"boundary"},{"component":"BbPopover","surface":"prop","name":"boundary"},{"component":"BbTimePicker","surface":"prop","name":"boundary"},{"component":"BbTooltip","surface":"prop","name":"boundary"}],"definition":"type ElementOrComponentRefOrSelector = ElementOrComponentRef | string;"},
422
+ {"name":"EmptyStringControlRegistry","usage":"advanced","component":null,"usedBy":[],"definition":"interface EmptyStringControlRegistry { }","extensibleVia":"EmptyStringControlRegistry"},
422
423
  {"name":"FieldLayout","usage":"api","component":null,"usedBy":[{"component":"BbCheckbox","surface":"prop","name":"layout"},{"component":"BbCheckboxGroup","surface":"prop","name":"itemLayout"},{"component":"BbCheckboxGroup","surface":"prop","name":"layout"},{"component":"BbColorInput","surface":"prop","name":"layout"},{"component":"BbDatePickerInput","surface":"prop","name":"layout"},{"component":"BbNumberInput","surface":"prop","name":"layout"},{"component":"BbRadio","surface":"prop","name":"layout"},{"component":"BbRadioGroup","surface":"prop","name":"itemLayout"},{"component":"BbRadioGroup","surface":"prop","name":"layout"},{"component":"BbRating","surface":"prop","name":"layout"},{"component":"BbSelect","surface":"prop","name":"layout"},{"component":"BbSlider","surface":"prop","name":"layout"},{"component":"BbSwitch","surface":"prop","name":"layout"},{"component":"BbSwitchGroup","surface":"prop","name":"itemLayout"},{"component":"BbSwitchGroup","surface":"prop","name":"layout"},{"component":"BbTag","surface":"prop","name":"layout"},{"component":"BbTextInput","surface":"prop","name":"layout"},{"component":"BbTextarea","surface":"prop","name":"layout"},{"component":"BbTimePickerInput","surface":"prop","name":"layout"},{"component":"CommonField","surface":"prop","name":"layout"},{"component":"OptionsContainer","surface":"prop","name":"itemLayout"}],"definition":"type FieldLayout = 'auto' | 'horizontal' | 'vertical' | 'label-fill' | 'input-fill' | `${string} ${string}`;"},
423
424
  {"name":"FormFieldProps","usage":"wrapper","component":null,"usedBy":[],"definition":"interface FormFieldProps<T> { validationLabel?: string; rules?: RuleExpression<T>; validationMode?: ValidationMode; formless?: boolean; }"},
424
425
  {"name":"IconType","usage":"advanced","component":null,"usedBy":[],"definition":"type IconType = string;"},
@@ -499,8 +500,8 @@
499
500
  {"name":"BbTabsPanels","group":"Navigation","description":"The panel host of a split BbTabsRoot layout (renders the tab content only).","referenceOnly":false,"hasGuide":false,"contract":"ai/BbTabsPanels.md","source":"ai/source/BbTabsPanels.md","props":[{"name":"pt","type":"PtMap<BbTabsPanelsPtPart, BbTabsPtState> | undefined","required":false,"description":"Passthrough, object form: the same keys as the `pt:*` attributes\nwithout the prefix. See the `pt:<part>` row."},{"name":"pt:panel","type":"PtValue | undefined","required":false},{"name":"pt:panel:active","type":"PtValue | undefined","required":false},{"name":"pt:panel:disabled","type":"PtValue | undefined","required":false},{"name":"pt:root","type":"PtValue | undefined","required":false},{"name":"pt:root:active","type":"PtValue | undefined","required":false},{"name":"pt:root:disabled","type":"PtValue | undefined","required":false}],"events":[],"slots":[{"name":"<key>","type":"BbTabsSlotProps<K>","description":"One tab's content panel, by the tab `key` through `slotKey`; no fallback (an empty panel).","dynamic":true}],"exposed":[],"models":[],"cssProps":[{"name":"--gap","value":"8px","selector":".bb-tabs"},{"name":"--list-bg","value":"color-mix(in oklab, var(--bb-text) 8%, transparent)","selector":".bb-tabs-list","description":"The strip behind the triggers"},{"name":"--list-border","value":"transparent","selector":".bb-tabs-list","description":"The strip's edge line: a baseline under the triggers (beside them when vertical), --bb-border-w thick, painted inside the strip. `pill` draws none; `line` sets it to --bb-border"},{"name":"--p","value":"3px","selector":".bb-tabs-list","description":"strip inner padding — the gutter the indicator sits in, and the scroll inset"},{"name":"--list-r","value":"var(--bb-radius)","selector":".bb-tabs-list","description":"strip corners"},{"name":"--list-h","value":"var(--bb-control-h)","selector":".bb-tabs-list","description":"strip min height"},{"name":"--fs","value":"var(--bb-fs)","selector":".bb-tabs-list","description":"trigger label size"},{"name":"--trigger-gap","value":"0px","selector":".bb-tabs-list","description":"space between triggers"},{"name":"--trigger-px","value":"10px","selector":".bb-tabs-list","description":"trigger side padding"},{"name":"--trigger-r","value":"calc(var(--list-r) - var(--p))","selector":".bb-tabs-list","description":"Trigger corners, concentric inside --list-r"},{"name":"--trigger-min-h","value":"calc(var(--list-h) - var(--p) * 2)","selector":".bb-tabs-list","description":"Trigger height inside the padded strip"},{"name":"--list-fg","value":"var(--bb-text-muted)","selector":".bb-tabs-list","description":"inactive trigger label"},{"name":"--hover-fg","value":"var(--bb-text)","selector":".bb-tabs-list","description":"hovered trigger label"},{"name":"--active-fg","value":"var(--bb-text)","selector":".bb-tabs-list","description":"active trigger label"},{"name":"--active-fw","value":"500","selector":".bb-tabs-list","description":"active trigger label weight (inactive labels are 500)"},{"name":"--indicator-bg","value":"var(--bb-panel)","selector":".bb-tabs-list","description":"the indicator's fill"},{"name":"--indicator-border","value":"color-mix(in oklab, var(--bb-text) 8%, transparent)","selector":".bb-tabs-list","description":"The indicator's edge"},{"name":"--indicator-r","value":"var(--trigger-r)","selector":".bb-tabs-list","description":"The indicator's corners — the pill's, concentric inside --list-r"},{"name":"--indicator-h","value":"initial","selector":".bb-tabs-list","description":"The indicator's thickness: its height, its width on a vertical strip. `initial` fills the whole trigger box — the pill; a bar is `2px`, on the trigger's bottom edge (side edge when vertical)"},{"name":"--indicator-inset","value":"0px","selector":".bb-tabs-list","description":"Inset of the indicator from the trigger box — shrinks the pill; a bar keeps its thickness, shortens by it at both ends and floats it above the edge"},{"name":"--elev","value":"var(--bb-elev)","selector":".bb-tabs-list","description":"The theme's resting lift, composed UNDER the indicator's own shadow. Two names because they are two decisions: `--elev` is what the language lifts every plate by, `--indicator-shadow` is this component's own."},{"name":"--indicator-shadow","value":"var(--bb-shadow-sm)","selector":".bb-tabs-list","description":"Indicator lift, painted on top of --elev — the theme's selected-segment lift, so it holds in dark (a literal black 6% vanished there)."},{"name":"--transition-duration","value":"var(--bb-transition-slow)","selector":".bb-tabs-panels"},{"name":"--gap","value":"30px","selector":".bb-tabs-panels"},{"name":"--max-w","value":"initial","selector":".bb-tabs-panels","description":"The strip-width knob must not percolate into panel content: nested tabs rendered inside a panel start with a clean slate"}],"pt":{"parts":[{"name":"root","description":"The element around the panels (`BbTabs`'s `panels`)."},{"name":"panel","description":"One tab panel — a broadcast; `panel:active` is the panel on show. Takes no function."}],"states":[{"name":"disabled","description":"On every part while the whole tabs is `disabled`; per node on `item`: a tab that is disabled."},{"name":"active","description":"Per node, on `item` and `panel`: the selected tab's trigger and its shown panel."}]},"css":{"classes":{"bb-tabs-panels":[""]},"locals":["--active-fg","--active-fw","--color-gray-200","--elev","--eq","--fs","--gap","--height","--hover-fg","--indicator-bg","--indicator-border","--indicator-h","--indicator-inset","--indicator-r","--indicator-shadow","--left","--list-bg","--list-border","--list-fg","--list-h","--list-r","--max-w","--p","--top","--transition-duration","--trigger-gap","--trigger-min-h","--trigger-px","--trigger-r","--width"]},"attrTargets":["div"]},
500
501
  {"name":"BbTabsRoot","group":"Navigation","description":"Provide/inject root that lets BbTabsList and BbTabsPanels live in separate layout slots.","referenceOnly":false,"hasGuide":false,"contract":"ai/BbTabsRoot.md","source":"ai/source/BbTabsRoot.md","props":[{"name":"block","type":"boolean | undefined","required":false,"default":"false","description":"Displays the component as full width."},{"name":"compact","type":"boolean | undefined","required":false,"default":"false","description":"Adds a CSS class that applies a compact style to the component."},{"name":"direction","type":"\"horizontal\" | \"vertical\" | undefined","required":false,"default":"\"horizontal\"","description":"Direction of the tabs component."},{"name":"disableAnimateX","type":"boolean | undefined","required":false,"default":"false","description":"Disables the horizontal slide transition between tab panels\n(enabled by default)."},{"name":"disableAnimateY","type":"boolean | undefined","required":false,"default":"false","description":"Disables the smooth height animation when switching between tab\npanels (enabled by default)."},{"name":"disabled","type":"boolean | undefined","required":false,"default":"false","description":"Disables the component"},{"name":"eager","type":"boolean | undefined","required":false,"default":"false","description":"Prevents rendering content before it's made visible."},{"name":"headers","type":"Record<string, string> | undefined","required":false,"description":"Additional HTTP headers forwarded to Inertia when navigation is triggered.\nOnly meaningful in an Inertia context."},{"name":"id","type":"string | undefined","required":false,"description":"The root's `id`, and the key `useBbTabsContext(id)` pairs by. Generated\nwhen omitted."},{"name":"items","type":"BbTabsItem<K>[]","required":true,"description":"Array of items that define the tabs in the component."},{"name":"modelValue","type":"K | null | undefined","required":false,"description":"The current tab key. Used by v-model."},{"name":"navigation","type":"boolean | undefined","required":false,"default":"false","description":"Synchronizes the current tab with the URL query parameter.\n\nPair it with `replace` unless a tab is genuinely a separate destination —\nsee the `replace` prop."},{"name":"onBefore","type":"(() => boolean | void) | undefined","required":false,"description":"Inertia lifecycle hook — fired just before the request is sent.\nReturn `false` to cancel the visit."},{"name":"onCancel","type":"(() => void) | undefined","required":false,"description":"Inertia lifecycle hook — fired when the request is cancelled."},{"name":"onError","type":"((errors: Record<string, string>) => void) | undefined","required":false,"description":"Inertia lifecycle hook — fired when the server returns validation errors."},{"name":"onFinish","type":"(() => void) | undefined","required":false,"description":"Inertia lifecycle hook — fired after the visit finishes (success or error)."},{"name":"only","type":"string[] | undefined","required":false,"description":"Limits which server-side props are refreshed during a partial Inertia reload.\nOnly meaningful in an Inertia context."},{"name":"onProgress","type":"((progress: { percentage: number | undefined; }) => void) | undefined","required":false,"description":"Inertia lifecycle hook — fired when upload/download progress is available."},{"name":"onStart","type":"(() => void) | undefined","required":false,"description":"Inertia lifecycle hook — fired when the request starts."},{"name":"onSuccess","type":"(() => void) | undefined","required":false,"description":"Inertia lifecycle hook — fired when the visit completes successfully."},{"name":"preserveScroll","type":"boolean | ((props: Record<string, unknown>) => boolean) | undefined","required":false,"description":"Controls whether Inertia preserves the scroll position after navigation.\nOnly meaningful in an Inertia context."},{"name":"preserveState","type":"boolean | ((props: Record<string, unknown>) => boolean) | null | undefined","required":false,"description":"Controls whether Inertia preserves the current component state after navigation.\nOnly meaningful in an Inertia context."},{"name":"queryKey","type":"string | undefined","required":false,"default":"\"tab\"","description":"Defines the query key used for URL-based navigation."},{"name":"replace","type":"boolean | undefined","required":false,"default":"false","description":"Replaces history rather than pushing it when changing tab.\n\nRecommended default whenever `navigation` is on: the query keeps the\nactive tab (deep-linkable, survives reload) while Back still returns to\nthe page the user came from, instead of undoing one tab click at a time.\nLeave it off only when a tab is a destination of its own — typically a\n`server` visit whose content the user should be able to go Back to."},{"name":"server","type":"boolean | undefined","required":false,"default":"false","description":"When true and in an Inertia context, triggers a real server-side Inertia\nvisit instead of a client-only `history.pushState`."},{"name":"variant","type":"keyof TabsVariantRegistry | undefined","required":false,"default":"\"pill\"","values":["none","pill","line"],"description":"Look of the tab strip. `pill` is the segmented strip — a muted rounded\nbar with a raised pill sliding under the active trigger; `line` puts\nthe triggers on a thin baseline with a sliding underline (on the side\nedge when `direction=\"vertical\"`); `none` keeps behaviour and structure\nwith no chrome, for fully custom designs through `pt` and classes.\n\nEvery look is a preset of the strip's tokens (`--list-bg`,\n`--indicator-bg`, `--indicator-h`, `--active-fg`, …). Register more via\nthe vite plugin `tabsVariants` option and style\n`.bb-tabs-list--<variant>` with the same tokens. The class lands on the\nstrip (`BbTabsList`), which can also take its own `variant` on the split\nlayout."}],"events":[{"name":"update:modelValue","signature":"(value: K): void","description":"Emitted when the selected tab changes. Used by `v-model`."}],"slots":[{"name":"default","type":"BbTabsRootSlotProps<K>","fields":["current: K | null","currentIndex: number","isFirst: boolean","isLast: boolean","goTo: (target: \"first\" | \"previous\" | \"next\" | \"last\") => void","select: (key: K) => void"],"description":"Arbitrary layout hosting `BbTabsList` / `BbTabsPanels` anywhere in its subtree."}],"exposed":[],"models":[{"name":"modelValue","type":"K | null | undefined"}],"removed":[{"name":"animateX","new":"disableAnimateX","since":"3.0.0-beta.15","migration":"ai/guides/migration/components/bb-tabs.md","silent":true,"fix":{"kind":"invert"}},{"name":"animateY","new":"disableAnimateY","since":"3.0.0-beta.15","migration":"ai/guides/migration/components/bb-tabs.md","silent":true,"fix":{"kind":"invert"}},{"name":"querykey","new":"queryKey","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-tabs.md","silent":true,"fix":{"kind":"rename"}},{"name":"pt","new":null,"hint":"BbTabsRoot renders no element and takes no `pt`: put `item` on `<BbTabsList>` and `panel` on `<BbTabsPanels>`","since":"3.0.0-beta.36","migration":"ai/guides/migration/v3-beta-css-classes.md","silent":true,"fix":{"kind":"manual"}},{"name":"pt:item","new":null,"surface":"pt","hint":"move it to `<BbTabsList pt:item>`","since":"3.0.0-beta.36","migration":"ai/guides/migration/v3-beta-css-classes.md","silent":true,"fix":{"kind":"manual"}},{"name":"pt:panel","new":null,"surface":"pt","hint":"move it to `<BbTabsPanels pt:panel>`","since":"3.0.0-beta.36","migration":"ai/guides/migration/v3-beta-css-classes.md","silent":true,"fix":{"kind":"manual"}},{"name":"pt:root","new":null,"surface":"pt","hint":"BbTabsRoot renders no element; style `<BbTabsList>` or `<BbTabsPanels>` instead","since":"3.0.0-beta.36","migration":"ai/guides/migration/v3-beta-css-classes.md","silent":true,"fix":{"kind":"manual"}}],"renamed":[{"from":"animateX","to":"disableAnimateX","since":"3.0.0-beta.15","migration":"ai/guides/migration/components/bb-tabs.md","fix":{"kind":"invert"}},{"from":"animateY","to":"disableAnimateY","since":"3.0.0-beta.15","migration":"ai/guides/migration/components/bb-tabs.md","fix":{"kind":"invert"}},{"from":"querykey","to":"queryKey","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-tabs.md","fix":{"kind":"rename"}}]},
501
502
  {"name":"BbTag","group":"Inputs","description":"Captures and displays tag-like token values.","referenceOnly":false,"hasGuide":true,"contract":"ai/BbTag.md","source":"ai/source/BbTag.md","props":[{"name":"append:icon","type":"string | undefined","required":false,"description":"Name of the icon to be added at the end of the input."},{"name":"autocomplete","type":"string | undefined","required":false,"default":"\"off\"","description":"Guides to the browser as to the type of information expected in the field."},{"name":"autofocus","type":"Booleanish | undefined","required":false,"description":"Sets autofocus on page load."},{"name":"caseSensitive","type":"boolean | undefined","required":false,"default":"false","description":"Compare tags case-sensitively when rejecting duplicates, so `Vue` and\n`vue` can both exist. By default matching folds case, because two chips\ndiffering only in case read as duplicates to a user.\n\nEither way the tag is stored with the casing the user typed — this only\ndecides what counts as a duplicate. Entries are always trimmed first."},{"name":"clearable","type":"boolean | undefined","required":false,"default":"false","description":"Displays a clear button when the input has a value and is being interacted with."},{"name":"comma","type":"boolean | undefined","required":false,"default":"false","description":"Sets the display model for selected values to a list of comma separated string.\nIn this mode the user cannot deselect an option by pressing the close button."},{"name":"compact","type":"boolean | undefined","required":false,"default":"false","description":"Compact density. Swaps `--bb-input-h`, `--bb-input-py` and\n`--bb-label-spacing-y` for their `-compact` twins on the field, so a\n`--bb-input-h` you set on the component is ignored while `compact` is on:\nsize a compact field with `--bb-input-h-compact` (and\n`--bb-input-py-compact`) instead."},{"name":"description","type":"string | undefined","required":false,"description":"Descriptive text displayed below the label and above the input. Unlike the hint it is always\nvisible, and it is linked to the input via `aria-describedby` (after any\n`errors` / `warnings`, before the `hint`)."},{"name":"disabled","type":"boolean | undefined","required":false,"default":"false","description":"Disables the component."},{"name":"divider","type":"string | string[] | undefined","required":false,"default":"\"Enter\"","description":"The divider key used to separate values from one another. By default it is \"Enter\".\nAccepts a single key or an array of keys (e.g. `['Enter', ',']`) — any of them\ncommits the current text, split on every single-character divider in the\nset into one tag per trimmed, non-empty piece."},{"name":"errors","type":"string | string[] | undefined","required":false,"description":"Can be a string or an array of string containing the messages to display.\nThey render in an `aria-live=\"polite\"` region (announced when they appear)\nand, while the list is non-empty, are referenced FIRST from the control's\n`aria-describedby`, so the reason the field is invalid is re-read whenever\nthe control regains focus."},{"name":"formless","type":"boolean | undefined","required":false,"default":"false","description":"Keep this control out of the enclosing `BbForm` entirely: not submitted,\nnot dirty, not reset, not validated. For a control that is not form data\n(a filter, a \"show advanced\" switch)."},{"name":"hasErrors","type":"boolean | undefined","required":false,"default":"false","description":"Define if the component should be in an error state.\nIt usually attaches a CSS class for styling purposes."},{"name":"hasWarnings","type":"boolean | undefined","required":false,"default":"false","description":"Define if the component should be in a warning state.\nSame chrome as errors with `--bb-warn`; errors take priority."},{"name":"hideLabel","type":"boolean | undefined","required":false,"default":"false","description":"Visually hides the label of the input while maintaining accessibility."},{"name":"hint","type":"string | undefined","required":false,"description":"Text box to be displayed near the input, usually to indicate instructions."},{"name":"id","type":"string | undefined","required":false,"description":"The `id` of the native control; the label's `for` and the description\nand message ids derive from it. Generated when omitted."},{"name":"inputAlign","type":"FieldCrossAlign | undefined","required":false,"values":["top","center","bottom"],"description":"Vertical position of the control in a side-by-side row; not\n`inputPosition`, the horizontal one. Omitted, the control's first line\nmeets the label's."},{"name":"label","type":"string","required":true,"description":"Text content of the label of the element."},{"name":"labelAlign","type":"FieldCrossAlign | undefined","required":false,"values":["top","center","bottom"],"description":"Vertical position of the label block in a side-by-side row; not\n`labelPosition`, the horizontal one. Omitted, the label's first line\nmeets the control's."},{"name":"labelMode","type":"\"outside\" | \"floating\" | \"inside\" | undefined","required":false,"description":"Where the label sits relative to the field: `outside` above it, `inside`\nwithin the control, or `floating` (starts inside, lifts on focus/value).\nDefaults to `config.defaultInputLabelMode`, like the other inputs."},{"name":"labelPosition","type":"\"left\" | \"center\" | \"right\" | undefined","required":false,"description":"Sets the text alignment of the label."},{"name":"layout","type":"FieldLayout | undefined","required":false,"description":"How the label and the input sit together: `'vertical'`, `'horizontal'` (50/50),\n`'auto'`, `'label-fill'` (the label takes the free space, the input keeps\nits size), `'input-fill'` (the other way round), or a two-word ratio\npattern like `'xx xxxxx'`."},{"name":"loading","type":"boolean | undefined","required":false,"default":"false","description":"Sets the component in a loading state, usually triggering some visual styles."},{"name":"max","type":"number | undefined","required":false,"description":"Maximum number of selected items."},{"name":"modelValue","type":"string[] | undefined","required":false,"description":"Used by v-model. Contains all selected tags."},{"name":"name","type":"string | undefined","required":false,"description":"Defines the name of the input."},{"name":"persistentHint","type":"boolean | undefined","required":false,"default":"false","description":"Keeps the hint displayed."},{"name":"placeholder","type":"string | undefined","required":false,"description":"String displayed when there's no data."},{"name":"prepend:icon","type":"string | undefined","required":false,"description":"Name of the icon to be added at the start of the input."},{"name":"pt","type":"(PtMap<TextControlPtPart, FormControlPtState> & { \"badge:loading\"?: PtValue | undefined; \"badge:disabled\"?: PtValue | undefined; \"badge:errors\"?: PtValue | undefined; \"badge:warnings\"?: PtValue | undefined; \"badge:readonly\"?: PtValue | undefined; \"badge:hasValue\"?: PtValue | undefined; \"comma:loading\"?: PtValue | undefined; \"comma:disabled\"?: PtValue | undefined; \"comma:errors\"?: PtValue | undefined; \"comma:warnings\"?: PtValue | undefined; \"comma:readonly\"?: PtValue | undefined; \"comma:hasValue\"?: PtValue | undefined; \"badge:highlighted\"?: PtValue | undefined; \"comma:highlighted\"?: PtValue | undefined; } & { badge?: PtValue | PtItemFn<string, BbTagPtState> | undefined; comma?: PtValue | PtItemFn<string, BbTagPtState> | undefined; }) | undefined","required":false,"description":"Passthrough, object form: the same keys as the `pt:*` attributes\nwithout the prefix. See the `pt:<part>` row."},{"name":"pt:badge","type":"PtValue | ((ctx: PtItemCtx<string, BbTagPtState>) => PtItemResult) | undefined","required":false},{"name":"pt:badge:disabled","type":"PtValue | undefined","required":false},{"name":"pt:badge:errors","type":"PtValue | undefined","required":false},{"name":"pt:badge:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:badge:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:badge:loading","type":"PtValue | undefined","required":false},{"name":"pt:badge:readonly","type":"PtValue | undefined","required":false},{"name":"pt:badge:warnings","type":"PtValue | undefined","required":false},{"name":"pt:box","type":"PtValue | undefined","required":false},{"name":"pt:box:disabled","type":"PtValue | undefined","required":false},{"name":"pt:box:errors","type":"PtValue | undefined","required":false},{"name":"pt:box:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:box:loading","type":"PtValue | undefined","required":false},{"name":"pt:box:readonly","type":"PtValue | undefined","required":false},{"name":"pt:box:warnings","type":"PtValue | undefined","required":false},{"name":"pt:clear","type":"PtValue | undefined","required":false},{"name":"pt:clear:disabled","type":"PtValue | undefined","required":false},{"name":"pt:clear:errors","type":"PtValue | undefined","required":false},{"name":"pt:clear:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:clear:loading","type":"PtValue | undefined","required":false},{"name":"pt:clear:readonly","type":"PtValue | undefined","required":false},{"name":"pt:clear:warnings","type":"PtValue | undefined","required":false},{"name":"pt:comma","type":"PtValue | ((ctx: PtItemCtx<string, BbTagPtState>) => PtItemResult) | undefined","required":false},{"name":"pt:comma:disabled","type":"PtValue | undefined","required":false},{"name":"pt:comma:errors","type":"PtValue | undefined","required":false},{"name":"pt:comma:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:comma:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:comma:loading","type":"PtValue | undefined","required":false},{"name":"pt:comma:readonly","type":"PtValue | undefined","required":false},{"name":"pt:comma:warnings","type":"PtValue | undefined","required":false},{"name":"pt:description","type":"PtValue | undefined","required":false},{"name":"pt:description:disabled","type":"PtValue | undefined","required":false},{"name":"pt:description:errors","type":"PtValue | undefined","required":false},{"name":"pt:description:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:description:loading","type":"PtValue | undefined","required":false},{"name":"pt:description:readonly","type":"PtValue | undefined","required":false},{"name":"pt:description:warnings","type":"PtValue | undefined","required":false},{"name":"pt:hint","type":"PtValue | undefined","required":false},{"name":"pt:hint:disabled","type":"PtValue | undefined","required":false},{"name":"pt:hint:errors","type":"PtValue | undefined","required":false},{"name":"pt:hint:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:hint:loading","type":"PtValue | undefined","required":false},{"name":"pt:hint:readonly","type":"PtValue | undefined","required":false},{"name":"pt:hint:warnings","type":"PtValue | undefined","required":false},{"name":"pt:icon","type":"PtValue | undefined","required":false},{"name":"pt:icon:disabled","type":"PtValue | undefined","required":false},{"name":"pt:icon:errors","type":"PtValue | undefined","required":false},{"name":"pt:icon:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:icon:loading","type":"PtValue | undefined","required":false},{"name":"pt:icon:readonly","type":"PtValue | undefined","required":false},{"name":"pt:icon:warnings","type":"PtValue | undefined","required":false},{"name":"pt:input","type":"PtValue | undefined","required":false},{"name":"pt:input:disabled","type":"PtValue | undefined","required":false},{"name":"pt:input:errors","type":"PtValue | undefined","required":false},{"name":"pt:input:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:input:loading","type":"PtValue | undefined","required":false},{"name":"pt:input:readonly","type":"PtValue | undefined","required":false},{"name":"pt:input:warnings","type":"PtValue | undefined","required":false},{"name":"pt:label","type":"PtValue | undefined","required":false},{"name":"pt:label:disabled","type":"PtValue | undefined","required":false},{"name":"pt:label:errors","type":"PtValue | undefined","required":false},{"name":"pt:label:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:label:loading","type":"PtValue | undefined","required":false},{"name":"pt:label:readonly","type":"PtValue | undefined","required":false},{"name":"pt:label:warnings","type":"PtValue | undefined","required":false},{"name":"pt:message","type":"PtValue | undefined","required":false},{"name":"pt:message:disabled","type":"PtValue | undefined","required":false},{"name":"pt:message:errors","type":"PtValue | undefined","required":false},{"name":"pt:message:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:message:loading","type":"PtValue | undefined","required":false},{"name":"pt:message:readonly","type":"PtValue | undefined","required":false},{"name":"pt:message:warnings","type":"PtValue | undefined","required":false},{"name":"pt:prefix","type":"PtValue | undefined","required":false},{"name":"pt:prefix:disabled","type":"PtValue | undefined","required":false},{"name":"pt:prefix:errors","type":"PtValue | undefined","required":false},{"name":"pt:prefix:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:prefix:loading","type":"PtValue | undefined","required":false},{"name":"pt:prefix:readonly","type":"PtValue | undefined","required":false},{"name":"pt:prefix:warnings","type":"PtValue | undefined","required":false},{"name":"pt:root","type":"PtValue | undefined","required":false},{"name":"pt:root:disabled","type":"PtValue | undefined","required":false},{"name":"pt:root:errors","type":"PtValue | undefined","required":false},{"name":"pt:root:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:root:loading","type":"PtValue | undefined","required":false},{"name":"pt:root:readonly","type":"PtValue | undefined","required":false},{"name":"pt:root:warnings","type":"PtValue | undefined","required":false},{"name":"pt:spinner","type":"PtValue | undefined","required":false},{"name":"pt:spinner:disabled","type":"PtValue | undefined","required":false},{"name":"pt:spinner:errors","type":"PtValue | undefined","required":false},{"name":"pt:spinner:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:spinner:loading","type":"PtValue | undefined","required":false},{"name":"pt:spinner:readonly","type":"PtValue | undefined","required":false},{"name":"pt:spinner:warnings","type":"PtValue | undefined","required":false},{"name":"pt:suffix","type":"PtValue | undefined","required":false},{"name":"pt:suffix:disabled","type":"PtValue | undefined","required":false},{"name":"pt:suffix:errors","type":"PtValue | undefined","required":false},{"name":"pt:suffix:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:suffix:loading","type":"PtValue | undefined","required":false},{"name":"pt:suffix:readonly","type":"PtValue | undefined","required":false},{"name":"pt:suffix:warnings","type":"PtValue | undefined","required":false},{"name":"readonly","type":"boolean | undefined","required":false,"default":"false","description":"Sets the input in a readonly state."},{"name":"required","type":"boolean | undefined","required":false,"default":"false","description":"Sets the input as required."},{"name":"reverse","type":"boolean | undefined","required":false,"default":"false","description":"Reverses the layout. Applicable in every direction the order of the label and\nthe input is swapped."},{"name":"rules","type":"RuleExpression<string[]>","required":false,"description":"vee-validate rules for this field. Only inside a `BbForm`."},{"name":"validationLabel","type":"string | undefined","required":false,"description":"The field's name in validation messages (`{field}`): \"Email is not\nvalid\". Defaults to the `label` (or `legend`), then \"This field\"; the\nfield's `name` never shows. Set it when the label is not a good noun for\na sentence (an icon-only label, a question) or is hidden. Only inside a\n`BbForm`."},{"name":"validationMode","type":"ValidationMode | undefined","required":false,"values":["aggressive","balanced","lazy","submit-only","submit-live"],"description":"When this field checks itself while the user works: `aggressive` (every\nchange), `balanced` (on leave, then every change while it shows an\nerror), `lazy` (on leave only), `submit-only` (on submit only) or\n`submit-live` (on submit, then every change while it shows an error).\n\"Leave\" is blur for a text-like control, and focus leaving the whole\ncontrol for a picker or a group; a checkbox or switch commits on click.\nUnset, the enclosing `BbForm`'s `validation-mode` applies, then the app's\n`formControls.validationMode` (`'balanced'`). Only inside a `BbForm`."},{"name":"variant","type":"InputVariantType | undefined","required":false,"default":"'outline'","values":["outline","secondary","none","ghost"],"description":"Visual variant of the field box — the same names and tokens as the\n`BbButton` variants. Colours only: height, padding and border width are\nidentical across variants, so a form never reflows when one changes.\n`'ghost'` has no border in any state (errors and warnings show through\nthe icon and the messages); every variant keeps the focus ring.\nRegister extra names with the plugin's `inputVariants` option.\n\n`'none'` is a blank starting point: the field keeps its structure and\nbehaviour but takes no look, so your own classes don't fight a built-in\none. You then own hover, focus, disabled and the error / warning states.\nFine for a one-off; keep inline styling short, and register a real\nvariant (`inputVariants`) when the look recurs."},{"name":"warnings","type":"string | string[] | undefined","required":false,"description":"Warning messages to display beneath the field, in their own `aria-live`\nregion and amber (`--bb-text-warn`). A string or array; a non-empty list\nimplies the warning state. Errors suppress warnings when both are set.\nWhile displayed they are also referenced from the control's\n`aria-describedby`, after any errors and before the description/hint."}],"events":[{"name":"active","signature":"(): void","description":"Emitted when the tag input becomes active (focus/click enters it)."},{"name":"blur","signature":"(event: FocusEvent): void","description":"Emitted when the native input loses focus. Forwards the original DOM `FocusEvent`."},{"name":"change","signature":"(event: Event): void","description":"Emitted when the native input fires a change event. Forwards the original DOM `Event`."},{"name":"click","signature":"(event: MouseEvent): void","description":"Emitted when the input receives a click interaction. Forwards the original DOM `MouseEvent`."},{"name":"compositionend","signature":"(event: CompositionEvent): void","description":"An IME composition ended. Forwards the DOM `CompositionEvent`."},{"name":"compositionstart","signature":"(event: CompositionEvent): void","description":"An IME composition started. Forwards the DOM `CompositionEvent`."},{"name":"duplicate","signature":"(string: string): void","description":"Emitted when an attempt is made to add a tag that already exists."},{"name":"focus","signature":"(event: FocusEvent): void","description":"Emitted when the native input gains focus. Forwards the original DOM `FocusEvent`."},{"name":"inactive","signature":"(): void","description":"Emitted when focus/click moves outside the tag input after it was active."},{"name":"input","signature":"(event: Event): void","description":"Emitted on native input events. Forwards the original DOM `Event`."},{"name":"keydown","signature":"(event: KeyboardEvent): void","description":"Emitted for keyboard interaction. Forwards the original DOM `KeyboardEvent`."},{"name":"keyup","signature":"(event: KeyboardEvent): void","description":"Emitted when a key is released. Forwards the original DOM `KeyboardEvent`."},{"name":"max","signature":"(string: string): void","description":"Emitted when an attempt is made to add a tag while the `max` limit is already reached."},{"name":"mousedown","signature":"(event: MouseEvent): void","description":"A pointer button was pressed on the text field. Forwards the DOM `MouseEvent`."},{"name":"mouseup","signature":"(event: MouseEvent): void","description":"A pointer button was released on the text field. Forwards the DOM `MouseEvent`."},{"name":"paste","signature":"(event: ClipboardEvent): void","description":"Native clipboard paste. Forwards the DOM `ClipboardEvent`."},{"name":"update:modelValue","signature":"(value: string[]): void","description":"Emitted when the tag array changes."}],"slots":[{"name":"append","type":"Record<string, never>","description":"Content appended inside the input field wrapper, after the tag chips."},{"name":"append:outer","type":"Record<string, never>","description":"Content appended outside the input field wrapper."},{"name":"description","type":"BbTagDescriptionSlotProps","fields":["text: string","hasErrors: boolean","hasWarnings: boolean"],"description":"Replaces the description text. Provided alone (no `description` prop) it still\nrenders the description region and wires it into `aria-describedby`."},{"name":"label","type":"BbTagLabelSlotProps","fields":["text: string","hasErrors: boolean","hasWarnings: boolean"],"description":"Replaces the default label text rendered above the input."},{"name":"prefix","type":"Record<string, never>","description":"Content rendered as an inline prefix inside the input field."},{"name":"prepend","type":"Record<string, never>","description":"Content prepended inside the input field wrapper, before the tag chips."},{"name":"prepend:outer","type":"Record<string, never>","description":"Content prepended outside the input field wrapper."},{"name":"suffix","type":"Record<string, never>","description":"Content rendered as an inline suffix inside the input field."}],"exposed":[],"models":[{"name":"modelValue","type":"string[] | undefined"}],"cssProps":[{"name":"--compensation-multiplier","value":"0.3","selector":".bb-tag__field","description":"Fraction of the shell's inner padding the chip row is pulled back by when no prepend icon precedes it (see the negative margin below)."},{"name":"--border-color","value":"per variant","selector":"pt:box","description":"The resting border, at the fixed --bb-border-w. Errors and warnings paint their frame over it, so `pt:box=\"[--border-color:…]\"` recolours the rest without hiding the state; a plain `border-*` utility on the base pt:box would hide it (ESLint `no-box-border-color`)."}],"pt":{"parts":[{"name":"root","description":"The field's outer container: the label, the box and the lines under it."},{"name":"label","description":"The label text above the box (the `label` prop)."},{"name":"description","description":"The muted line under the label (the `description` prop)."},{"name":"message","description":"The errors / warnings line under the box. A node of its own: it can show at the same time as `hint`."},{"name":"hint","description":"The helper line (the `hint` prop), shown on focus, or always with `persistent-hint`."},{"name":"box","description":"The bordered box around the input — border, background and radius; the `variant` paints here."},{"name":"input","description":"The native input a new tag is typed into."},{"name":"icon","description":"The content icons, prepend and append — a broadcast. Chrome (the clear ✕, a chevron, the error / warning glyph) is never in it."},{"name":"spinner","description":"The spinner inside the box while `loading`."},{"name":"prefix","description":"The `#prefix` slot's wrapper, inside the box before the input."},{"name":"suffix","description":"The `#suffix` slot's wrapper, inside the box after the input."},{"name":"clear","description":"The ✕ that empties this control (`clearable`) — one node, never a chip's own ✕."},{"name":"badge","description":"Each tag's `BbBadge` root — a broadcast resolved per tag. The badge's own ✕ is chrome, never `clear`. Not rendered in `comma` mode."},{"name":"comma","description":"Each tag in `comma` mode — a broadcast resolved per tag. Not rendered in chips mode."}],"states":[{"name":"hasValue","description":"Component-wide: the control holds a value, by its own rule (`0` counts on `BbNumberInput`, `''` on `BbColorInput`)."},{"name":"readonly","description":"Component-wide: the control is `readonly` — shown, focusable, not editable."},{"name":"disabled","description":"Component-wide: the control is `disabled`."},{"name":"warnings","description":"Component-wide: the control is in its warning state (`warnings` / `has-warnings`) and not in an error state — errors win, so the two are never on together."},{"name":"errors","description":"Component-wide: the control is in its error state (`errors` / `has-errors`, or its validation) — the message line and the box turn red."},{"name":"highlighted","description":"Per node, on `badge` / `comma`: the tag the arrow keys are on (`bb-badge--highlighted` / `bb-tag__comma--highlighted`). A cursor, not focus: focus stays in the text input."},{"name":"loading","description":"Component-wide: `loading` is on; the box shows its `spinner`."}]},"tree":{"bindings":[{"part":"controlAttrs","target":"input.bb-tag__input"},{"part":"input","target":"input.bb-tag__input"}],"nodes":[{"name":"CommonField","kind":"internal","vocabulary":"BbTag","bindings":[{"part":"root","target":"div.bb-field"},{"part":"label","target":"component"},{"part":"description","target":"span.bb-field__description"},{"part":"hint","target":"span.bb-field__hint"},{"part":"counter","target":"span.bb-field__counter"},{"part":"message","target":"div.bb-field__message"}],"cssProps":[{"name":"--ctrl-line","documented":true,"readBy":["bb-field__label","bb-field__input-wrapper"]}],"children":[{"name":"BbAsterisk","kind":"public"}]},{"name":"CommonFieldInput","kind":"internal","vocabulary":"BbTag","bindings":[{"part":"box","target":"span.bb-field-input__box"},{"part":"prefix","target":"span.bb-field-input__prefix"},{"part":"icon","target":"BbIcon"},{"part":"clear","target":"ClearableButton"},{"part":"spinner","target":"BbSpinner"},{"part":"suffix","target":"span.bb-field-input__suffix"}],"cssProps":[{"name":"--bg","documented":true,"readBy":["bb-field-input","bb-field-input__box"]},{"name":"--bg-hover","documented":true,"readBy":["bb-field-input__box"]},{"name":"--bg-focus","documented":true,"readBy":["bb-field-input__box"]},{"name":"--bg-disabled","documented":true,"readBy":["bb-field-input__box"]},{"name":"--fg-disabled","documented":true,"readBy":["bb-field-input__box","bb-field-input__prefix","bb-field-input__suffix","bb-field-input__prepend-icon","bb-field-input__append-icon"]},{"name":"--border-color","documented":true,"readBy":["bb-field-input","bb-field-input__box"]},{"name":"--border-focus","documented":true,"readBy":["bb-field-input__box"]},{"name":"--ring-size","documented":true,"readBy":["bb-field-input__box"]},{"name":"--ring-color","documented":true,"readBy":["bb-field-input__box"]},{"name":"--elev","documented":true,"readBy":["bb-field-input__box"]},{"name":"--frost","documented":true,"readBy":["bb-field-input__box"]},{"name":"--inside-label-clearance","documented":true,"readBy":["bb-field-input__box","bb-field-input__prefix","bb-field-input__suffix"]}],"children":[{"name":"ErrorIcon","kind":"internal","cssProps":[{"name":"--accent","documented":false,"readBy":["bb-error-icon"]}],"children":[{"name":"BbIcon","kind":"public","cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]}]},{"name":"WarningIcon","kind":"internal","cssProps":[{"name":"--accent","documented":false,"readBy":["bb-warning-icon"]}],"children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]}]},{"name":"ClearableButton","kind":"internal","children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]}]},{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]},{"name":"BbSpinner","kind":"public","children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]}]}]},{"name":"BbSmoothHeight","kind":"public"},{"name":"ChipsBox","kind":"internal","vocabulary":"BbTag","bindings":[{"part":"badge","target":"BbBadge"}],"children":[{"name":"BbBadge","kind":"public","vocabulary":"BbBadge","bindings":[{"part":"spinner","target":"BbSpinner"},{"part":"icon","target":"BbIcon"},{"part":"clear","target":"button.bb-badge__clear"}],"cssProps":[{"name":"--bg","documented":true,"readBy":["bb-badge"]},{"name":"--fg","documented":true,"readBy":["bb-badge","bb-badge__clear"]},{"name":"--bw","documented":true,"readBy":["bb-badge"]},{"name":"--border-color","documented":false,"readBy":["bb-badge"]},{"name":"--ring-color","documented":true,"readBy":["bb-badge","bb-badge__clear","bb-badge__body","bb-badge--highlighted"]},{"name":"--ring-size","documented":true,"readBy":["bb-badge","bb-badge__clear","bb-badge__body","bb-badge--highlighted"]},{"name":"--min-size-md","documented":true,"readBy":["bb-badge"]},{"name":"--min-size","documented":true,"readBy":["bb-badge"]},{"name":"--elev","documented":true,"readBy":["bb-badge","bb-badge__clear","bb-badge__body","bb-badge--highlighted"]},{"name":"--r","documented":true,"readBy":["bb-badge","bb-badge__body","bb-badge__trailing","bb-badge__clear"]},{"name":"--fs","documented":true,"readBy":["bb-badge"]},{"name":"--icon-size","documented":true,"readBy":["bb-badge__icon","bb-badge__prepend-icon","bb-badge__append-icon","bb-badge__clear"]},{"name":"--gap","documented":true,"readBy":["bb-badge","bb-badge__body","bb-badge__trailing","bb-badge__clear"]},{"name":"--px","documented":true,"readBy":["bb-badge","bb-badge--icon","bb-badge__prepend-icon","bb-badge__append-icon","bb-badge--clearable"]},{"name":"--clear-size","documented":true,"readBy":["bb-badge__clear","bb-icon"]},{"name":"--bg-disabled","documented":true,"readBy":["bb-badge__body","bb-base-button--disabled","bb-badge--loading"]},{"name":"--fg-disabled","documented":true,"readBy":["bb-badge__body","bb-base-button--disabled","bb-badge--loading"]},{"name":"--border-disabled","documented":true,"readBy":["bb-badge__body","bb-base-button--disabled","bb-badge--loading"]},{"name":"--pad-left","documented":true,"readBy":["bb-badge__body"]},{"name":"--pad-right","documented":false,"readBy":["bb-badge__body","bb-badge__clear"]},{"name":"--size","documented":false}],"children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]},{"name":"BbSpinner","kind":"public","repeated":true},{"name":"BadgeBodyContent","kind":"internal","children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]},{"name":"BbSpinner","kind":"public","repeated":true}]}]}]},{"name":"CommaBox","kind":"internal","vocabulary":"BbTag","bindings":[{"part":"comma","target":"span.bb-tag__comma"}]}]},"css":{"classes":{"bb-tag":["","__badge","__comma","__comma--highlighted","__field","__field--active","__field--compact","__input","__input-container"]},"locals":["--characters","--color-gray-200","--compensation-multiplier"]},"attrTargets":["div","input"],"removed":[{"name":"multiple","new":null,"since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-tag.md","silent":true,"fix":{"kind":"remove"}},{"name":"hasWarning","new":"hasWarnings","since":"3.0.0-beta.26","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"direction","new":"layout","since":"3.0.0-beta.33","migration":"ai/guides/migration/components/bb-tag.md","silent":true,"fix":{"kind":"rename"}},{"name":"pt:item","new":null,"surface":"pt","hint":"each chip is `pt:badge`; in `comma` mode each entry is `pt:comma` (same states)","since":"3.0.0-beta.36","migration":"ai/guides/migration/v3-beta-css-classes.md","silent":true,"fix":{"kind":"manual"}},{"name":"prepend-outer","new":"prepend:outer","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"append-outer","new":"append:outer","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"vid","new":null,"hint":"a display name (v2: `vid=\"Email address\"`) is now `validation-label`; a field path (3.0 betas: `vid=\"address.city\"`) is now `name` (brackets for a native post: `address[city]`). `check --fix` picks by the value","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"byValue","display":"validationLabel","key":"name"}},{"name":"validateOn","new":"validationMode","hint":"an array of events became one mode (`aggressive` | `balanced` | `lazy` | `submit-only` | `submit-live`). The old defaults (`['blur']`, `['inactive']`, a toggle's `['update:modelValue', 'change', 'blur']`) are `balanced`, the new default: delete the prop. A text field on `['update:modelValue']` is `validation-mode=\"aggressive\"`. Set it once on `<BbForm validation-mode>` instead of per field","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"manual"}}],"renamed":[{"from":"hasWarning","to":"hasWarnings","since":"3.0.0-beta.26","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"direction","to":"layout","since":"3.0.0-beta.33","migration":"ai/guides/migration/components/bb-tag.md","fix":{"kind":"rename"}},{"from":"prepend-outer","to":"prepend:outer","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"append-outer","to":"append:outer","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"validateOn","to":"validationMode","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"manual"}}]},
502
- {"name":"BbTextarea","group":"Inputs","description":"Captures multi-line text values.","referenceOnly":false,"hasGuide":true,"contract":"ai/BbTextarea.md","source":"ai/source/BbTextarea.md","props":[{"name":"append:icon","type":"string | undefined","required":false,"description":"Name of the icon to be added at the end of the input."},{"name":"autocomplete","type":"string | undefined","required":false,"description":"Guides to the browser as to the type of information expected in the field."},{"name":"autofocus","type":"Booleanish | undefined","required":false,"description":"Sets autofocus on page load."},{"name":"autoGrow","type":"boolean | undefined","required":false,"default":"false","description":"Expands the textarea to match its content. Empty, it is one BbTextInput\ntall (text on the same line); it never shrinks below that, or below `rows`."},{"name":"clearable","type":"boolean | undefined","required":false,"default":"false","description":"Displays a clear button when the input has a value and is being interacted with."},{"name":"compact","type":"boolean | undefined","required":false,"default":"false","description":"Compact density. Swaps `--bb-input-h`, `--bb-input-py` and\n`--bb-label-spacing-y` for their `-compact` twins on the field, so a\n`--bb-input-h` you set on the component is ignored while `compact` is on:\nsize a compact field with `--bb-input-h-compact` (and\n`--bb-input-py-compact`) instead."},{"name":"counter","type":"boolean | undefined","required":false,"default":"false","description":"Shows a character count at the end of the hint row, visible whether or\nnot the hint is: `42`, or `42 / 140` when the field has the native\n`maxlength` (which also stops input at the limit). From 90 % of the limit\nthe count turns to body text, at the limit to the warning colour, and it\nsteps back to muted while an error shows. Screen readers get a label\n(\"Characters: 42 of 140\") and a polite announcement only when the count\ncrosses 90 % or reaches the limit."},{"name":"description","type":"string | undefined","required":false,"description":"Descriptive text displayed below the label and above the input. Unlike the hint it is always\nvisible, and it is linked to the input via `aria-describedby` (after any\n`errors` / `warnings`, before the `hint`)."},{"name":"disabled","type":"boolean | undefined","required":false,"default":"false","description":"Disables the component."},{"name":"errors","type":"string | string[] | undefined","required":false,"description":"Can be a string or an array of string containing the messages to display.\nThey render in an `aria-live=\"polite\"` region (announced when they appear)\nand, while the list is non-empty, are referenced FIRST from the control's\n`aria-describedby`, so the reason the field is invalid is re-read whenever\nthe control regains focus."},{"name":"formless","type":"boolean | undefined","required":false,"default":"false","description":"Keep this control out of the enclosing `BbForm` entirely: not submitted,\nnot dirty, not reset, not validated. For a control that is not form data\n(a filter, a \"show advanced\" switch)."},{"name":"hasErrors","type":"boolean | undefined","required":false,"default":"false","description":"Define if the component should be in an error state.\nIt usually attaches a CSS class for styling purposes."},{"name":"hasWarnings","type":"boolean | undefined","required":false,"default":"false","description":"Define if the component should be in a warning state.\nSame chrome as errors with `--bb-warn`; errors take priority."},{"name":"hideLabel","type":"boolean | undefined","required":false,"default":"false","description":"Visually hides the label of the input while maintaining accessibility."},{"name":"hint","type":"string | undefined","required":false,"description":"Text box to be displayed near the input, usually to indicate instructions."},{"name":"id","type":"string | undefined","required":false,"description":"The `id` of the native control; the label's `for` and the description\nand message ids derive from it. Generated when omitted."},{"name":"inputAlign","type":"FieldCrossAlign | undefined","required":false,"values":["top","center","bottom"],"description":"Vertical position of the control in a side-by-side row; not\n`inputPosition`, the horizontal one. Omitted, the control's first line\nmeets the label's."},{"name":"label","type":"string","required":true,"description":"Text content of the label of the element."},{"name":"labelAlign","type":"FieldCrossAlign | undefined","required":false,"values":["top","center","bottom"],"description":"Vertical position of the label block in a side-by-side row; not\n`labelPosition`, the horizontal one. Omitted, the label's first line\nmeets the control's."},{"name":"labelMode","type":"\"outside\" | \"floating\" | \"inside\" | undefined","required":false,"description":"Label rendering mode. `'outside'` (default) sits the label above/beside the\nfield; `'floating'`/`'inside'` overlay it, like the other text inputs."},{"name":"labelPosition","type":"\"left\" | \"center\" | \"right\" | undefined","required":false,"description":"Sets the text alignment of the label."},{"name":"layout","type":"FieldLayout | undefined","required":false,"description":"How the label and the input sit together: `'vertical'`, `'horizontal'` (50/50),\n`'auto'`, `'label-fill'` (the label takes the free space, the input keeps\nits size), `'input-fill'` (the other way round), or a two-word ratio\npattern like `'xx xxxxx'`."},{"name":"loading","type":"boolean | undefined","required":false,"default":"false","description":"Sets the component in a loading state, usually triggering some visual styles."},{"name":"modelValue","type":"string | null | undefined","required":false,"description":"Used by v-model."},{"name":"name","type":"string | undefined","required":false,"description":"Defines the name of the input."},{"name":"persistentHint","type":"boolean | undefined","required":false,"default":"false","description":"Keeps the hint displayed."},{"name":"placeholder","type":"string | undefined","required":false,"description":"String displayed when there's no data."},{"name":"prepend:icon","type":"string | undefined","required":false,"description":"Name of the icon to be added at the start of the input."},{"name":"pt","type":"PtMap<BbTextareaPtPart, BbTextareaPtState> | undefined","required":false,"description":"Passthrough, object form: `{ box: '…', 'box:errors': '…' }` — the same\nkeys as the `pt:*` attributes without the prefix. See the `pt:<part>` row."},{"name":"pt:box","type":"PtValue | undefined","required":false},{"name":"pt:box:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:box:disabled","type":"PtValue | undefined","required":false},{"name":"pt:box:errors","type":"PtValue | undefined","required":false},{"name":"pt:box:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:box:loading","type":"PtValue | undefined","required":false},{"name":"pt:box:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:box:readonly","type":"PtValue | undefined","required":false},{"name":"pt:box:warnings","type":"PtValue | undefined","required":false},{"name":"pt:clear","type":"PtValue | undefined","required":false},{"name":"pt:clear:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:clear:disabled","type":"PtValue | undefined","required":false},{"name":"pt:clear:errors","type":"PtValue | undefined","required":false},{"name":"pt:clear:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:clear:loading","type":"PtValue | undefined","required":false},{"name":"pt:clear:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:clear:readonly","type":"PtValue | undefined","required":false},{"name":"pt:clear:warnings","type":"PtValue | undefined","required":false},{"name":"pt:counter","type":"PtValue | undefined","required":false},{"name":"pt:counter:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:counter:disabled","type":"PtValue | undefined","required":false},{"name":"pt:counter:errors","type":"PtValue | undefined","required":false},{"name":"pt:counter:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:counter:loading","type":"PtValue | undefined","required":false},{"name":"pt:counter:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:counter:readonly","type":"PtValue | undefined","required":false},{"name":"pt:counter:warnings","type":"PtValue | undefined","required":false},{"name":"pt:description","type":"PtValue | undefined","required":false},{"name":"pt:description:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:description:disabled","type":"PtValue | undefined","required":false},{"name":"pt:description:errors","type":"PtValue | undefined","required":false},{"name":"pt:description:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:description:loading","type":"PtValue | undefined","required":false},{"name":"pt:description:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:description:readonly","type":"PtValue | undefined","required":false},{"name":"pt:description:warnings","type":"PtValue | undefined","required":false},{"name":"pt:hint","type":"PtValue | undefined","required":false},{"name":"pt:hint:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:hint:disabled","type":"PtValue | undefined","required":false},{"name":"pt:hint:errors","type":"PtValue | undefined","required":false},{"name":"pt:hint:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:hint:loading","type":"PtValue | undefined","required":false},{"name":"pt:hint:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:hint:readonly","type":"PtValue | undefined","required":false},{"name":"pt:hint:warnings","type":"PtValue | undefined","required":false},{"name":"pt:icon","type":"PtValue | undefined","required":false},{"name":"pt:icon:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:icon:disabled","type":"PtValue | undefined","required":false},{"name":"pt:icon:errors","type":"PtValue | undefined","required":false},{"name":"pt:icon:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:icon:loading","type":"PtValue | undefined","required":false},{"name":"pt:icon:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:icon:readonly","type":"PtValue | undefined","required":false},{"name":"pt:icon:warnings","type":"PtValue | undefined","required":false},{"name":"pt:input","type":"PtValue | undefined","required":false},{"name":"pt:input:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:input:disabled","type":"PtValue | undefined","required":false},{"name":"pt:input:errors","type":"PtValue | undefined","required":false},{"name":"pt:input:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:input:loading","type":"PtValue | undefined","required":false},{"name":"pt:input:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:input:readonly","type":"PtValue | undefined","required":false},{"name":"pt:input:warnings","type":"PtValue | undefined","required":false},{"name":"pt:label","type":"PtValue | undefined","required":false},{"name":"pt:label:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:label:disabled","type":"PtValue | undefined","required":false},{"name":"pt:label:errors","type":"PtValue | undefined","required":false},{"name":"pt:label:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:label:loading","type":"PtValue | undefined","required":false},{"name":"pt:label:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:label:readonly","type":"PtValue | undefined","required":false},{"name":"pt:label:warnings","type":"PtValue | undefined","required":false},{"name":"pt:message","type":"PtValue | undefined","required":false},{"name":"pt:message:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:message:disabled","type":"PtValue | undefined","required":false},{"name":"pt:message:errors","type":"PtValue | undefined","required":false},{"name":"pt:message:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:message:loading","type":"PtValue | undefined","required":false},{"name":"pt:message:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:message:readonly","type":"PtValue | undefined","required":false},{"name":"pt:message:warnings","type":"PtValue | undefined","required":false},{"name":"pt:prefix","type":"PtValue | undefined","required":false},{"name":"pt:prefix:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:prefix:disabled","type":"PtValue | undefined","required":false},{"name":"pt:prefix:errors","type":"PtValue | undefined","required":false},{"name":"pt:prefix:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:prefix:loading","type":"PtValue | undefined","required":false},{"name":"pt:prefix:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:prefix:readonly","type":"PtValue | undefined","required":false},{"name":"pt:prefix:warnings","type":"PtValue | undefined","required":false},{"name":"pt:root","type":"PtValue | undefined","required":false},{"name":"pt:root:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:root:disabled","type":"PtValue | undefined","required":false},{"name":"pt:root:errors","type":"PtValue | undefined","required":false},{"name":"pt:root:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:root:loading","type":"PtValue | undefined","required":false},{"name":"pt:root:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:root:readonly","type":"PtValue | undefined","required":false},{"name":"pt:root:warnings","type":"PtValue | undefined","required":false},{"name":"pt:spinner","type":"PtValue | undefined","required":false},{"name":"pt:spinner:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:spinner:disabled","type":"PtValue | undefined","required":false},{"name":"pt:spinner:errors","type":"PtValue | undefined","required":false},{"name":"pt:spinner:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:spinner:loading","type":"PtValue | undefined","required":false},{"name":"pt:spinner:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:spinner:readonly","type":"PtValue | undefined","required":false},{"name":"pt:spinner:warnings","type":"PtValue | undefined","required":false},{"name":"pt:suffix","type":"PtValue | undefined","required":false},{"name":"pt:suffix:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:suffix:disabled","type":"PtValue | undefined","required":false},{"name":"pt:suffix:errors","type":"PtValue | undefined","required":false},{"name":"pt:suffix:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:suffix:loading","type":"PtValue | undefined","required":false},{"name":"pt:suffix:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:suffix:readonly","type":"PtValue | undefined","required":false},{"name":"pt:suffix:warnings","type":"PtValue | undefined","required":false},{"name":"readonly","type":"boolean | undefined","required":false,"default":"false","description":"Sets the input in a readonly state."},{"name":"required","type":"boolean | undefined","required":false,"default":"false","description":"Sets the input as required."},{"name":"reverse","type":"boolean | undefined","required":false,"default":"false","description":"Reverses the layout. Applicable in every direction the order of the label and\nthe input is swapped."},{"name":"rows","type":"string | number | undefined","required":false,"description":"Sets the number of visible text lines for the control."},{"name":"rules","type":"RuleExpression<string | null>","required":false,"description":"vee-validate rules for this field. Only inside a `BbForm`."},{"name":"validationLabel","type":"string | undefined","required":false,"description":"The field's name in validation messages (`{field}`): \"Email is not\nvalid\". Defaults to the `label` (or `legend`), then \"This field\"; the\nfield's `name` never shows. Set it when the label is not a good noun for\na sentence (an icon-only label, a question) or is hidden. Only inside a\n`BbForm`."},{"name":"validationMode","type":"ValidationMode | undefined","required":false,"values":["aggressive","balanced","lazy","submit-only","submit-live"],"description":"When this field checks itself while the user works: `aggressive` (every\nchange), `balanced` (on leave, then every change while it shows an\nerror), `lazy` (on leave only), `submit-only` (on submit only) or\n`submit-live` (on submit, then every change while it shows an error).\n\"Leave\" is blur for a text-like control, and focus leaving the whole\ncontrol for a picker or a group; a checkbox or switch commits on click.\nUnset, the enclosing `BbForm`'s `validation-mode` applies, then the app's\n`formControls.validationMode` (`'balanced'`). Only inside a `BbForm`."},{"name":"variant","type":"InputVariantType | undefined","required":false,"default":"'outline'","values":["outline","secondary","none","ghost"],"description":"Visual variant of the field box — the same names and tokens as the\n`BbButton` variants. Colours only: height, padding and border width are\nidentical across variants, so a form never reflows when one changes.\n`'ghost'` has no border in any state (errors and warnings show through\nthe icon and the messages); every variant keeps the focus ring.\nRegister extra names with the plugin's `inputVariants` option.\n\n`'none'` is a blank starting point: the field keeps its structure and\nbehaviour but takes no look, so your own classes don't fight a built-in\none. You then own hover, focus, disabled and the error / warning states.\nFine for a one-off; keep inline styling short, and register a real\nvariant (`inputVariants`) when the look recurs."},{"name":"warnings","type":"string | string[] | undefined","required":false,"description":"Warning messages to display beneath the field, in their own `aria-live`\nregion and amber (`--bb-text-warn`). A string or array; a non-empty list\nimplies the warning state. Errors suppress warnings when both are set.\nWhile displayed they are also referenced from the control's\n`aria-describedby`, after any errors and before the description/hint."}],"events":[{"name":"blur","signature":"(event: FocusEvent): void","description":"Emitted when the native textarea loses focus.\nForwards the original DOM `FocusEvent`."},{"name":"change","signature":"(event: Event): void","description":"Emitted when the native textarea fires a change event.\nForwards the original DOM `Event`."},{"name":"click","signature":"(event: MouseEvent): void","description":"Emitted when the textarea receives a click interaction.\nForwards the original DOM `MouseEvent`."},{"name":"compositionend","signature":"(event: CompositionEvent): void","description":"An IME composition ended. Forwards the original DOM `CompositionEvent`."},{"name":"compositionstart","signature":"(event: CompositionEvent): void","description":"An IME composition started. Forwards the original DOM `CompositionEvent`."},{"name":"focus","signature":"(event: FocusEvent): void","description":"Emitted when the native textarea gains focus.\nForwards the original DOM `FocusEvent`."},{"name":"input","signature":"(event: Event): void","description":"Emitted on native input events from the textarea.\nForwards the original DOM `Event`."},{"name":"keydown","signature":"(event: KeyboardEvent): void","description":"Emitted for keyboard interaction on the textarea.\nForwards the original DOM `KeyboardEvent`."},{"name":"keyup","signature":"(event: KeyboardEvent): void","description":"Emitted for keyboard interaction on the textarea.\nForwards the original DOM `KeyboardEvent`."},{"name":"mousedown","signature":"(event: MouseEvent): void","description":"Emitted when a pointing device button is pressed over the textarea.\nForwards the original DOM `MouseEvent`."},{"name":"mouseup","signature":"(event: MouseEvent): void","description":"Emitted when a pointing device button is released over the textarea.\nForwards the original DOM `MouseEvent`."},{"name":"paste","signature":"(event: ClipboardEvent): void","description":"Native clipboard paste. Forwards the original DOM `ClipboardEvent`."},{"name":"update:modelValue","signature":"(value: string | null): void","description":"Emitted when the value changes. Carries the new text or `null` when cleared."}],"slots":[{"name":"append","type":"Record<string, never>","description":"Content rendered after the textarea, at the end of the inner container."},{"name":"append:outer","type":"Record<string, never>","description":"Content rendered after the entire textarea control, outside the input chrome."},{"name":"description","type":"BbTextareaDescriptionSlotProps","fields":["text: string","hasErrors: boolean","hasWarnings: boolean"],"description":"Replaces the description text. Provided alone (no `description` prop) it still\nrenders the description region and wires it into `aria-describedby`."},{"name":"label","type":"BbTextareaLabelSlotProps","fields":["text: string","hasErrors: boolean","hasWarnings: boolean"],"description":"Replaces the default label text rendered above the textarea."},{"name":"prefix","type":"Record<string, never>","description":"Inline content rendered at the start of the textarea field area, before the text."},{"name":"prepend","type":"Record<string, never>","description":"Content rendered before the textarea, at the start of the inner container."},{"name":"prepend:outer","type":"Record<string, never>","description":"Content rendered before the entire textarea control, outside the input chrome."},{"name":"suffix","type":"Record<string, never>","description":"Inline content rendered at the end of the textarea field area, after the text."}],"exposed":[],"models":[{"name":"modelValue","type":"string | null | undefined"}],"cssProps":[{"name":"--min-height","value":"150px","selector":".bb-textarea__field","description":"height of the box when the consumer gives no `rows`"},{"name":"--inner-h","value":"max( calc(var(--bb-leading) + var(--bb-input-py) * 2), calc(var(--bb-input-h) - 2px), var(--bb-input-icon) )","selector":".bb-textarea__field","description":"The first text row's height: the tallest of one line plus its vertical padding, the input height less its borders, and the icon box."},{"name":"--floating-py","value":"calc((var(--inner-h) - var(--bb-input-icon)) / 2)","selector":".bb-textarea__field","description":"Top offset that centres the icons, affixes, spinner and clear button on that first row — the shell top-aligns them for a textarea."},{"name":"--border-color","value":"per variant","selector":"pt:box","description":"The resting border, at the fixed --bb-border-w. Errors and warnings paint their frame over it, so `pt:box=\"[--border-color:…]\"` recolours the rest without hiding the state; a plain `border-*` utility on the base pt:box would hide it (ESLint `no-box-border-color`)."}],"pt":{"parts":[{"name":"root","description":"The field's outer container: the label, the box and the lines under it."},{"name":"label","description":"The label text above the box (the `label` prop)."},{"name":"description","description":"The muted line under the label (the `description` prop)."},{"name":"message","description":"The errors / warnings line under the box. A node of its own: it can show at the same time as `hint`."},{"name":"hint","description":"The helper line (the `hint` prop), shown on focus, or always with `persistent-hint`."},{"name":"box","description":"The bordered box around the input — border, background and radius; the `variant` paints here."},{"name":"input","description":"The native input element inside the box."},{"name":"icon","description":"The content icons, prepend and append — a broadcast. Chrome (the clear ✕, a chevron, the error / warning glyph) is never in it."},{"name":"spinner","description":"The spinner inside the box while `loading`."},{"name":"prefix","description":"The `#prefix` slot's wrapper, inside the box before the input."},{"name":"suffix","description":"The `#suffix` slot's wrapper, inside the box after the input."},{"name":"clear","description":"The ✕ that empties this control (`clearable`) — one node, never a chip's own ✕."},{"name":"counter","description":"The character count at the end of the hint row (`counter`): `42`, or `42 / 140` with `maxlength`."}],"states":[{"name":"hasValue","description":"Component-wide: the control holds a value, by its own rule (`0` counts on `BbNumberInput`, `''` on `BbColorInput`)."},{"name":"nearLimit","description":"Component-wide: with `counter` and `maxlength`, the value is at 90 % of the limit or more, and still below it."},{"name":"atLimit","description":"Component-wide: with `counter` and `maxlength`, the value has reached the limit."},{"name":"readonly","description":"Component-wide: the control is `readonly` — shown, focusable, not editable."},{"name":"disabled","description":"Component-wide: the control is `disabled`."},{"name":"warnings","description":"Component-wide: the control is in its warning state (`warnings` / `has-warnings`) and not in an error state — errors win, so the two are never on together."},{"name":"errors","description":"Component-wide: the control is in its error state (`errors` / `has-errors`, or its validation) — the message line and the box turn red."},{"name":"loading","description":"Component-wide: `loading` is on; the box shows its `spinner`."}]},"tree":{"bindings":[{"part":"controlAttrs","target":"textarea.bb-textarea__input"},{"part":"input","target":"textarea.bb-textarea__input"}],"nodes":[{"name":"CommonField","kind":"internal","vocabulary":"BbTextarea","bindings":[{"part":"root","target":"div.bb-field"},{"part":"label","target":"component"},{"part":"description","target":"span.bb-field__description"},{"part":"hint","target":"span.bb-field__hint"},{"part":"counter","target":"span.bb-field__counter"},{"part":"message","target":"div.bb-field__message"}],"cssProps":[{"name":"--ctrl-line","documented":true,"readBy":["bb-field__label","bb-field__input-wrapper"]}],"children":[{"name":"BbAsterisk","kind":"public"}]},{"name":"CommonFieldInput","kind":"internal","vocabulary":"BbTextarea","bindings":[{"part":"box","target":"span.bb-field-input__box"},{"part":"prefix","target":"span.bb-field-input__prefix"},{"part":"icon","target":"BbIcon"},{"part":"clear","target":"ClearableButton"},{"part":"spinner","target":"BbSpinner"},{"part":"suffix","target":"span.bb-field-input__suffix"}],"cssProps":[{"name":"--bg","documented":true,"readBy":["bb-field-input","bb-field-input__box"]},{"name":"--bg-hover","documented":true,"readBy":["bb-field-input__box"]},{"name":"--bg-focus","documented":true,"readBy":["bb-field-input__box"]},{"name":"--bg-disabled","documented":true,"readBy":["bb-field-input__box"]},{"name":"--fg-disabled","documented":true,"readBy":["bb-field-input__box","bb-field-input__prefix","bb-field-input__suffix","bb-field-input__prepend-icon","bb-field-input__append-icon"]},{"name":"--border-color","documented":true,"readBy":["bb-field-input","bb-field-input__box"]},{"name":"--border-focus","documented":true,"readBy":["bb-field-input__box"]},{"name":"--ring-size","documented":true,"readBy":["bb-field-input__box"]},{"name":"--ring-color","documented":true,"readBy":["bb-field-input__box"]},{"name":"--elev","documented":true,"readBy":["bb-field-input__box"]},{"name":"--frost","documented":true,"readBy":["bb-field-input__box"]},{"name":"--inside-label-clearance","documented":true,"readBy":["bb-field-input__box","bb-field-input__prefix","bb-field-input__suffix"]}],"children":[{"name":"ErrorIcon","kind":"internal","cssProps":[{"name":"--accent","documented":false,"readBy":["bb-error-icon"]}],"children":[{"name":"BbIcon","kind":"public","cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]}]},{"name":"WarningIcon","kind":"internal","cssProps":[{"name":"--accent","documented":false,"readBy":["bb-warning-icon"]}],"children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]}]},{"name":"ClearableButton","kind":"internal","children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]}]},{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]},{"name":"BbSpinner","kind":"public","children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]}]}]},{"name":"BbSmoothHeight","kind":"public"}]},"css":{"classes":{"bb-textarea":["","__field","__field--auto-grow","__input"]},"locals":["--color-gray-200","--floating-py","--inner-h","--min-height","--row-h"]},"attrTargets":["div","textarea"],"removed":[{"name":"hasWarning","new":"hasWarnings","since":"3.0.0-beta.26","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"direction","new":"layout","since":"3.0.0-beta.33","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"prepend-outer","new":"prepend:outer","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"append-outer","new":"append:outer","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"vid","new":null,"hint":"a display name (v2: `vid=\"Email address\"`) is now `validation-label`; a field path (3.0 betas: `vid=\"address.city\"`) is now `name` (brackets for a native post: `address[city]`). `check --fix` picks by the value","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"byValue","display":"validationLabel","key":"name"}},{"name":"validateOn","new":"validationMode","hint":"an array of events became one mode (`aggressive` | `balanced` | `lazy` | `submit-only` | `submit-live`). The old defaults (`['blur']`, `['inactive']`, a toggle's `['update:modelValue', 'change', 'blur']`) are `balanced`, the new default: delete the prop. A text field on `['update:modelValue']` is `validation-mode=\"aggressive\"`. Set it once on `<BbForm validation-mode>` instead of per field","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"manual"}}],"renamed":[{"from":"hasWarning","to":"hasWarnings","since":"3.0.0-beta.26","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"direction","to":"layout","since":"3.0.0-beta.33","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"prepend-outer","to":"prepend:outer","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"append-outer","to":"append:outer","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"validateOn","to":"validationMode","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"manual"}}]},
503
- {"name":"BbTextInput","group":"Inputs","description":"Captures single-line text values.","referenceOnly":false,"hasGuide":true,"contract":"ai/BbTextInput.md","source":"ai/source/BbTextInput.md","props":[{"name":"append:icon","type":"string | undefined","required":false,"description":"Name of the icon to be added at the end of the input."},{"name":"autocomplete","type":"string | undefined","required":false,"description":"Guides to the browser as to the type of information expected in the field."},{"name":"autofocus","type":"Booleanish | undefined","required":false,"description":"Sets autofocus on page load."},{"name":"clearable","type":"boolean | undefined","required":false,"default":"false","description":"Displays a clear button when the input has a value and is being interacted with."},{"name":"compact","type":"boolean | undefined","required":false,"default":"false","description":"Compact density. Swaps `--bb-input-h`, `--bb-input-py` and\n`--bb-label-spacing-y` for their `-compact` twins on the field, so a\n`--bb-input-h` you set on the component is ignored while `compact` is on:\nsize a compact field with `--bb-input-h-compact` (and\n`--bb-input-py-compact`) instead."},{"name":"counter","type":"boolean | undefined","required":false,"default":"false","description":"Shows a character count at the end of the hint row, visible whether or\nnot the hint is: `42`, or `42 / 140` when the field has the native\n`maxlength` (which also stops input at the limit). From 90 % of the limit\nthe count turns to body text, at the limit to the warning colour, and it\nsteps back to muted while an error shows. Screen readers get a label\n(\"Characters: 42 of 140\") and a polite announcement only when the count\ncrosses 90 % or reaches the limit."},{"name":"description","type":"string | undefined","required":false,"description":"Descriptive text displayed below the label and above the input. Unlike the hint it is always\nvisible, and it is linked to the input via `aria-describedby` (after any\n`errors` / `warnings`, before the `hint`)."},{"name":"disabled","type":"boolean | undefined","required":false,"default":"false","description":"Disables the component."},{"name":"emitMasked","type":"boolean | undefined","required":false,"default":"false","description":"Emits the masked value of the input."},{"name":"errors","type":"string | string[] | undefined","required":false,"description":"Can be a string or an array of string containing the messages to display.\nThey render in an `aria-live=\"polite\"` region (announced when they appear)\nand, while the list is non-empty, are referenced FIRST from the control's\n`aria-describedby`, so the reason the field is invalid is re-read whenever\nthe control regains focus."},{"name":"formless","type":"boolean | undefined","required":false,"default":"false","description":"Keep this control out of the enclosing `BbForm` entirely: not submitted,\nnot dirty, not reset, not validated. For a control that is not form data\n(a filter, a \"show advanced\" switch)."},{"name":"hasErrors","type":"boolean | undefined","required":false,"default":"false","description":"Define if the component should be in an error state.\nIt usually attaches a CSS class for styling purposes."},{"name":"hasWarnings","type":"boolean | undefined","required":false,"default":"false","description":"Define if the component should be in a warning state.\nSame chrome as errors with `--bb-warn`; errors take priority."},{"name":"hideLabel","type":"boolean | undefined","required":false,"default":"false","description":"Visually hides the label of the input while maintaining accessibility."},{"name":"hint","type":"string | undefined","required":false,"description":"Text box to be displayed near the input, usually to indicate instructions."},{"name":"id","type":"string | undefined","required":false,"description":"The `id` of the native control; the label's `for` and the description\nand message ids derive from it. Generated when omitted."},{"name":"inputAlign","type":"FieldCrossAlign | undefined","required":false,"values":["top","center","bottom"],"description":"Vertical position of the control in a side-by-side row; not\n`inputPosition`, the horizontal one. Omitted, the control's first line\nmeets the label's."},{"name":"inputMode","type":"\"text\" | \"none\" | \"search\" | \"email\" | \"url\" | \"tel\" | \"numeric\" | \"decimal\" | undefined","required":false,"description":"The inputmode of the input."},{"name":"label","type":"string","required":true,"description":"Text content of the label of the element."},{"name":"labelAlign","type":"FieldCrossAlign | undefined","required":false,"values":["top","center","bottom"],"description":"Vertical position of the label block in a side-by-side row; not\n`labelPosition`, the horizontal one. Omitted, the label's first line\nmeets the control's."},{"name":"labelMode","type":"\"outside\" | \"floating\" | \"inside\" | undefined","required":false,"description":"Label rendering mode."},{"name":"labelPosition","type":"\"left\" | \"center\" | \"right\" | undefined","required":false,"description":"Sets the text alignment of the label."},{"name":"layout","type":"FieldLayout | undefined","required":false,"description":"How the label and the input sit together: `'vertical'`, `'horizontal'` (50/50),\n`'auto'`, `'label-fill'` (the label takes the free space, the input keeps\nits size), `'input-fill'` (the other way round), or a two-word ratio\npattern like `'xx xxxxx'`."},{"name":"loading","type":"boolean | undefined","required":false,"default":"false","description":"Sets the component in a loading state, usually triggering some visual styles."},{"name":"mask","type":"MaskInputOptions | undefined","required":false,"description":"The mask to be applied to the input.\nPlease visit https://beholdr.github.io/maska/v3 for syntax examples."},{"name":"modelValue","type":"string | null | undefined","required":false,"description":"Used by v-model."},{"name":"name","type":"string | undefined","required":false,"description":"Defines the name of the input."},{"name":"persistentHint","type":"boolean | undefined","required":false,"default":"false","description":"Keeps the hint displayed."},{"name":"placeholder","type":"string | undefined","required":false,"description":"String displayed when there's no data."},{"name":"prepend:icon","type":"string | undefined","required":false,"description":"Name of the icon to be added at the start of the input."},{"name":"pt","type":"PtMap<BbTextInputPtPart, BbTextInputPtState> | undefined","required":false,"description":"Passthrough, object form: `{ box: '…', 'box:errors': '…' }` — the same\nkeys as the `pt:*` attributes without the prefix. See the `pt:<part>` row."},{"name":"pt:box","type":"PtValue | undefined","required":false},{"name":"pt:box:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:box:disabled","type":"PtValue | undefined","required":false},{"name":"pt:box:errors","type":"PtValue | undefined","required":false},{"name":"pt:box:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:box:loading","type":"PtValue | undefined","required":false},{"name":"pt:box:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:box:readonly","type":"PtValue | undefined","required":false},{"name":"pt:box:warnings","type":"PtValue | undefined","required":false},{"name":"pt:clear","type":"PtValue | undefined","required":false},{"name":"pt:clear:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:clear:disabled","type":"PtValue | undefined","required":false},{"name":"pt:clear:errors","type":"PtValue | undefined","required":false},{"name":"pt:clear:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:clear:loading","type":"PtValue | undefined","required":false},{"name":"pt:clear:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:clear:readonly","type":"PtValue | undefined","required":false},{"name":"pt:clear:warnings","type":"PtValue | undefined","required":false},{"name":"pt:counter","type":"PtValue | undefined","required":false},{"name":"pt:counter:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:counter:disabled","type":"PtValue | undefined","required":false},{"name":"pt:counter:errors","type":"PtValue | undefined","required":false},{"name":"pt:counter:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:counter:loading","type":"PtValue | undefined","required":false},{"name":"pt:counter:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:counter:readonly","type":"PtValue | undefined","required":false},{"name":"pt:counter:warnings","type":"PtValue | undefined","required":false},{"name":"pt:description","type":"PtValue | undefined","required":false},{"name":"pt:description:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:description:disabled","type":"PtValue | undefined","required":false},{"name":"pt:description:errors","type":"PtValue | undefined","required":false},{"name":"pt:description:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:description:loading","type":"PtValue | undefined","required":false},{"name":"pt:description:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:description:readonly","type":"PtValue | undefined","required":false},{"name":"pt:description:warnings","type":"PtValue | undefined","required":false},{"name":"pt:hint","type":"PtValue | undefined","required":false},{"name":"pt:hint:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:hint:disabled","type":"PtValue | undefined","required":false},{"name":"pt:hint:errors","type":"PtValue | undefined","required":false},{"name":"pt:hint:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:hint:loading","type":"PtValue | undefined","required":false},{"name":"pt:hint:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:hint:readonly","type":"PtValue | undefined","required":false},{"name":"pt:hint:warnings","type":"PtValue | undefined","required":false},{"name":"pt:icon","type":"PtValue | undefined","required":false},{"name":"pt:icon:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:icon:disabled","type":"PtValue | undefined","required":false},{"name":"pt:icon:errors","type":"PtValue | undefined","required":false},{"name":"pt:icon:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:icon:loading","type":"PtValue | undefined","required":false},{"name":"pt:icon:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:icon:readonly","type":"PtValue | undefined","required":false},{"name":"pt:icon:warnings","type":"PtValue | undefined","required":false},{"name":"pt:input","type":"PtValue | undefined","required":false},{"name":"pt:input:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:input:disabled","type":"PtValue | undefined","required":false},{"name":"pt:input:errors","type":"PtValue | undefined","required":false},{"name":"pt:input:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:input:loading","type":"PtValue | undefined","required":false},{"name":"pt:input:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:input:readonly","type":"PtValue | undefined","required":false},{"name":"pt:input:warnings","type":"PtValue | undefined","required":false},{"name":"pt:label","type":"PtValue | undefined","required":false},{"name":"pt:label:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:label:disabled","type":"PtValue | undefined","required":false},{"name":"pt:label:errors","type":"PtValue | undefined","required":false},{"name":"pt:label:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:label:loading","type":"PtValue | undefined","required":false},{"name":"pt:label:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:label:readonly","type":"PtValue | undefined","required":false},{"name":"pt:label:warnings","type":"PtValue | undefined","required":false},{"name":"pt:message","type":"PtValue | undefined","required":false},{"name":"pt:message:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:message:disabled","type":"PtValue | undefined","required":false},{"name":"pt:message:errors","type":"PtValue | undefined","required":false},{"name":"pt:message:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:message:loading","type":"PtValue | undefined","required":false},{"name":"pt:message:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:message:readonly","type":"PtValue | undefined","required":false},{"name":"pt:message:warnings","type":"PtValue | undefined","required":false},{"name":"pt:prefix","type":"PtValue | undefined","required":false},{"name":"pt:prefix:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:prefix:disabled","type":"PtValue | undefined","required":false},{"name":"pt:prefix:errors","type":"PtValue | undefined","required":false},{"name":"pt:prefix:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:prefix:loading","type":"PtValue | undefined","required":false},{"name":"pt:prefix:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:prefix:readonly","type":"PtValue | undefined","required":false},{"name":"pt:prefix:warnings","type":"PtValue | undefined","required":false},{"name":"pt:root","type":"PtValue | undefined","required":false},{"name":"pt:root:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:root:disabled","type":"PtValue | undefined","required":false},{"name":"pt:root:errors","type":"PtValue | undefined","required":false},{"name":"pt:root:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:root:loading","type":"PtValue | undefined","required":false},{"name":"pt:root:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:root:readonly","type":"PtValue | undefined","required":false},{"name":"pt:root:warnings","type":"PtValue | undefined","required":false},{"name":"pt:spinner","type":"PtValue | undefined","required":false},{"name":"pt:spinner:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:spinner:disabled","type":"PtValue | undefined","required":false},{"name":"pt:spinner:errors","type":"PtValue | undefined","required":false},{"name":"pt:spinner:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:spinner:loading","type":"PtValue | undefined","required":false},{"name":"pt:spinner:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:spinner:readonly","type":"PtValue | undefined","required":false},{"name":"pt:spinner:warnings","type":"PtValue | undefined","required":false},{"name":"pt:suffix","type":"PtValue | undefined","required":false},{"name":"pt:suffix:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:suffix:disabled","type":"PtValue | undefined","required":false},{"name":"pt:suffix:errors","type":"PtValue | undefined","required":false},{"name":"pt:suffix:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:suffix:loading","type":"PtValue | undefined","required":false},{"name":"pt:suffix:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:suffix:readonly","type":"PtValue | undefined","required":false},{"name":"pt:suffix:warnings","type":"PtValue | undefined","required":false},{"name":"readonly","type":"boolean | undefined","required":false,"default":"false","description":"Sets the input in a readonly state."},{"name":"required","type":"boolean | undefined","required":false,"default":"false","description":"Sets the input as required."},{"name":"reverse","type":"boolean | undefined","required":false,"default":"false","description":"Reverses the layout. Applicable in every direction the order of the label and\nthe input is swapped."},{"name":"rules","type":"RuleExpression<string | null>","required":false,"description":"vee-validate rules for this field. Only inside a `BbForm`."},{"name":"type","type":"\"text\" | \"search\" | \"email\" | \"url\" | \"tel\" | \"password\" | undefined","required":false,"default":"\"text\"","description":"Type of the input. Restricted to the textual input types this component\nsupports — use `BbNumberInput` for numbers and `BbDatePickerInput` for dates."},{"name":"validationLabel","type":"string | undefined","required":false,"description":"The field's name in validation messages (`{field}`): \"Email is not\nvalid\". Defaults to the `label` (or `legend`), then \"This field\"; the\nfield's `name` never shows. Set it when the label is not a good noun for\na sentence (an icon-only label, a question) or is hidden. Only inside a\n`BbForm`."},{"name":"validationMode","type":"ValidationMode | undefined","required":false,"values":["aggressive","balanced","lazy","submit-only","submit-live"],"description":"When this field checks itself while the user works: `aggressive` (every\nchange), `balanced` (on leave, then every change while it shows an\nerror), `lazy` (on leave only), `submit-only` (on submit only) or\n`submit-live` (on submit, then every change while it shows an error).\n\"Leave\" is blur for a text-like control, and focus leaving the whole\ncontrol for a picker or a group; a checkbox or switch commits on click.\nUnset, the enclosing `BbForm`'s `validation-mode` applies, then the app's\n`formControls.validationMode` (`'balanced'`). Only inside a `BbForm`."},{"name":"variant","type":"InputVariantType | undefined","required":false,"default":"'outline'","values":["outline","secondary","none","ghost"],"description":"Visual variant of the field box — the same names and tokens as the\n`BbButton` variants. Colours only: height, padding and border width are\nidentical across variants, so a form never reflows when one changes.\n`'ghost'` has no border in any state (errors and warnings show through\nthe icon and the messages); every variant keeps the focus ring.\nRegister extra names with the plugin's `inputVariants` option.\n\n`'none'` is a blank starting point: the field keeps its structure and\nbehaviour but takes no look, so your own classes don't fight a built-in\none. You then own hover, focus, disabled and the error / warning states.\nFine for a one-off; keep inline styling short, and register a real\nvariant (`inputVariants`) when the look recurs."},{"name":"warnings","type":"string | string[] | undefined","required":false,"description":"Warning messages to display beneath the field, in their own `aria-live`\nregion and amber (`--bb-text-warn`). A string or array; a non-empty list\nimplies the warning state. Errors suppress warnings when both are set.\nWhile displayed they are also referenced from the control's\n`aria-describedby`, after any errors and before the description/hint."}],"events":[{"name":"blur","signature":"(event: FocusEvent): void","description":"Emitted when the native input loses focus.\nForwards the original DOM `FocusEvent`."},{"name":"change","signature":"(event: Event): void","description":"Emitted when the native input fires a change event.\nForwards the original DOM `Event`."},{"name":"click","signature":"(event: MouseEvent): void","description":"Emitted when the input receives a click interaction.\nForwards the original DOM `MouseEvent`."},{"name":"compositionend","signature":"(event: CompositionEvent): void","description":"Emitted when a composition session ends (e.g. CJK IME confirmed).\nForwards the original DOM `CompositionEvent`."},{"name":"compositionstart","signature":"(event: CompositionEvent): void","description":"Emitted when a composition session starts (e.g. CJK IME begins).\nForwards the original DOM `CompositionEvent`."},{"name":"focus","signature":"(event: FocusEvent): void","description":"Emitted when the native input gains focus.\nForwards the original DOM `FocusEvent`."},{"name":"input","signature":"(event: Event): void","description":"Emitted on native input events from the text field.\nForwards the original DOM `Event`."},{"name":"keydown","signature":"(event: KeyboardEvent): void","description":"Emitted for keyboard interaction on the input.\nForwards the original DOM `KeyboardEvent`."},{"name":"keyup","signature":"(event: KeyboardEvent): void","description":"Emitted when a key is released over the input.\nForwards the original DOM `KeyboardEvent`."},{"name":"mousedown","signature":"(event: MouseEvent): void","description":"Emitted when a pointing device button is pressed over the input.\nForwards the original DOM `MouseEvent`."},{"name":"mouseup","signature":"(event: MouseEvent): void","description":"Emitted when a pointing device button is released over the input.\nForwards the original DOM `MouseEvent`."},{"name":"paste","signature":"(event: ClipboardEvent): void","description":"Emitted when content is pasted into the input.\nForwards the original DOM `ClipboardEvent`."},{"name":"update:modelValue","signature":"(value: string | null): void","description":"Emitted when the value changes. Carries the new string or `null` when cleared.\nWhen `mask` is set, emits the masked or unmasked string depending on `emitMasked`."}],"slots":[{"name":"append","type":"object","description":"Content rendered after the text input, at the end of the field box."},{"name":"append:outer","type":"object","description":"Content rendered after the entire text input control, outside the input chrome."},{"name":"description","type":"BbTextInputDescriptionSlotProps","fields":["text: string","hasErrors: boolean","hasWarnings: boolean"],"description":"Replaces the description text. Provided alone (no `description` prop) it still\nrenders the description region and wires it into `aria-describedby`."},{"name":"label","type":"BbTextInputLabelSlotProps","fields":["text: string","hasErrors: boolean","hasWarnings: boolean"],"description":"Replaces the default label text rendered above the input."},{"name":"prefix","type":"object","description":"Inline content rendered at the start of the input field area, before the typed text."},{"name":"prepend","type":"object","description":"Content rendered before the text input, at the start of the field box."},{"name":"prepend:outer","type":"object","description":"Content rendered before the entire text input control, outside the input chrome."},{"name":"suffix","type":"object","description":"Inline content rendered at the end of the input field area, after the typed text."}],"exposed":[],"models":[{"name":"modelValue","type":"string | null | undefined"}],"cssProps":[{"name":"--border-color","value":"per variant","selector":"pt:box","description":"The resting border, at the fixed --bb-border-w. Errors and warnings paint their frame over it, so `pt:box=\"[--border-color:…]\"` recolours the rest without hiding the state; a plain `border-*` utility on the base pt:box would hide it (ESLint `no-box-border-color`)."}],"pt":{"parts":[{"name":"root","description":"The field's outer container: the label, the box and the lines under it."},{"name":"label","description":"The label text above the box (the `label` prop)."},{"name":"description","description":"The muted line under the label (the `description` prop)."},{"name":"message","description":"The errors / warnings line under the box. A node of its own: it can show at the same time as `hint`."},{"name":"hint","description":"The helper line (the `hint` prop), shown on focus, or always with `persistent-hint`."},{"name":"box","description":"The bordered box around the input — border, background and radius; the `variant` paints here."},{"name":"input","description":"The native input element inside the box."},{"name":"icon","description":"The content icons, prepend and append — a broadcast. Chrome (the clear ✕, a chevron, the error / warning glyph) is never in it."},{"name":"spinner","description":"The spinner inside the box while `loading`."},{"name":"prefix","description":"The `#prefix` slot's wrapper, inside the box before the input."},{"name":"suffix","description":"The `#suffix` slot's wrapper, inside the box after the input."},{"name":"clear","description":"The ✕ that empties this control (`clearable`) — one node, never a chip's own ✕."},{"name":"counter","description":"The character count at the end of the hint row (`counter`): `42`, or `42 / 140` with `maxlength`."}],"states":[{"name":"hasValue","description":"Component-wide: the control holds a value, by its own rule (`0` counts on `BbNumberInput`, `''` on `BbColorInput`)."},{"name":"nearLimit","description":"Component-wide: with `counter` and `maxlength`, the value is at 90 % of the limit or more, and still below it."},{"name":"atLimit","description":"Component-wide: with `counter` and `maxlength`, the value has reached the limit."},{"name":"readonly","description":"Component-wide: the control is `readonly` — shown, focusable, not editable."},{"name":"disabled","description":"Component-wide: the control is `disabled`."},{"name":"warnings","description":"Component-wide: the control is in its warning state (`warnings` / `has-warnings`) and not in an error state — errors win, so the two are never on together."},{"name":"errors","description":"Component-wide: the control is in its error state (`errors` / `has-errors`, or its validation) — the message line and the box turn red."},{"name":"loading","description":"Component-wide: `loading` is on; the box shows its `spinner`."}]},"tree":{"bindings":[{"part":"controlAttrs","target":"input.bb-text-input__input"},{"part":"input","target":"input.bb-text-input__input"}],"nodes":[{"name":"CommonField","kind":"internal","vocabulary":"BbTextInput","bindings":[{"part":"root","target":"div.bb-field"},{"part":"label","target":"component"},{"part":"description","target":"span.bb-field__description"},{"part":"hint","target":"span.bb-field__hint"},{"part":"counter","target":"span.bb-field__counter"},{"part":"message","target":"div.bb-field__message"}],"cssProps":[{"name":"--ctrl-line","documented":true,"readBy":["bb-field__label","bb-field__input-wrapper"]}],"children":[{"name":"BbAsterisk","kind":"public"}]},{"name":"CommonFieldInput","kind":"internal","vocabulary":"BbTextInput","bindings":[{"part":"box","target":"span.bb-field-input__box"},{"part":"prefix","target":"span.bb-field-input__prefix"},{"part":"icon","target":"BbIcon"},{"part":"clear","target":"ClearableButton"},{"part":"spinner","target":"BbSpinner"},{"part":"suffix","target":"span.bb-field-input__suffix"}],"cssProps":[{"name":"--bg","documented":true,"readBy":["bb-field-input","bb-field-input__box"]},{"name":"--bg-hover","documented":true,"readBy":["bb-field-input__box"]},{"name":"--bg-focus","documented":true,"readBy":["bb-field-input__box"]},{"name":"--bg-disabled","documented":true,"readBy":["bb-field-input__box"]},{"name":"--fg-disabled","documented":true,"readBy":["bb-field-input__box","bb-field-input__prefix","bb-field-input__suffix","bb-field-input__prepend-icon","bb-field-input__append-icon"]},{"name":"--border-color","documented":true,"readBy":["bb-field-input","bb-field-input__box"]},{"name":"--border-focus","documented":true,"readBy":["bb-field-input__box"]},{"name":"--ring-size","documented":true,"readBy":["bb-field-input__box"]},{"name":"--ring-color","documented":true,"readBy":["bb-field-input__box"]},{"name":"--elev","documented":true,"readBy":["bb-field-input__box"]},{"name":"--frost","documented":true,"readBy":["bb-field-input__box"]},{"name":"--inside-label-clearance","documented":true,"readBy":["bb-field-input__box","bb-field-input__prefix","bb-field-input__suffix"]}],"children":[{"name":"ErrorIcon","kind":"internal","cssProps":[{"name":"--accent","documented":false,"readBy":["bb-error-icon"]}],"children":[{"name":"BbIcon","kind":"public","cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]}]},{"name":"WarningIcon","kind":"internal","cssProps":[{"name":"--accent","documented":false,"readBy":["bb-warning-icon"]}],"children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]}]},{"name":"ClearableButton","kind":"internal","children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]}]},{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]},{"name":"BbSpinner","kind":"public","children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]}]}]}]},"css":{"classes":{"bb-text-input":["","__input"]},"locals":["--color-gray-200"]},"attrTargets":["div","input"],"removed":[{"name":"hasWarning","new":"hasWarnings","since":"3.0.0-beta.26","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"direction","new":"layout","since":"3.0.0-beta.33","migration":"ai/guides/migration/components/bb-text-input.md","silent":true,"fix":{"kind":"rename"}},{"name":"prepend-outer","new":"prepend:outer","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"append-outer","new":"append:outer","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"vid","new":null,"hint":"a display name (v2: `vid=\"Email address\"`) is now `validation-label`; a field path (3.0 betas: `vid=\"address.city\"`) is now `name` (brackets for a native post: `address[city]`). `check --fix` picks by the value","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"byValue","display":"validationLabel","key":"name"}},{"name":"validateOn","new":"validationMode","hint":"an array of events became one mode (`aggressive` | `balanced` | `lazy` | `submit-only` | `submit-live`). The old defaults (`['blur']`, `['inactive']`, a toggle's `['update:modelValue', 'change', 'blur']`) are `balanced`, the new default: delete the prop. A text field on `['update:modelValue']` is `validation-mode=\"aggressive\"`. Set it once on `<BbForm validation-mode>` instead of per field","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"manual"}},{"name":"focus","new":null,"surface":"method","hint":"no template-ref API in v3. Reach the <input> through pt: `:pt=\"{ input: { attrs: { ref: (el) => (input = el) } } }\"`, then `input.focus()` on that element; `autofocus` for focus on mount","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-text-input.md","silent":true,"fix":{"kind":"manual"}},{"name":"blur","new":null,"surface":"method","hint":"no template-ref API in v3. Reach the <input> through pt: `:pt=\"{ input: { attrs: { ref: (el) => (input = el) } } }\"`, then `input.blur()` on that element; `autofocus` for focus on mount","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-text-input.md","silent":true,"fix":{"kind":"manual"}},{"name":"select","new":null,"surface":"method","hint":"no template-ref API in v3. Reach the <input> through pt: `:pt=\"{ input: { attrs: { ref: (el) => (input = el) } } }\"`, then `input.select()` on that element; `autofocus` for focus on mount","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-text-input.md","silent":true,"fix":{"kind":"manual"}}],"renamed":[{"from":"hasWarning","to":"hasWarnings","since":"3.0.0-beta.26","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"direction","to":"layout","since":"3.0.0-beta.33","migration":"ai/guides/migration/components/bb-text-input.md","fix":{"kind":"rename"}},{"from":"prepend-outer","to":"prepend:outer","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"append-outer","to":"append:outer","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"validateOn","to":"validationMode","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"manual"}}]},
503
+ {"name":"BbTextarea","group":"Inputs","description":"Captures multi-line text values.","referenceOnly":false,"hasGuide":true,"contract":"ai/BbTextarea.md","source":"ai/source/BbTextarea.md","props":[{"name":"append:icon","type":"string | undefined","required":false,"description":"Name of the icon to be added at the end of the input."},{"name":"autocomplete","type":"string | undefined","required":false,"description":"Guides to the browser as to the type of information expected in the field."},{"name":"autofocus","type":"Booleanish | undefined","required":false,"description":"Sets autofocus on page load."},{"name":"autoGrow","type":"boolean | undefined","required":false,"default":"false","description":"Expands the textarea to match its content. Empty, it is one BbTextInput\ntall (text on the same line); it never shrinks below that, or below `rows`."},{"name":"clearable","type":"boolean | undefined","required":false,"default":"false","description":"Displays a clear button when the input has a value and is being interacted with."},{"name":"compact","type":"boolean | undefined","required":false,"default":"false","description":"Compact density. Swaps `--bb-input-h`, `--bb-input-py` and\n`--bb-label-spacing-y` for their `-compact` twins on the field, so a\n`--bb-input-h` you set on the component is ignored while `compact` is on:\nsize a compact field with `--bb-input-h-compact` (and\n`--bb-input-py-compact`) instead."},{"name":"counter","type":"boolean | undefined","required":false,"default":"false","description":"Shows a character count at the end of the hint row, visible whether or\nnot the hint is: `42`, or `42 / 140` when the field has the native\n`maxlength` (which also stops input at the limit). From 90 % of the limit\nthe count turns to body text, at the limit to the warning colour, and it\nsteps back to muted while an error shows. Screen readers get a label\n(\"Characters: 42 of 140\") and a polite announcement only when the count\ncrosses 90 % or reaches the limit."},{"name":"description","type":"string | undefined","required":false,"description":"Descriptive text displayed below the label and above the input. Unlike the hint it is always\nvisible, and it is linked to the input via `aria-describedby` (after any\n`errors` / `warnings`, before the `hint`)."},{"name":"disabled","type":"boolean | undefined","required":false,"default":"false","description":"Disables the component."},{"name":"errors","type":"string | string[] | undefined","required":false,"description":"Can be a string or an array of string containing the messages to display.\nThey render in an `aria-live=\"polite\"` region (announced when they appear)\nand, while the list is non-empty, are referenced FIRST from the control's\n`aria-describedby`, so the reason the field is invalid is re-read whenever\nthe control regains focus."},{"name":"formless","type":"boolean | undefined","required":false,"default":"false","description":"Keep this control out of the enclosing `BbForm` entirely: not submitted,\nnot dirty, not reset, not validated. For a control that is not form data\n(a filter, a \"show advanced\" switch)."},{"name":"hasErrors","type":"boolean | undefined","required":false,"default":"false","description":"Define if the component should be in an error state.\nIt usually attaches a CSS class for styling purposes."},{"name":"hasWarnings","type":"boolean | undefined","required":false,"default":"false","description":"Define if the component should be in a warning state.\nSame chrome as errors with `--bb-warn`; errors take priority."},{"name":"hideLabel","type":"boolean | undefined","required":false,"default":"false","description":"Visually hides the label of the input while maintaining accessibility."},{"name":"hint","type":"string | undefined","required":false,"description":"Text box to be displayed near the input, usually to indicate instructions."},{"name":"id","type":"string | undefined","required":false,"description":"The `id` of the native control; the label's `for` and the description\nand message ids derive from it. Generated when omitted."},{"name":"inputAlign","type":"FieldCrossAlign | undefined","required":false,"values":["top","center","bottom"],"description":"Vertical position of the control in a side-by-side row; not\n`inputPosition`, the horizontal one. Omitted, the control's first line\nmeets the label's."},{"name":"label","type":"string","required":true,"description":"Text content of the label of the element."},{"name":"labelAlign","type":"FieldCrossAlign | undefined","required":false,"values":["top","center","bottom"],"description":"Vertical position of the label block in a side-by-side row; not\n`labelPosition`, the horizontal one. Omitted, the label's first line\nmeets the control's."},{"name":"labelMode","type":"\"outside\" | \"floating\" | \"inside\" | undefined","required":false,"description":"Label rendering mode. `'outside'` (default) sits the label above/beside the\nfield; `'floating'`/`'inside'` overlay it, like the other text inputs."},{"name":"labelPosition","type":"\"left\" | \"center\" | \"right\" | undefined","required":false,"description":"Sets the text alignment of the label."},{"name":"layout","type":"FieldLayout | undefined","required":false,"description":"How the label and the input sit together: `'vertical'`, `'horizontal'` (50/50),\n`'auto'`, `'label-fill'` (the label takes the free space, the input keeps\nits size), `'input-fill'` (the other way round), or a two-word ratio\npattern like `'xx xxxxx'`."},{"name":"loading","type":"boolean | undefined","required":false,"default":"false","description":"Sets the component in a loading state, usually triggering some visual styles."},{"name":"modelValue","type":"string | null | undefined","required":false,"description":"Used by v-model."},{"name":"name","type":"string | undefined","required":false,"description":"Defines the name of the input."},{"name":"nullValue","type":"E | undefined","required":false,"description":"What the field emits once the user empties it (typing it empty, the\nclear button): `'null'` emits `null`, `'string'` emits `''`.\nUnset, the app's `formControls.textareaNullValue` applies (`'null'` by\ndefault). Also types the `update:modelValue` payload: with `'string'`\nit is `string`."},{"name":"persistentHint","type":"boolean | undefined","required":false,"default":"false","description":"Keeps the hint displayed."},{"name":"placeholder","type":"string | undefined","required":false,"description":"String displayed when there's no data."},{"name":"prepend:icon","type":"string | undefined","required":false,"description":"Name of the icon to be added at the start of the input."},{"name":"pt","type":"PtMap<BbTextareaPtPart, BbTextareaPtState> | undefined","required":false,"description":"Passthrough, object form: `{ box: '…', 'box:errors': '…' }` — the same\nkeys as the `pt:*` attributes without the prefix. See the `pt:<part>` row."},{"name":"pt:box","type":"PtValue | undefined","required":false},{"name":"pt:box:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:box:disabled","type":"PtValue | undefined","required":false},{"name":"pt:box:errors","type":"PtValue | undefined","required":false},{"name":"pt:box:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:box:loading","type":"PtValue | undefined","required":false},{"name":"pt:box:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:box:readonly","type":"PtValue | undefined","required":false},{"name":"pt:box:warnings","type":"PtValue | undefined","required":false},{"name":"pt:clear","type":"PtValue | undefined","required":false},{"name":"pt:clear:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:clear:disabled","type":"PtValue | undefined","required":false},{"name":"pt:clear:errors","type":"PtValue | undefined","required":false},{"name":"pt:clear:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:clear:loading","type":"PtValue | undefined","required":false},{"name":"pt:clear:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:clear:readonly","type":"PtValue | undefined","required":false},{"name":"pt:clear:warnings","type":"PtValue | undefined","required":false},{"name":"pt:counter","type":"PtValue | undefined","required":false},{"name":"pt:counter:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:counter:disabled","type":"PtValue | undefined","required":false},{"name":"pt:counter:errors","type":"PtValue | undefined","required":false},{"name":"pt:counter:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:counter:loading","type":"PtValue | undefined","required":false},{"name":"pt:counter:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:counter:readonly","type":"PtValue | undefined","required":false},{"name":"pt:counter:warnings","type":"PtValue | undefined","required":false},{"name":"pt:description","type":"PtValue | undefined","required":false},{"name":"pt:description:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:description:disabled","type":"PtValue | undefined","required":false},{"name":"pt:description:errors","type":"PtValue | undefined","required":false},{"name":"pt:description:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:description:loading","type":"PtValue | undefined","required":false},{"name":"pt:description:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:description:readonly","type":"PtValue | undefined","required":false},{"name":"pt:description:warnings","type":"PtValue | undefined","required":false},{"name":"pt:hint","type":"PtValue | undefined","required":false},{"name":"pt:hint:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:hint:disabled","type":"PtValue | undefined","required":false},{"name":"pt:hint:errors","type":"PtValue | undefined","required":false},{"name":"pt:hint:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:hint:loading","type":"PtValue | undefined","required":false},{"name":"pt:hint:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:hint:readonly","type":"PtValue | undefined","required":false},{"name":"pt:hint:warnings","type":"PtValue | undefined","required":false},{"name":"pt:icon","type":"PtValue | undefined","required":false},{"name":"pt:icon:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:icon:disabled","type":"PtValue | undefined","required":false},{"name":"pt:icon:errors","type":"PtValue | undefined","required":false},{"name":"pt:icon:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:icon:loading","type":"PtValue | undefined","required":false},{"name":"pt:icon:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:icon:readonly","type":"PtValue | undefined","required":false},{"name":"pt:icon:warnings","type":"PtValue | undefined","required":false},{"name":"pt:input","type":"PtValue | undefined","required":false},{"name":"pt:input:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:input:disabled","type":"PtValue | undefined","required":false},{"name":"pt:input:errors","type":"PtValue | undefined","required":false},{"name":"pt:input:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:input:loading","type":"PtValue | undefined","required":false},{"name":"pt:input:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:input:readonly","type":"PtValue | undefined","required":false},{"name":"pt:input:warnings","type":"PtValue | undefined","required":false},{"name":"pt:label","type":"PtValue | undefined","required":false},{"name":"pt:label:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:label:disabled","type":"PtValue | undefined","required":false},{"name":"pt:label:errors","type":"PtValue | undefined","required":false},{"name":"pt:label:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:label:loading","type":"PtValue | undefined","required":false},{"name":"pt:label:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:label:readonly","type":"PtValue | undefined","required":false},{"name":"pt:label:warnings","type":"PtValue | undefined","required":false},{"name":"pt:message","type":"PtValue | undefined","required":false},{"name":"pt:message:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:message:disabled","type":"PtValue | undefined","required":false},{"name":"pt:message:errors","type":"PtValue | undefined","required":false},{"name":"pt:message:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:message:loading","type":"PtValue | undefined","required":false},{"name":"pt:message:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:message:readonly","type":"PtValue | undefined","required":false},{"name":"pt:message:warnings","type":"PtValue | undefined","required":false},{"name":"pt:prefix","type":"PtValue | undefined","required":false},{"name":"pt:prefix:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:prefix:disabled","type":"PtValue | undefined","required":false},{"name":"pt:prefix:errors","type":"PtValue | undefined","required":false},{"name":"pt:prefix:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:prefix:loading","type":"PtValue | undefined","required":false},{"name":"pt:prefix:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:prefix:readonly","type":"PtValue | undefined","required":false},{"name":"pt:prefix:warnings","type":"PtValue | undefined","required":false},{"name":"pt:root","type":"PtValue | undefined","required":false},{"name":"pt:root:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:root:disabled","type":"PtValue | undefined","required":false},{"name":"pt:root:errors","type":"PtValue | undefined","required":false},{"name":"pt:root:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:root:loading","type":"PtValue | undefined","required":false},{"name":"pt:root:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:root:readonly","type":"PtValue | undefined","required":false},{"name":"pt:root:warnings","type":"PtValue | undefined","required":false},{"name":"pt:spinner","type":"PtValue | undefined","required":false},{"name":"pt:spinner:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:spinner:disabled","type":"PtValue | undefined","required":false},{"name":"pt:spinner:errors","type":"PtValue | undefined","required":false},{"name":"pt:spinner:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:spinner:loading","type":"PtValue | undefined","required":false},{"name":"pt:spinner:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:spinner:readonly","type":"PtValue | undefined","required":false},{"name":"pt:spinner:warnings","type":"PtValue | undefined","required":false},{"name":"pt:suffix","type":"PtValue | undefined","required":false},{"name":"pt:suffix:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:suffix:disabled","type":"PtValue | undefined","required":false},{"name":"pt:suffix:errors","type":"PtValue | undefined","required":false},{"name":"pt:suffix:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:suffix:loading","type":"PtValue | undefined","required":false},{"name":"pt:suffix:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:suffix:readonly","type":"PtValue | undefined","required":false},{"name":"pt:suffix:warnings","type":"PtValue | undefined","required":false},{"name":"readonly","type":"boolean | undefined","required":false,"default":"false","description":"Sets the input in a readonly state."},{"name":"required","type":"boolean | undefined","required":false,"default":"false","description":"Sets the input as required."},{"name":"reverse","type":"boolean | undefined","required":false,"default":"false","description":"Reverses the layout. Applicable in every direction the order of the label and\nthe input is swapped."},{"name":"rows","type":"string | number | undefined","required":false,"description":"Sets the number of visible text lines for the control."},{"name":"rules","type":"RuleExpression<string | null>","required":false,"description":"vee-validate rules for this field. Only inside a `BbForm`."},{"name":"validationLabel","type":"string | undefined","required":false,"description":"The field's name in validation messages (`{field}`): \"Email is not\nvalid\". Defaults to the `label` (or `legend`), then \"This field\"; the\nfield's `name` never shows. Set it when the label is not a good noun for\na sentence (an icon-only label, a question) or is hidden. Only inside a\n`BbForm`."},{"name":"validationMode","type":"ValidationMode | undefined","required":false,"values":["aggressive","balanced","lazy","submit-only","submit-live"],"description":"When this field checks itself while the user works: `aggressive` (every\nchange), `balanced` (on leave, then every change while it shows an\nerror), `lazy` (on leave only), `submit-only` (on submit only) or\n`submit-live` (on submit, then every change while it shows an error).\n\"Leave\" is blur for a text-like control, and focus leaving the whole\ncontrol for a picker or a group; a checkbox or switch commits on click.\nUnset, the enclosing `BbForm`'s `validation-mode` applies, then the app's\n`formControls.validationMode` (`'balanced'`). Only inside a `BbForm`."},{"name":"variant","type":"InputVariantType | undefined","required":false,"default":"'outline'","values":["outline","secondary","none","ghost"],"description":"Visual variant of the field box — the same names and tokens as the\n`BbButton` variants. Colours only: height, padding and border width are\nidentical across variants, so a form never reflows when one changes.\n`'ghost'` has no border in any state (errors and warnings show through\nthe icon and the messages); every variant keeps the focus ring.\nRegister extra names with the plugin's `inputVariants` option.\n\n`'none'` is a blank starting point: the field keeps its structure and\nbehaviour but takes no look, so your own classes don't fight a built-in\none. You then own hover, focus, disabled and the error / warning states.\nFine for a one-off; keep inline styling short, and register a real\nvariant (`inputVariants`) when the look recurs."},{"name":"warnings","type":"string | string[] | undefined","required":false,"description":"Warning messages to display beneath the field, in their own `aria-live`\nregion and amber (`--bb-text-warn`). A string or array; a non-empty list\nimplies the warning state. Errors suppress warnings when both are set.\nWhile displayed they are also referenced from the control's\n`aria-describedby`, after any errors and before the description/hint."}],"events":[{"name":"blur","signature":"(event: FocusEvent): void","description":"Emitted when the native textarea loses focus.\nForwards the original DOM `FocusEvent`."},{"name":"change","signature":"(event: Event): void","description":"Emitted when the native textarea fires a change event.\nForwards the original DOM `Event`."},{"name":"click","signature":"(event: MouseEvent): void","description":"Emitted when the textarea receives a click interaction.\nForwards the original DOM `MouseEvent`."},{"name":"compositionend","signature":"(event: CompositionEvent): void","description":"An IME composition ended. Forwards the original DOM `CompositionEvent`."},{"name":"compositionstart","signature":"(event: CompositionEvent): void","description":"An IME composition started. Forwards the original DOM `CompositionEvent`."},{"name":"focus","signature":"(event: FocusEvent): void","description":"Emitted when the native textarea gains focus.\nForwards the original DOM `FocusEvent`."},{"name":"input","signature":"(event: Event): void","description":"Emitted on native input events from the textarea.\nForwards the original DOM `Event`."},{"name":"keydown","signature":"(event: KeyboardEvent): void","description":"Emitted for keyboard interaction on the textarea.\nForwards the original DOM `KeyboardEvent`."},{"name":"keyup","signature":"(event: KeyboardEvent): void","description":"Emitted for keyboard interaction on the textarea.\nForwards the original DOM `KeyboardEvent`."},{"name":"mousedown","signature":"(event: MouseEvent): void","description":"Emitted when a pointing device button is pressed over the textarea.\nForwards the original DOM `MouseEvent`."},{"name":"mouseup","signature":"(event: MouseEvent): void","description":"Emitted when a pointing device button is released over the textarea.\nForwards the original DOM `MouseEvent`."},{"name":"paste","signature":"(event: ClipboardEvent): void","description":"Native clipboard paste. Forwards the original DOM `ClipboardEvent`."},{"name":"update:modelValue","signature":"(value: string | NullValueOf<E>): void","description":"Emitted when the value changes. Carries the new text, or the empty value\n(`null-value`, else the app's, `null` by default) when emptied."}],"slots":[{"name":"append","type":"Record<string, never>","description":"Content rendered after the textarea, at the end of the inner container."},{"name":"append:outer","type":"Record<string, never>","description":"Content rendered after the entire textarea control, outside the input chrome."},{"name":"description","type":"BbTextareaDescriptionSlotProps","fields":["text: string","hasErrors: boolean","hasWarnings: boolean"],"description":"Replaces the description text. Provided alone (no `description` prop) it still\nrenders the description region and wires it into `aria-describedby`."},{"name":"label","type":"BbTextareaLabelSlotProps","fields":["text: string","hasErrors: boolean","hasWarnings: boolean"],"description":"Replaces the default label text rendered above the textarea."},{"name":"prefix","type":"Record<string, never>","description":"Inline content rendered at the start of the textarea field area, before the text."},{"name":"prepend","type":"Record<string, never>","description":"Content rendered before the textarea, at the start of the inner container."},{"name":"prepend:outer","type":"Record<string, never>","description":"Content rendered before the entire textarea control, outside the input chrome."},{"name":"suffix","type":"Record<string, never>","description":"Inline content rendered at the end of the textarea field area, after the text."}],"exposed":[],"models":[{"name":"modelValue","type":"string | null | undefined"}],"cssProps":[{"name":"--min-height","value":"150px","selector":".bb-textarea__field","description":"height of the box when the consumer gives no `rows`"},{"name":"--inner-h","value":"max( calc(var(--bb-leading) + var(--bb-input-py) * 2), calc(var(--bb-input-h) - 2px), var(--bb-input-icon) )","selector":".bb-textarea__field","description":"The first text row's height: the tallest of one line plus its vertical padding, the input height less its borders, and the icon box."},{"name":"--floating-py","value":"calc((var(--inner-h) - var(--bb-input-icon)) / 2)","selector":".bb-textarea__field","description":"Top offset that centres the icons, affixes, spinner and clear button on that first row — the shell top-aligns them for a textarea."},{"name":"--border-color","value":"per variant","selector":"pt:box","description":"The resting border, at the fixed --bb-border-w. Errors and warnings paint their frame over it, so `pt:box=\"[--border-color:…]\"` recolours the rest without hiding the state; a plain `border-*` utility on the base pt:box would hide it (ESLint `no-box-border-color`)."}],"pt":{"parts":[{"name":"root","description":"The field's outer container: the label, the box and the lines under it."},{"name":"label","description":"The label text above the box (the `label` prop)."},{"name":"description","description":"The muted line under the label (the `description` prop)."},{"name":"message","description":"The errors / warnings line under the box. A node of its own: it can show at the same time as `hint`."},{"name":"hint","description":"The helper line (the `hint` prop), shown on focus, or always with `persistent-hint`."},{"name":"box","description":"The bordered box around the input — border, background and radius; the `variant` paints here."},{"name":"input","description":"The native input element inside the box."},{"name":"icon","description":"The content icons, prepend and append — a broadcast. Chrome (the clear ✕, a chevron, the error / warning glyph) is never in it."},{"name":"spinner","description":"The spinner inside the box while `loading`."},{"name":"prefix","description":"The `#prefix` slot's wrapper, inside the box before the input."},{"name":"suffix","description":"The `#suffix` slot's wrapper, inside the box after the input."},{"name":"clear","description":"The ✕ that empties this control (`clearable`) — one node, never a chip's own ✕."},{"name":"counter","description":"The character count at the end of the hint row (`counter`): `42`, or `42 / 140` with `maxlength`."}],"states":[{"name":"hasValue","description":"Component-wide: the control holds a value, by its own rule (`0` counts on `BbNumberInput`, `''` on `BbColorInput`)."},{"name":"nearLimit","description":"Component-wide: with `counter` and `maxlength`, the value is at 90 % of the limit or more, and still below it."},{"name":"atLimit","description":"Component-wide: with `counter` and `maxlength`, the value has reached the limit."},{"name":"readonly","description":"Component-wide: the control is `readonly` — shown, focusable, not editable."},{"name":"disabled","description":"Component-wide: the control is `disabled`."},{"name":"warnings","description":"Component-wide: the control is in its warning state (`warnings` / `has-warnings`) and not in an error state — errors win, so the two are never on together."},{"name":"errors","description":"Component-wide: the control is in its error state (`errors` / `has-errors`, or its validation) — the message line and the box turn red."},{"name":"loading","description":"Component-wide: `loading` is on; the box shows its `spinner`."}]},"tree":{"bindings":[{"part":"controlAttrs","target":"textarea.bb-textarea__input"},{"part":"input","target":"textarea.bb-textarea__input"}],"nodes":[{"name":"CommonField","kind":"internal","vocabulary":"BbTextarea","bindings":[{"part":"root","target":"div.bb-field"},{"part":"label","target":"component"},{"part":"description","target":"span.bb-field__description"},{"part":"hint","target":"span.bb-field__hint"},{"part":"counter","target":"span.bb-field__counter"},{"part":"message","target":"div.bb-field__message"}],"cssProps":[{"name":"--ctrl-line","documented":true,"readBy":["bb-field__label","bb-field__input-wrapper"]}],"children":[{"name":"BbAsterisk","kind":"public"}]},{"name":"CommonFieldInput","kind":"internal","vocabulary":"BbTextarea","bindings":[{"part":"box","target":"span.bb-field-input__box"},{"part":"prefix","target":"span.bb-field-input__prefix"},{"part":"icon","target":"BbIcon"},{"part":"clear","target":"ClearableButton"},{"part":"spinner","target":"BbSpinner"},{"part":"suffix","target":"span.bb-field-input__suffix"}],"cssProps":[{"name":"--bg","documented":true,"readBy":["bb-field-input","bb-field-input__box"]},{"name":"--bg-hover","documented":true,"readBy":["bb-field-input__box"]},{"name":"--bg-focus","documented":true,"readBy":["bb-field-input__box"]},{"name":"--bg-disabled","documented":true,"readBy":["bb-field-input__box"]},{"name":"--fg-disabled","documented":true,"readBy":["bb-field-input__box","bb-field-input__prefix","bb-field-input__suffix","bb-field-input__prepend-icon","bb-field-input__append-icon"]},{"name":"--border-color","documented":true,"readBy":["bb-field-input","bb-field-input__box"]},{"name":"--border-focus","documented":true,"readBy":["bb-field-input__box"]},{"name":"--ring-size","documented":true,"readBy":["bb-field-input__box"]},{"name":"--ring-color","documented":true,"readBy":["bb-field-input__box"]},{"name":"--elev","documented":true,"readBy":["bb-field-input__box"]},{"name":"--frost","documented":true,"readBy":["bb-field-input__box"]},{"name":"--inside-label-clearance","documented":true,"readBy":["bb-field-input__box","bb-field-input__prefix","bb-field-input__suffix"]}],"children":[{"name":"ErrorIcon","kind":"internal","cssProps":[{"name":"--accent","documented":false,"readBy":["bb-error-icon"]}],"children":[{"name":"BbIcon","kind":"public","cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]}]},{"name":"WarningIcon","kind":"internal","cssProps":[{"name":"--accent","documented":false,"readBy":["bb-warning-icon"]}],"children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]}]},{"name":"ClearableButton","kind":"internal","children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]}]},{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]},{"name":"BbSpinner","kind":"public","children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]}]}]},{"name":"BbSmoothHeight","kind":"public"}]},"css":{"classes":{"bb-textarea":["","__field","__field--auto-grow","__input"]},"locals":["--color-gray-200","--floating-py","--inner-h","--min-height","--row-h"]},"attrTargets":["div","textarea"],"removed":[{"name":"hasWarning","new":"hasWarnings","since":"3.0.0-beta.26","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"direction","new":"layout","since":"3.0.0-beta.33","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"prepend-outer","new":"prepend:outer","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"append-outer","new":"append:outer","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"vid","new":null,"hint":"a display name (v2: `vid=\"Email address\"`) is now `validation-label`; a field path (3.0 betas: `vid=\"address.city\"`) is now `name` (brackets for a native post: `address[city]`). `check --fix` picks by the value","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"byValue","display":"validationLabel","key":"name"}},{"name":"validateOn","new":"validationMode","hint":"an array of events became one mode (`aggressive` | `balanced` | `lazy` | `submit-only` | `submit-live`). The old defaults (`['blur']`, `['inactive']`, a toggle's `['update:modelValue', 'change', 'blur']`) are `balanced`, the new default: delete the prop. A text field on `['update:modelValue']` is `validation-mode=\"aggressive\"`. Set it once on `<BbForm validation-mode>` instead of per field","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"manual"}}],"renamed":[{"from":"hasWarning","to":"hasWarnings","since":"3.0.0-beta.26","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"direction","to":"layout","since":"3.0.0-beta.33","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"prepend-outer","to":"prepend:outer","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"append-outer","to":"append:outer","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"validateOn","to":"validationMode","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"manual"}}]},
504
+ {"name":"BbTextInput","group":"Inputs","description":"Captures single-line text values.","referenceOnly":false,"hasGuide":true,"contract":"ai/BbTextInput.md","source":"ai/source/BbTextInput.md","props":[{"name":"append:icon","type":"string | undefined","required":false,"description":"Name of the icon to be added at the end of the input."},{"name":"autocomplete","type":"string | undefined","required":false,"description":"Guides to the browser as to the type of information expected in the field."},{"name":"autofocus","type":"Booleanish | undefined","required":false,"description":"Sets autofocus on page load."},{"name":"clearable","type":"boolean | undefined","required":false,"default":"false","description":"Displays a clear button when the input has a value and is being interacted with."},{"name":"compact","type":"boolean | undefined","required":false,"default":"false","description":"Compact density. Swaps `--bb-input-h`, `--bb-input-py` and\n`--bb-label-spacing-y` for their `-compact` twins on the field, so a\n`--bb-input-h` you set on the component is ignored while `compact` is on:\nsize a compact field with `--bb-input-h-compact` (and\n`--bb-input-py-compact`) instead."},{"name":"counter","type":"boolean | undefined","required":false,"default":"false","description":"Shows a character count at the end of the hint row, visible whether or\nnot the hint is: `42`, or `42 / 140` when the field has the native\n`maxlength` (which also stops input at the limit). From 90 % of the limit\nthe count turns to body text, at the limit to the warning colour, and it\nsteps back to muted while an error shows. Screen readers get a label\n(\"Characters: 42 of 140\") and a polite announcement only when the count\ncrosses 90 % or reaches the limit."},{"name":"description","type":"string | undefined","required":false,"description":"Descriptive text displayed below the label and above the input. Unlike the hint it is always\nvisible, and it is linked to the input via `aria-describedby` (after any\n`errors` / `warnings`, before the `hint`)."},{"name":"disabled","type":"boolean | undefined","required":false,"default":"false","description":"Disables the component."},{"name":"emitMasked","type":"boolean | undefined","required":false,"default":"false","description":"Emits the masked value of the input."},{"name":"errors","type":"string | string[] | undefined","required":false,"description":"Can be a string or an array of string containing the messages to display.\nThey render in an `aria-live=\"polite\"` region (announced when they appear)\nand, while the list is non-empty, are referenced FIRST from the control's\n`aria-describedby`, so the reason the field is invalid is re-read whenever\nthe control regains focus."},{"name":"formless","type":"boolean | undefined","required":false,"default":"false","description":"Keep this control out of the enclosing `BbForm` entirely: not submitted,\nnot dirty, not reset, not validated. For a control that is not form data\n(a filter, a \"show advanced\" switch)."},{"name":"hasErrors","type":"boolean | undefined","required":false,"default":"false","description":"Define if the component should be in an error state.\nIt usually attaches a CSS class for styling purposes."},{"name":"hasWarnings","type":"boolean | undefined","required":false,"default":"false","description":"Define if the component should be in a warning state.\nSame chrome as errors with `--bb-warn`; errors take priority."},{"name":"hideLabel","type":"boolean | undefined","required":false,"default":"false","description":"Visually hides the label of the input while maintaining accessibility."},{"name":"hint","type":"string | undefined","required":false,"description":"Text box to be displayed near the input, usually to indicate instructions."},{"name":"id","type":"string | undefined","required":false,"description":"The `id` of the native control; the label's `for` and the description\nand message ids derive from it. Generated when omitted."},{"name":"inputAlign","type":"FieldCrossAlign | undefined","required":false,"values":["top","center","bottom"],"description":"Vertical position of the control in a side-by-side row; not\n`inputPosition`, the horizontal one. Omitted, the control's first line\nmeets the label's."},{"name":"inputMode","type":"\"text\" | \"none\" | \"search\" | \"tel\" | \"url\" | \"email\" | \"numeric\" | \"decimal\" | undefined","required":false,"description":"The inputmode of the input."},{"name":"label","type":"string","required":true,"description":"Text content of the label of the element."},{"name":"labelAlign","type":"FieldCrossAlign | undefined","required":false,"values":["top","center","bottom"],"description":"Vertical position of the label block in a side-by-side row; not\n`labelPosition`, the horizontal one. Omitted, the label's first line\nmeets the control's."},{"name":"labelMode","type":"\"outside\" | \"floating\" | \"inside\" | undefined","required":false,"description":"Label rendering mode."},{"name":"labelPosition","type":"\"left\" | \"center\" | \"right\" | undefined","required":false,"description":"Sets the text alignment of the label."},{"name":"layout","type":"FieldLayout | undefined","required":false,"description":"How the label and the input sit together: `'vertical'`, `'horizontal'` (50/50),\n`'auto'`, `'label-fill'` (the label takes the free space, the input keeps\nits size), `'input-fill'` (the other way round), or a two-word ratio\npattern like `'xx xxxxx'`."},{"name":"loading","type":"boolean | undefined","required":false,"default":"false","description":"Sets the component in a loading state, usually triggering some visual styles."},{"name":"mask","type":"MaskInputOptions | undefined","required":false,"description":"The mask to be applied to the input.\nPlease visit https://beholdr.github.io/maska/v3 for syntax examples."},{"name":"modelValue","type":"string | null | undefined","required":false,"description":"Used by v-model."},{"name":"name","type":"string | undefined","required":false,"description":"Defines the name of the input."},{"name":"nullValue","type":"E | undefined","required":false,"description":"What the field emits once the user empties it (typing it empty, the\nclear button, a mask with nothing in it): `'null'` emits `null`, `'string'` emits `''`.\nUnset, the app's `formControls.textInputNullValue` applies (`'null'` by\ndefault). Also types the `update:modelValue` payload: with `'string'`\nit is `string`."},{"name":"persistentHint","type":"boolean | undefined","required":false,"default":"false","description":"Keeps the hint displayed."},{"name":"placeholder","type":"string | undefined","required":false,"description":"String displayed when there's no data."},{"name":"prepend:icon","type":"string | undefined","required":false,"description":"Name of the icon to be added at the start of the input."},{"name":"pt","type":"PtMap<BbTextInputPtPart, BbTextInputPtState> | undefined","required":false,"description":"Passthrough, object form: `{ box: '…', 'box:errors': '…' }` — the same\nkeys as the `pt:*` attributes without the prefix. See the `pt:<part>` row."},{"name":"pt:box","type":"PtValue | undefined","required":false},{"name":"pt:box:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:box:disabled","type":"PtValue | undefined","required":false},{"name":"pt:box:errors","type":"PtValue | undefined","required":false},{"name":"pt:box:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:box:loading","type":"PtValue | undefined","required":false},{"name":"pt:box:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:box:readonly","type":"PtValue | undefined","required":false},{"name":"pt:box:warnings","type":"PtValue | undefined","required":false},{"name":"pt:clear","type":"PtValue | undefined","required":false},{"name":"pt:clear:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:clear:disabled","type":"PtValue | undefined","required":false},{"name":"pt:clear:errors","type":"PtValue | undefined","required":false},{"name":"pt:clear:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:clear:loading","type":"PtValue | undefined","required":false},{"name":"pt:clear:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:clear:readonly","type":"PtValue | undefined","required":false},{"name":"pt:clear:warnings","type":"PtValue | undefined","required":false},{"name":"pt:counter","type":"PtValue | undefined","required":false},{"name":"pt:counter:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:counter:disabled","type":"PtValue | undefined","required":false},{"name":"pt:counter:errors","type":"PtValue | undefined","required":false},{"name":"pt:counter:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:counter:loading","type":"PtValue | undefined","required":false},{"name":"pt:counter:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:counter:readonly","type":"PtValue | undefined","required":false},{"name":"pt:counter:warnings","type":"PtValue | undefined","required":false},{"name":"pt:description","type":"PtValue | undefined","required":false},{"name":"pt:description:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:description:disabled","type":"PtValue | undefined","required":false},{"name":"pt:description:errors","type":"PtValue | undefined","required":false},{"name":"pt:description:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:description:loading","type":"PtValue | undefined","required":false},{"name":"pt:description:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:description:readonly","type":"PtValue | undefined","required":false},{"name":"pt:description:warnings","type":"PtValue | undefined","required":false},{"name":"pt:hint","type":"PtValue | undefined","required":false},{"name":"pt:hint:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:hint:disabled","type":"PtValue | undefined","required":false},{"name":"pt:hint:errors","type":"PtValue | undefined","required":false},{"name":"pt:hint:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:hint:loading","type":"PtValue | undefined","required":false},{"name":"pt:hint:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:hint:readonly","type":"PtValue | undefined","required":false},{"name":"pt:hint:warnings","type":"PtValue | undefined","required":false},{"name":"pt:icon","type":"PtValue | undefined","required":false},{"name":"pt:icon:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:icon:disabled","type":"PtValue | undefined","required":false},{"name":"pt:icon:errors","type":"PtValue | undefined","required":false},{"name":"pt:icon:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:icon:loading","type":"PtValue | undefined","required":false},{"name":"pt:icon:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:icon:readonly","type":"PtValue | undefined","required":false},{"name":"pt:icon:warnings","type":"PtValue | undefined","required":false},{"name":"pt:input","type":"PtValue | undefined","required":false},{"name":"pt:input:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:input:disabled","type":"PtValue | undefined","required":false},{"name":"pt:input:errors","type":"PtValue | undefined","required":false},{"name":"pt:input:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:input:loading","type":"PtValue | undefined","required":false},{"name":"pt:input:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:input:readonly","type":"PtValue | undefined","required":false},{"name":"pt:input:warnings","type":"PtValue | undefined","required":false},{"name":"pt:label","type":"PtValue | undefined","required":false},{"name":"pt:label:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:label:disabled","type":"PtValue | undefined","required":false},{"name":"pt:label:errors","type":"PtValue | undefined","required":false},{"name":"pt:label:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:label:loading","type":"PtValue | undefined","required":false},{"name":"pt:label:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:label:readonly","type":"PtValue | undefined","required":false},{"name":"pt:label:warnings","type":"PtValue | undefined","required":false},{"name":"pt:message","type":"PtValue | undefined","required":false},{"name":"pt:message:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:message:disabled","type":"PtValue | undefined","required":false},{"name":"pt:message:errors","type":"PtValue | undefined","required":false},{"name":"pt:message:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:message:loading","type":"PtValue | undefined","required":false},{"name":"pt:message:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:message:readonly","type":"PtValue | undefined","required":false},{"name":"pt:message:warnings","type":"PtValue | undefined","required":false},{"name":"pt:prefix","type":"PtValue | undefined","required":false},{"name":"pt:prefix:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:prefix:disabled","type":"PtValue | undefined","required":false},{"name":"pt:prefix:errors","type":"PtValue | undefined","required":false},{"name":"pt:prefix:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:prefix:loading","type":"PtValue | undefined","required":false},{"name":"pt:prefix:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:prefix:readonly","type":"PtValue | undefined","required":false},{"name":"pt:prefix:warnings","type":"PtValue | undefined","required":false},{"name":"pt:root","type":"PtValue | undefined","required":false},{"name":"pt:root:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:root:disabled","type":"PtValue | undefined","required":false},{"name":"pt:root:errors","type":"PtValue | undefined","required":false},{"name":"pt:root:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:root:loading","type":"PtValue | undefined","required":false},{"name":"pt:root:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:root:readonly","type":"PtValue | undefined","required":false},{"name":"pt:root:warnings","type":"PtValue | undefined","required":false},{"name":"pt:spinner","type":"PtValue | undefined","required":false},{"name":"pt:spinner:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:spinner:disabled","type":"PtValue | undefined","required":false},{"name":"pt:spinner:errors","type":"PtValue | undefined","required":false},{"name":"pt:spinner:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:spinner:loading","type":"PtValue | undefined","required":false},{"name":"pt:spinner:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:spinner:readonly","type":"PtValue | undefined","required":false},{"name":"pt:spinner:warnings","type":"PtValue | undefined","required":false},{"name":"pt:suffix","type":"PtValue | undefined","required":false},{"name":"pt:suffix:atLimit","type":"PtValue | undefined","required":false},{"name":"pt:suffix:disabled","type":"PtValue | undefined","required":false},{"name":"pt:suffix:errors","type":"PtValue | undefined","required":false},{"name":"pt:suffix:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:suffix:loading","type":"PtValue | undefined","required":false},{"name":"pt:suffix:nearLimit","type":"PtValue | undefined","required":false},{"name":"pt:suffix:readonly","type":"PtValue | undefined","required":false},{"name":"pt:suffix:warnings","type":"PtValue | undefined","required":false},{"name":"readonly","type":"boolean | undefined","required":false,"default":"false","description":"Sets the input in a readonly state."},{"name":"required","type":"boolean | undefined","required":false,"default":"false","description":"Sets the input as required."},{"name":"reverse","type":"boolean | undefined","required":false,"default":"false","description":"Reverses the layout. Applicable in every direction the order of the label and\nthe input is swapped."},{"name":"rules","type":"RuleExpression<string | null>","required":false,"description":"vee-validate rules for this field. Only inside a `BbForm`."},{"name":"type","type":"\"text\" | \"search\" | \"tel\" | \"url\" | \"email\" | \"password\" | undefined","required":false,"default":"\"text\"","description":"Type of the input. Restricted to the textual input types this component\nsupports — use `BbNumberInput` for numbers and `BbDatePickerInput` for dates."},{"name":"validationLabel","type":"string | undefined","required":false,"description":"The field's name in validation messages (`{field}`): \"Email is not\nvalid\". Defaults to the `label` (or `legend`), then \"This field\"; the\nfield's `name` never shows. Set it when the label is not a good noun for\na sentence (an icon-only label, a question) or is hidden. Only inside a\n`BbForm`."},{"name":"validationMode","type":"ValidationMode | undefined","required":false,"values":["aggressive","balanced","lazy","submit-only","submit-live"],"description":"When this field checks itself while the user works: `aggressive` (every\nchange), `balanced` (on leave, then every change while it shows an\nerror), `lazy` (on leave only), `submit-only` (on submit only) or\n`submit-live` (on submit, then every change while it shows an error).\n\"Leave\" is blur for a text-like control, and focus leaving the whole\ncontrol for a picker or a group; a checkbox or switch commits on click.\nUnset, the enclosing `BbForm`'s `validation-mode` applies, then the app's\n`formControls.validationMode` (`'balanced'`). Only inside a `BbForm`."},{"name":"variant","type":"InputVariantType | undefined","required":false,"default":"'outline'","values":["outline","secondary","none","ghost"],"description":"Visual variant of the field box — the same names and tokens as the\n`BbButton` variants. Colours only: height, padding and border width are\nidentical across variants, so a form never reflows when one changes.\n`'ghost'` has no border in any state (errors and warnings show through\nthe icon and the messages); every variant keeps the focus ring.\nRegister extra names with the plugin's `inputVariants` option.\n\n`'none'` is a blank starting point: the field keeps its structure and\nbehaviour but takes no look, so your own classes don't fight a built-in\none. You then own hover, focus, disabled and the error / warning states.\nFine for a one-off; keep inline styling short, and register a real\nvariant (`inputVariants`) when the look recurs."},{"name":"warnings","type":"string | string[] | undefined","required":false,"description":"Warning messages to display beneath the field, in their own `aria-live`\nregion and amber (`--bb-text-warn`). A string or array; a non-empty list\nimplies the warning state. Errors suppress warnings when both are set.\nWhile displayed they are also referenced from the control's\n`aria-describedby`, after any errors and before the description/hint."}],"events":[{"name":"blur","signature":"(event: FocusEvent): void","description":"Emitted when the native input loses focus.\nForwards the original DOM `FocusEvent`."},{"name":"change","signature":"(event: Event): void","description":"Emitted when the native input fires a change event.\nForwards the original DOM `Event`."},{"name":"click","signature":"(event: MouseEvent): void","description":"Emitted when the input receives a click interaction.\nForwards the original DOM `MouseEvent`."},{"name":"compositionend","signature":"(event: CompositionEvent): void","description":"Emitted when a composition session ends (e.g. CJK IME confirmed).\nForwards the original DOM `CompositionEvent`."},{"name":"compositionstart","signature":"(event: CompositionEvent): void","description":"Emitted when a composition session starts (e.g. CJK IME begins).\nForwards the original DOM `CompositionEvent`."},{"name":"focus","signature":"(event: FocusEvent): void","description":"Emitted when the native input gains focus.\nForwards the original DOM `FocusEvent`."},{"name":"input","signature":"(event: Event): void","description":"Emitted on native input events from the text field.\nForwards the original DOM `Event`."},{"name":"keydown","signature":"(event: KeyboardEvent): void","description":"Emitted for keyboard interaction on the input.\nForwards the original DOM `KeyboardEvent`."},{"name":"keyup","signature":"(event: KeyboardEvent): void","description":"Emitted when a key is released over the input.\nForwards the original DOM `KeyboardEvent`."},{"name":"mousedown","signature":"(event: MouseEvent): void","description":"Emitted when a pointing device button is pressed over the input.\nForwards the original DOM `MouseEvent`."},{"name":"mouseup","signature":"(event: MouseEvent): void","description":"Emitted when a pointing device button is released over the input.\nForwards the original DOM `MouseEvent`."},{"name":"paste","signature":"(event: ClipboardEvent): void","description":"Emitted when content is pasted into the input.\nForwards the original DOM `ClipboardEvent`."},{"name":"update:modelValue","signature":"(value: string | NullValueOf<E>): void","description":"Emitted when the value changes. Carries the new string, or the empty\nvalue (`null-value`, else the app's, `null` by default) when emptied.\nWhen `mask` is set, emits the masked or unmasked string depending on `emitMasked`."}],"slots":[{"name":"append","type":"object","description":"Content rendered after the text input, at the end of the field box."},{"name":"append:outer","type":"object","description":"Content rendered after the entire text input control, outside the input chrome."},{"name":"description","type":"BbTextInputDescriptionSlotProps","fields":["text: string","hasErrors: boolean","hasWarnings: boolean"],"description":"Replaces the description text. Provided alone (no `description` prop) it still\nrenders the description region and wires it into `aria-describedby`."},{"name":"label","type":"BbTextInputLabelSlotProps","fields":["text: string","hasErrors: boolean","hasWarnings: boolean"],"description":"Replaces the default label text rendered above the input."},{"name":"prefix","type":"object","description":"Inline content rendered at the start of the input field area, before the typed text."},{"name":"prepend","type":"object","description":"Content rendered before the text input, at the start of the field box."},{"name":"prepend:outer","type":"object","description":"Content rendered before the entire text input control, outside the input chrome."},{"name":"suffix","type":"object","description":"Inline content rendered at the end of the input field area, after the typed text."}],"exposed":[],"models":[{"name":"modelValue","type":"string | null | undefined"}],"cssProps":[{"name":"--border-color","value":"per variant","selector":"pt:box","description":"The resting border, at the fixed --bb-border-w. Errors and warnings paint their frame over it, so `pt:box=\"[--border-color:…]\"` recolours the rest without hiding the state; a plain `border-*` utility on the base pt:box would hide it (ESLint `no-box-border-color`)."}],"pt":{"parts":[{"name":"root","description":"The field's outer container: the label, the box and the lines under it."},{"name":"label","description":"The label text above the box (the `label` prop)."},{"name":"description","description":"The muted line under the label (the `description` prop)."},{"name":"message","description":"The errors / warnings line under the box. A node of its own: it can show at the same time as `hint`."},{"name":"hint","description":"The helper line (the `hint` prop), shown on focus, or always with `persistent-hint`."},{"name":"box","description":"The bordered box around the input — border, background and radius; the `variant` paints here."},{"name":"input","description":"The native input element inside the box."},{"name":"icon","description":"The content icons, prepend and append — a broadcast. Chrome (the clear ✕, a chevron, the error / warning glyph) is never in it."},{"name":"spinner","description":"The spinner inside the box while `loading`."},{"name":"prefix","description":"The `#prefix` slot's wrapper, inside the box before the input."},{"name":"suffix","description":"The `#suffix` slot's wrapper, inside the box after the input."},{"name":"clear","description":"The ✕ that empties this control (`clearable`) — one node, never a chip's own ✕."},{"name":"counter","description":"The character count at the end of the hint row (`counter`): `42`, or `42 / 140` with `maxlength`."}],"states":[{"name":"hasValue","description":"Component-wide: the control holds a value, by its own rule (`0` counts on `BbNumberInput`, `''` on `BbColorInput`)."},{"name":"nearLimit","description":"Component-wide: with `counter` and `maxlength`, the value is at 90 % of the limit or more, and still below it."},{"name":"atLimit","description":"Component-wide: with `counter` and `maxlength`, the value has reached the limit."},{"name":"readonly","description":"Component-wide: the control is `readonly` — shown, focusable, not editable."},{"name":"disabled","description":"Component-wide: the control is `disabled`."},{"name":"warnings","description":"Component-wide: the control is in its warning state (`warnings` / `has-warnings`) and not in an error state — errors win, so the two are never on together."},{"name":"errors","description":"Component-wide: the control is in its error state (`errors` / `has-errors`, or its validation) — the message line and the box turn red."},{"name":"loading","description":"Component-wide: `loading` is on; the box shows its `spinner`."}]},"tree":{"bindings":[{"part":"controlAttrs","target":"input.bb-text-input__input"},{"part":"input","target":"input.bb-text-input__input"}],"nodes":[{"name":"CommonField","kind":"internal","vocabulary":"BbTextInput","bindings":[{"part":"root","target":"div.bb-field"},{"part":"label","target":"component"},{"part":"description","target":"span.bb-field__description"},{"part":"hint","target":"span.bb-field__hint"},{"part":"counter","target":"span.bb-field__counter"},{"part":"message","target":"div.bb-field__message"}],"cssProps":[{"name":"--ctrl-line","documented":true,"readBy":["bb-field__label","bb-field__input-wrapper"]}],"children":[{"name":"BbAsterisk","kind":"public"}]},{"name":"CommonFieldInput","kind":"internal","vocabulary":"BbTextInput","bindings":[{"part":"box","target":"span.bb-field-input__box"},{"part":"prefix","target":"span.bb-field-input__prefix"},{"part":"icon","target":"BbIcon"},{"part":"clear","target":"ClearableButton"},{"part":"spinner","target":"BbSpinner"},{"part":"suffix","target":"span.bb-field-input__suffix"}],"cssProps":[{"name":"--bg","documented":true,"readBy":["bb-field-input","bb-field-input__box"]},{"name":"--bg-hover","documented":true,"readBy":["bb-field-input__box"]},{"name":"--bg-focus","documented":true,"readBy":["bb-field-input__box"]},{"name":"--bg-disabled","documented":true,"readBy":["bb-field-input__box"]},{"name":"--fg-disabled","documented":true,"readBy":["bb-field-input__box","bb-field-input__prefix","bb-field-input__suffix","bb-field-input__prepend-icon","bb-field-input__append-icon"]},{"name":"--border-color","documented":true,"readBy":["bb-field-input","bb-field-input__box"]},{"name":"--border-focus","documented":true,"readBy":["bb-field-input__box"]},{"name":"--ring-size","documented":true,"readBy":["bb-field-input__box"]},{"name":"--ring-color","documented":true,"readBy":["bb-field-input__box"]},{"name":"--elev","documented":true,"readBy":["bb-field-input__box"]},{"name":"--frost","documented":true,"readBy":["bb-field-input__box"]},{"name":"--inside-label-clearance","documented":true,"readBy":["bb-field-input__box","bb-field-input__prefix","bb-field-input__suffix"]}],"children":[{"name":"ErrorIcon","kind":"internal","cssProps":[{"name":"--accent","documented":false,"readBy":["bb-error-icon"]}],"children":[{"name":"BbIcon","kind":"public","cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]}]},{"name":"WarningIcon","kind":"internal","cssProps":[{"name":"--accent","documented":false,"readBy":["bb-warning-icon"]}],"children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]}]},{"name":"ClearableButton","kind":"internal","children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]}]},{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]},{"name":"BbSpinner","kind":"public","children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]}]}]}]},"css":{"classes":{"bb-text-input":["","__input"]},"locals":["--color-gray-200"]},"attrTargets":["div","input"],"removed":[{"name":"hasWarning","new":"hasWarnings","since":"3.0.0-beta.26","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"direction","new":"layout","since":"3.0.0-beta.33","migration":"ai/guides/migration/components/bb-text-input.md","silent":true,"fix":{"kind":"rename"}},{"name":"prepend-outer","new":"prepend:outer","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"append-outer","new":"append:outer","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"vid","new":null,"hint":"a display name (v2: `vid=\"Email address\"`) is now `validation-label`; a field path (3.0 betas: `vid=\"address.city\"`) is now `name` (brackets for a native post: `address[city]`). `check --fix` picks by the value","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"byValue","display":"validationLabel","key":"name"}},{"name":"validateOn","new":"validationMode","hint":"an array of events became one mode (`aggressive` | `balanced` | `lazy` | `submit-only` | `submit-live`). The old defaults (`['blur']`, `['inactive']`, a toggle's `['update:modelValue', 'change', 'blur']`) are `balanced`, the new default: delete the prop. A text field on `['update:modelValue']` is `validation-mode=\"aggressive\"`. Set it once on `<BbForm validation-mode>` instead of per field","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"manual"}},{"name":"focus","new":null,"surface":"method","hint":"no template-ref API in v3. Reach the <input> through pt: `:pt=\"{ input: { attrs: { ref: (el) => (input = el) } } }\"`, then `input.focus()` on that element; `autofocus` for focus on mount","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-text-input.md","silent":true,"fix":{"kind":"manual"}},{"name":"blur","new":null,"surface":"method","hint":"no template-ref API in v3. Reach the <input> through pt: `:pt=\"{ input: { attrs: { ref: (el) => (input = el) } } }\"`, then `input.blur()` on that element; `autofocus` for focus on mount","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-text-input.md","silent":true,"fix":{"kind":"manual"}},{"name":"select","new":null,"surface":"method","hint":"no template-ref API in v3. Reach the <input> through pt: `:pt=\"{ input: { attrs: { ref: (el) => (input = el) } } }\"`, then `input.select()` on that element; `autofocus` for focus on mount","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-text-input.md","silent":true,"fix":{"kind":"manual"}}],"renamed":[{"from":"hasWarning","to":"hasWarnings","since":"3.0.0-beta.26","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"direction","to":"layout","since":"3.0.0-beta.33","migration":"ai/guides/migration/components/bb-text-input.md","fix":{"kind":"rename"}},{"from":"prepend-outer","to":"prepend:outer","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"append-outer","to":"append:outer","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"validateOn","to":"validationMode","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"manual"}}]},
504
505
  {"name":"BbTimePicker","group":"Overlay","description":"Opens hour/minute(/second) columns in a popover on a trigger you own — the time analog of BbDatePicker; also the v-bb-time directive.","referenceOnly":false,"hasGuide":true,"contract":"ai/BbTimePicker.md","source":"ai/source/BbTimePicker.md","props":[{"name":"activator","type":"ElementOrComponentRef | undefined","required":false,"description":"External activator element or component ref. When provided, the `activator`\nslot is not rendered and click + ARIA are attached programmatically to the\nreferenced element — mirroring `BbDatePicker`."},{"name":"activeSegment","type":"BbTimePickerSegment | undefined","required":false,"values":["start","end"],"description":"Which end the columns edit in range mode (`v-model:active-segment`).\nStandalone use manages this internally via the in-panel toggle; a host can\ndrive it. Ignored outside `range`."},{"name":"adaptive","type":"boolean | undefined","required":false,"default":"`config.adaptive` (`true`)","description":"On mobile, open in a bottom off-canvas sheet instead of a floating popover.\nWhen unset, falls back to the global `config.adaptive`."},{"name":"ampm","type":"boolean | undefined","required":false,"default":"false","description":"12-hour display with an AM/PM column; emitted values stay 24-hour."},{"name":"anchor","type":"ElementOrComponentRef | undefined","required":false,"description":"Element or component ref the popover positions itself relative to.\nDefaults to the activator when omitted (anchor to a larger row while a\nsmaller element stays the click target)."},{"name":"boundary","type":"ElementOrComponentRefOrSelector | undefined","required":false,"description":"Constrains the popover within a bounding element or CSS selector."},{"name":"disabled","type":"boolean | undefined","required":false,"default":"false","description":"Disables the activator and the columns."},{"name":"disableFlip","type":"boolean | undefined","required":false,"default":"false","description":"Disable the automatic flip to the opposite side on overflow."},{"name":"eager","type":"boolean | undefined","required":false,"default":"false","description":"Render popover content before it is first shown."},{"name":"label","type":"string | undefined","required":false,"description":"Accessible label. The activator is named by it followed by the\nactivator's own text (\"Due date 12 Sep\"), through `aria-labelledby`."},{"name":"max","type":"string | undefined","required":false,"description":"Maximum selectable time in `HH:mm` format. Values outside the pattern\nthrow during setup to surface configuration mistakes. The columns\ndisable the entries no in-range time can use, as the calendar disables\nits days; a typed value (or an hour picked beside a minute out of range\nfor it) is clamped with a `disabled_time` error."},{"name":"min","type":"string | undefined","required":false,"description":"Minimum selectable time in `HH:mm` format. Values outside the pattern\nthrow during setup to surface configuration mistakes. The columns\ndisable the entries no in-range time can use, as the calendar disables\nits days; a typed value (or an hour picked beside a minute out of range\nfor it) is clamped with a `disabled_time` error."},{"name":"modelValue","type":"string | string[] | null","required":true,"description":"v-model value: `null` for empty, a 24-hour `HH:mm` (or `HH:mm:ss` with\n`seconds`) string, or a two-element `[start, end]` array when `range` is true."},{"name":"offCanvasProps","type":"Partial<BbOffCanvasProps> | undefined","required":false,"description":"Props for the phone sheet. A `pt` inside it, object or colon keys, styles\nonly that sheet.\n\nExtra props forwarded to the `BbOffCanvas` sheet when `adaptive` is active on\nmobile (e.g. `title`, `size`, `persistent`). Spread over the defaults: the\nsheet is `draggable` (the time wheels never drag it) and hides its ✕\n(picking, backdrop, Escape and drag close it); pass `{ hideClose: false }`\nto bring the ✕ back.\n\nA `pt` inside it styles ONLY the sheet, in `BbOffCanvas`'s part words\n(`root`, `header`, `title`, `description`, `content`, `footer`, `close`;\nstate `open`), object (`{ pt: { header: '…' } }`) or colon keys\n(`{ 'pt:header': '…' }`) alike. It merges after what this component\nforwards to its sheet, so it wins a conflict and drops nothing — see the\npassthrough guide § Inside the sheet.\n\nFor this component it is the only way to style the sheet's header,\ntitle and ✕: none of its own parts reach inside the sheet."},{"name":"offset","type":"number | undefined","required":false,"default":"4","description":"Space the popover keeps from the activator."},{"name":"padding","type":"number | undefined","required":false,"description":"Minimum empty space to keep from the edge of the page."},{"name":"placement","type":"Placement | undefined","required":false,"values":["top","bottom","left","right","top-start","top-end","right-start","right-end","bottom-start","bottom-end","left-start","left-end"],"description":"Position of the popover relative to the activator/anchor."},{"name":"pt","type":"PtMap<BbTimePickerPtPart, BbTimePickerPtState> | undefined","required":false,"description":"Passthrough, object form: the same keys as the `pt:*` attributes\nwithout the prefix. See the `pt:<part>` row."},{"name":"pt:cellColumnHeader","type":"PtValue | undefined","required":false},{"name":"pt:cellColumnHeader:disabled","type":"PtValue | undefined","required":false},{"name":"pt:cellColumnHeader:open","type":"PtValue | undefined","required":false},{"name":"pt:cellColumnHeader:selected","type":"PtValue | undefined","required":false},{"name":"pt:header","type":"PtValue | undefined","required":false},{"name":"pt:header:disabled","type":"PtValue | undefined","required":false},{"name":"pt:header:open","type":"PtValue | undefined","required":false},{"name":"pt:header:selected","type":"PtValue | undefined","required":false},{"name":"pt:item","type":"PtValue | undefined","required":false},{"name":"pt:item:disabled","type":"PtValue | undefined","required":false},{"name":"pt:item:open","type":"PtValue | undefined","required":false},{"name":"pt:item:selected","type":"PtValue | undefined","required":false},{"name":"pt:panel","type":"PtValue | undefined","required":false},{"name":"pt:panel:disabled","type":"PtValue | undefined","required":false},{"name":"pt:panel:open","type":"PtValue | undefined","required":false},{"name":"pt:panel:selected","type":"PtValue | undefined","required":false},{"name":"pt:root","type":"PtValue | undefined","required":false},{"name":"pt:root:disabled","type":"PtValue | undefined","required":false},{"name":"pt:root:open","type":"PtValue | undefined","required":false},{"name":"pt:root:selected","type":"PtValue | undefined","required":false},{"name":"pt:sheet","type":"PtValue | undefined","required":false},{"name":"pt:sheet:disabled","type":"PtValue | undefined","required":false},{"name":"pt:sheet:open","type":"PtValue | undefined","required":false},{"name":"pt:sheet:selected","type":"PtValue | undefined","required":false},{"name":"range","type":"boolean | undefined","required":false,"default":"false","description":"Range selection: the value is a two-element `[start, end]` array."},{"name":"readonly","type":"boolean | undefined","required":false,"default":"false","description":"Prevents opening while keeping the activator visible."},{"name":"seconds","type":"boolean | undefined","required":false,"default":"false","description":"Adds the seconds column."},{"name":"step","type":"number | undefined","required":false,"default":"1","description":"Minute-column granularity and arrow stepping."},{"name":"transitionDuration","type":"number | undefined","required":false,"default":"250","description":"Popover/sheet transition duration in milliseconds."}],"events":[{"name":"error","signature":"(error: TimePickerInputError): void","description":"Emitted on every normalization (clamped time)."},{"name":"hidden","signature":"(): void","description":"Emitted once the time panel has finished closing."},{"name":"hide","signature":"(): void","description":"Emitted as soon as the time panel starts to close."},{"name":"show","signature":"(): void","description":"Emitted as soon as the time panel (the popover, or the sheet on a phone) starts to open."},{"name":"shown","signature":"(): void","description":"Emitted once the time panel is open and its open transition has finished."},{"name":"time-pick","signature":"(payload: { unit: TimeUnit; value: string; }): void","description":"Relay of the raw column pick, before this component combines it into the\nvalue. A host binds this to run its own engine; clean consumers ignore it."},{"name":"update:activeSegment","signature":"(value: BbTimePickerSegment): void","description":"The active range end changed (range only)."},{"name":"update:modelValue","signature":"(value: string | string[] | null): void","description":"Emitted when the selected time changes (single/range/null)."}],"slots":[{"name":"activator","type":"BbTimePickerActivatorSlotProps","fields":["props: { ref: (el: unknown) => void; 'aria-haspopup': \"dialog\"; 'aria-expanded': \"true\" | \"false\"; 'aria-labelledby': string; }","anchorProps: { ref: (el: unknown) => void; }","open: boolean","value: string | string[] | null","disabled: boolean"],"description":"Custom activator element. Apply `v-bind=\"props\"` to your trigger."}],"exposed":[],"models":[{"name":"activeSegment","type":"BbTimePickerSegment | undefined"},{"name":"modelValue","type":"string | string[] | null"}],"cssProps":[{"name":"--bg","value":"var(--bb-panel)","selector":".bb-time-picker__segment--active"}],"pt":{"parts":[{"name":"root","description":"The floating element — an invisible positioning wrapper; a `class` on the component lands here. No node on the phone sheet: style what you see with `panel`."},{"name":"panel","description":"The time surface you see — the popover's painted bubble on desktop, the sheet itself on a phone."},{"name":"sheet","description":"The bottom sheet on a phone only (the `BbOffCanvas` root). Applied after `panel`, so it wins a conflict there."},{"name":"header","description":"The readout above the columns — the picked time as the fields show it; the calendar's heading on the date pickers."},{"name":"cellColumnHeader","description":"The letters above each column (`HH`, `MM`, `SS`) — a broadcast, like the calendar's weekday letters."},{"name":"item","description":"One entry in a column (hour, minute, second, AM / PM) — a broadcast resolved per entry."}],"states":[{"name":"selected","description":"Per node, on `item`: the current value's entry in each column."},{"name":"disabled","description":"Component-wide while the picker is `disabled`. Also per node, on `item`: an entry outside `min` / `max` — an hour with no minute in range, a minute out of range for the selected hour, an AM / PM half with no hour in range. Like the calendar's days: shown, not pickable."},{"name":"open","description":"Component-wide: the picker is showing."}]},"tree":{"bindings":[{"part":"panel","target":"div"},{"part":"panel","target":"CommonPopover"}],"forwards":[{"to":"BbOffCanvas","mapping":"{ panel: 'root', sheet: 'root' }"}],"nodes":[{"name":"CommonTimeSelector","kind":"internal","vocabulary":"BbTimePicker","bindings":[{"part":"header","target":"div.bb-time-selector__header"},{"part":"cellColumnHeader","target":"div.bb-time-selector__cell-column-header"},{"part":"item","target":"BbBaseButton"}],"cssProps":[{"name":"--time-row-h","documented":false,"readBy":["bb-time-selector__item","bb-time-selector__scroll"]},{"name":"--time-col-w","documented":false,"readBy":["bb-time-selector__column"]},{"name":"--time-mark","documented":true,"readBy":["bb-time-selector__item"]}],"children":[{"name":"BbBaseButton","kind":"public","vocabulary":"BbBaseButton","bindings":[{"part":"root","target":"RouterComponent"},{"part":"root","target":"a"},{"part":"root","target":"component"}],"children":[{"name":"RouterComponent","kind":"internal"}]}]},{"name":"BbOffCanvas","kind":"public","vocabulary":"BbOffCanvas","bindings":[{"part":"header","target":"div.bb-offcanvas__header"},{"part":"title","target":"span.bb-offcanvas__title"},{"part":"description","target":"p.bb-offcanvas__description"},{"part":"close","target":"CloseButton"},{"part":"content","target":"div.bb-offcanvas__content"},{"part":"footer","target":"div.bb-offcanvas__footer"}],"cssProps":[{"name":"--translate-x","documented":false,"readBy":["bb-offcanvas"]},{"name":"--translate-y","documented":false,"readBy":["bb-offcanvas"]},{"name":"--translate","documented":false,"readBy":["bb-offcanvas"]},{"name":"--stack-x","documented":true,"readBy":["bb-offcanvas"]},{"name":"--stack-y","documented":false,"readBy":["bb-offcanvas"]},{"name":"--stack-fill","documented":true,"readBy":["bb-offcanvas","bb-offcanvas--right","bb-offcanvas--left","bb-offcanvas--top","bb-offcanvas--bottom"]},{"name":"--stack-transition-duration","documented":true,"readBy":["bb-offcanvas"]},{"name":"--px","documented":true,"readBy":["bb-offcanvas__header","bb-close-button","bb-offcanvas__content","bb-offcanvas__footer"]},{"name":"--py","documented":false,"readBy":["bb-offcanvas__footer","bb-offcanvas__content","bb-offcanvas__header","bb-close-button"]},{"name":"--handle-w","documented":true,"readBy":["bb-offcanvas__handle"]},{"name":"--handle-h","documented":true,"readBy":["bb-offcanvas__handle"]},{"name":"--handle-bg","documented":true,"readBy":["bb-offcanvas__handle"]},{"name":"--transition-timing-function","documented":false,"readBy":["bb-offcanvas","bb-offcanvas--open"]},{"name":"--bg","documented":false,"readBy":["bb-offcanvas"]},{"name":"--fg","documented":false,"readBy":["bb-offcanvas"]},{"name":"--safe-top","documented":true,"readBy":["bb-offcanvas","bb-offcanvas--left","bb-offcanvas--right","bb-offcanvas--top","bb-offcanvas--fullscreen"]},{"name":"--safe-right","documented":false,"readBy":["bb-offcanvas","bb-offcanvas--right","bb-offcanvas--top","bb-offcanvas--bottom","bb-offcanvas--fullscreen"]},{"name":"--safe-bottom","documented":false,"readBy":["bb-offcanvas","bb-offcanvas--left","bb-offcanvas--right","bb-offcanvas--bottom","bb-offcanvas--fullscreen"]},{"name":"--safe-left","documented":false,"readBy":["bb-offcanvas","bb-offcanvas--left","bb-offcanvas--top","bb-offcanvas--bottom","bb-offcanvas--fullscreen"]},{"name":"--inset-top","documented":false,"readBy":["bb-offcanvas__content","bb-offcanvas__header"]},{"name":"--inset-right","documented":false,"readBy":["bb-offcanvas__header","bb-offcanvas__content","bb-offcanvas__footer"]},{"name":"--inset-bottom","documented":false,"readBy":["bb-offcanvas__footer","bb-offcanvas__content"]},{"name":"--inset-left","documented":false,"readBy":["bb-offcanvas__header","bb-offcanvas__content","bb-offcanvas__footer"]},{"name":"--close-size","documented":true,"readBy":["bb-close-button"]}],"children":[{"name":"CloseButton","kind":"internal","cssProps":[{"name":"--size","documented":true,"readBy":["bb-close-button"]},{"name":"--p","documented":true,"readBy":["bb-close-button"]}]}]},{"name":"CommonPopover","kind":"internal"}]},"css":{"classes":{"bb-time-picker":["","__panel","__panel--sheet","__segment","__segment--active","__segments","__sheet"]},"locals":["--bg","--color-gray-200"]}},
505
506
  {"name":"BbTimePickerInput","group":"Inputs","description":"Segmented time field with hour/minute columns; 24-hour string model.","referenceOnly":false,"hasGuide":true,"contract":"ai/BbTimePickerInput.md","source":"ai/source/BbTimePickerInput.md","props":[{"name":"adaptive","type":"boolean | undefined","required":false,"default":"`config.adaptive` (`true`)","description":"On mobile the time columns open inside a bottom off-canvas sheet instead\nof a floating popover. When unset, falls back to the global\n`config.adaptive`."},{"name":"ampm","type":"boolean | undefined","required":false,"default":"false","description":"12-hour display with an AM/PM segment. Purely a field-composition\nconcern: the model stays 24-hour. Type `A`/`P` (or ArrowUp/Down) to set\nthe meridiem."},{"name":"append:icon","type":"string | undefined","required":false,"description":"Name of the icon to be added at the end of the input."},{"name":"autocomplete","type":"string | undefined","required":false,"default":"\"off\"","description":"Guides the browser as to the type of information expected in the field."},{"name":"autofocus","type":"Booleanish | undefined","required":false,"description":"Sets autofocus on page load."},{"name":"clearable","type":"boolean | undefined","required":false,"default":"false","description":"Displays a clear button when the input has a value and is being interacted with."},{"name":"compact","type":"boolean | undefined","required":false,"default":"false","description":"Compact density. Swaps `--bb-input-h`, `--bb-input-py` and\n`--bb-label-spacing-y` for their `-compact` twins on the field, so a\n`--bb-input-h` you set on the component is ignored while `compact` is on:\nsize a compact field with `--bb-input-h-compact` (and\n`--bb-input-py-compact`) instead."},{"name":"description","type":"string | undefined","required":false,"description":"Descriptive text displayed below the label and above the input. Always\nvisible and linked to the input via `aria-describedby` (after any\n`errors` / `warnings`, before the `hint`)."},{"name":"disabled","type":"boolean | undefined","required":false,"default":"false","description":"Disables the component."},{"name":"disableWriting","type":"boolean | \"mobile\" | \"desktop\" | undefined","required":false,"default":"false","description":"Disables typing into the input.\nUse `'mobile'` / `'desktop'` to disable typing on one platform only."},{"name":"errors","type":"string | string[] | undefined","required":false,"description":"Can be a string or an array of string containing the messages to display.\nThey render in an `aria-live=\"polite\"` region (announced when they appear)\nand, while the list is non-empty, are referenced FIRST from the segment\ninputs' `aria-describedby`, so the reason the field is invalid is re-read\nwhenever a segment regains focus."},{"name":"formless","type":"boolean | undefined","required":false,"default":"false","description":"Keep this control out of the enclosing `BbForm` entirely: not submitted,\nnot dirty, not reset, not validated. For a control that is not form data\n(a filter, a \"show advanced\" switch)."},{"name":"hasErrors","type":"boolean | undefined","required":false,"default":"false","description":"Define if the component should be in an error state.\nIt usually attaches a CSS class for styling purposes."},{"name":"hasWarnings","type":"boolean | undefined","required":false,"default":"false","description":"Define if the component should be in a warning state.\nSame chrome as errors with `--bb-warn`; errors take priority."},{"name":"hideLabel","type":"boolean | undefined","required":false,"default":"false","description":"Visually hides the label of the input while maintaining accessibility."},{"name":"hint","type":"string | undefined","required":false,"description":"Text box to be displayed near the input, usually to indicate instructions."},{"name":"id","type":"string | undefined","required":false,"description":"The `id` of the native control; the label's `for` and the description\nand message ids derive from it. Generated when omitted."},{"name":"inputAlign","type":"FieldCrossAlign | undefined","required":false,"values":["top","center","bottom"],"description":"Vertical position of the control in a side-by-side row; not\n`inputPosition`, the horizontal one. Omitted, the control's first line\nmeets the label's."},{"name":"label","type":"string","required":true,"description":"Text content of the label of the element."},{"name":"labelAlign","type":"FieldCrossAlign | undefined","required":false,"values":["top","center","bottom"],"description":"Vertical position of the label block in a side-by-side row; not\n`labelPosition`, the horizontal one. Omitted, the label's first line\nmeets the control's."},{"name":"labelMode","type":"\"outside\" | \"floating\" | \"inside\" | undefined","required":false,"description":"Label rendering mode."},{"name":"labelPosition","type":"\"left\" | \"center\" | \"right\" | undefined","required":false,"description":"Sets the text alignment of the label."},{"name":"layout","type":"FieldLayout | undefined","required":false,"description":"How the label and the input sit together: `'vertical'`, `'horizontal'` (50/50),\n`'auto'`, `'label-fill'` (the label takes the free space, the input keeps\nits size), `'input-fill'` (the other way round), or a two-word ratio\npattern like `'xx xxxxx'`."},{"name":"loading","type":"boolean | undefined","required":false,"default":"false","description":"Sets the component in a loading state, usually triggering some visual styles."},{"name":"max","type":"string | undefined","required":false,"description":"Maximum selectable time in `HH:mm` format. Values outside the pattern\nthrow during setup to surface configuration mistakes. The columns\ndisable the entries no in-range time can use, as the calendar disables\nits days; a typed value (or an hour picked beside a minute out of range\nfor it) is clamped with a `disabled_time` error."},{"name":"min","type":"string | undefined","required":false,"description":"Minimum selectable time in `HH:mm` format. Values outside the pattern\nthrow during setup to surface configuration mistakes. The columns\ndisable the entries no in-range time can use, as the calendar disables\nits days; a typed value (or an hour picked beside a minute out of range\nfor it) is clamped with a `disabled_time` error."},{"name":"modelValue","type":"string | string[] | null | undefined","required":false,"description":"v-model value: `null` for empty, a 24-hour `HH:mm` (or `HH:mm:ss` with\n`seconds`) string, or a two-element array when `range` is true."},{"name":"name","type":"string | undefined","required":false,"description":"Defines the name of the input."},{"name":"offCanvasProps","type":"Partial<BbOffCanvasProps> | undefined","required":false,"description":"Props for the phone sheet. A `pt` inside it, object or colon keys, styles\nonly that sheet.\n\nExtra props forwarded to the `BbOffCanvas` sheet when `adaptive` is active on\nmobile (e.g. `title`, `size`, `persistent`). Spread over the defaults: the\nsheet is `draggable` (the time wheels never drag it) and hides its ✕\n(picking, backdrop, Escape and drag close it); pass `{ hideClose: false }`\nto bring the ✕ back.\n\nA `pt` inside it styles ONLY the sheet, in `BbOffCanvas`'s part words\n(`root`, `header`, `title`, `description`, `content`, `footer`, `close`;\nstate `open`), object (`{ pt: { header: '…' } }`) or colon keys\n(`{ 'pt:header': '…' }`) alike. It merges after what this component\nforwards to its sheet, so it wins a conflict and drops nothing — see the\npassthrough guide § Inside the sheet.\n\nFor this component it is the only way to style the sheet's header,\ntitle and ✕: none of its own parts reach inside the sheet."},{"name":"persistentHint","type":"boolean | undefined","required":false,"default":"false","description":"Keeps the hint displayed."},{"name":"placeholder","type":"string | undefined","required":false,"description":"String displayed when there's no data."},{"name":"prepend:icon","type":"string | undefined","required":false,"description":"Name of the icon to be added at the start of the input."},{"name":"pt","type":"PtMap<BbTimePickerInputPtPart, BbTimePickerInputPtState> | undefined","required":false,"description":"Passthrough, object form: the same keys as the `pt:*` attributes\nwithout the prefix. See the `pt:<part>` row."},{"name":"pt:activator","type":"PtValue | undefined","required":false},{"name":"pt:activator:disabled","type":"PtValue | undefined","required":false},{"name":"pt:activator:errors","type":"PtValue | undefined","required":false},{"name":"pt:activator:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:activator:loading","type":"PtValue | undefined","required":false},{"name":"pt:activator:open","type":"PtValue | undefined","required":false},{"name":"pt:activator:readonly","type":"PtValue | undefined","required":false},{"name":"pt:activator:selected","type":"PtValue | undefined","required":false},{"name":"pt:activator:warnings","type":"PtValue | undefined","required":false},{"name":"pt:box","type":"PtValue | undefined","required":false},{"name":"pt:box:disabled","type":"PtValue | undefined","required":false},{"name":"pt:box:errors","type":"PtValue | undefined","required":false},{"name":"pt:box:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:box:loading","type":"PtValue | undefined","required":false},{"name":"pt:box:open","type":"PtValue | undefined","required":false},{"name":"pt:box:readonly","type":"PtValue | undefined","required":false},{"name":"pt:box:selected","type":"PtValue | undefined","required":false},{"name":"pt:box:warnings","type":"PtValue | undefined","required":false},{"name":"pt:cellColumnHeader","type":"PtValue | undefined","required":false},{"name":"pt:cellColumnHeader:disabled","type":"PtValue | undefined","required":false},{"name":"pt:cellColumnHeader:errors","type":"PtValue | undefined","required":false},{"name":"pt:cellColumnHeader:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:cellColumnHeader:loading","type":"PtValue | undefined","required":false},{"name":"pt:cellColumnHeader:open","type":"PtValue | undefined","required":false},{"name":"pt:cellColumnHeader:readonly","type":"PtValue | undefined","required":false},{"name":"pt:cellColumnHeader:selected","type":"PtValue | undefined","required":false},{"name":"pt:cellColumnHeader:warnings","type":"PtValue | undefined","required":false},{"name":"pt:clear","type":"PtValue | undefined","required":false},{"name":"pt:clear:disabled","type":"PtValue | undefined","required":false},{"name":"pt:clear:errors","type":"PtValue | undefined","required":false},{"name":"pt:clear:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:clear:loading","type":"PtValue | undefined","required":false},{"name":"pt:clear:open","type":"PtValue | undefined","required":false},{"name":"pt:clear:readonly","type":"PtValue | undefined","required":false},{"name":"pt:clear:selected","type":"PtValue | undefined","required":false},{"name":"pt:clear:warnings","type":"PtValue | undefined","required":false},{"name":"pt:description","type":"PtValue | undefined","required":false},{"name":"pt:description:disabled","type":"PtValue | undefined","required":false},{"name":"pt:description:errors","type":"PtValue | undefined","required":false},{"name":"pt:description:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:description:loading","type":"PtValue | undefined","required":false},{"name":"pt:description:open","type":"PtValue | undefined","required":false},{"name":"pt:description:readonly","type":"PtValue | undefined","required":false},{"name":"pt:description:selected","type":"PtValue | undefined","required":false},{"name":"pt:description:warnings","type":"PtValue | undefined","required":false},{"name":"pt:header","type":"PtValue | undefined","required":false},{"name":"pt:header:disabled","type":"PtValue | undefined","required":false},{"name":"pt:header:errors","type":"PtValue | undefined","required":false},{"name":"pt:header:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:header:loading","type":"PtValue | undefined","required":false},{"name":"pt:header:open","type":"PtValue | undefined","required":false},{"name":"pt:header:readonly","type":"PtValue | undefined","required":false},{"name":"pt:header:selected","type":"PtValue | undefined","required":false},{"name":"pt:header:warnings","type":"PtValue | undefined","required":false},{"name":"pt:hint","type":"PtValue | undefined","required":false},{"name":"pt:hint:disabled","type":"PtValue | undefined","required":false},{"name":"pt:hint:errors","type":"PtValue | undefined","required":false},{"name":"pt:hint:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:hint:loading","type":"PtValue | undefined","required":false},{"name":"pt:hint:open","type":"PtValue | undefined","required":false},{"name":"pt:hint:readonly","type":"PtValue | undefined","required":false},{"name":"pt:hint:selected","type":"PtValue | undefined","required":false},{"name":"pt:hint:warnings","type":"PtValue | undefined","required":false},{"name":"pt:icon","type":"PtValue | undefined","required":false},{"name":"pt:icon:disabled","type":"PtValue | undefined","required":false},{"name":"pt:icon:errors","type":"PtValue | undefined","required":false},{"name":"pt:icon:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:icon:loading","type":"PtValue | undefined","required":false},{"name":"pt:icon:open","type":"PtValue | undefined","required":false},{"name":"pt:icon:readonly","type":"PtValue | undefined","required":false},{"name":"pt:icon:selected","type":"PtValue | undefined","required":false},{"name":"pt:icon:warnings","type":"PtValue | undefined","required":false},{"name":"pt:input","type":"PtValue | undefined","required":false},{"name":"pt:input:disabled","type":"PtValue | undefined","required":false},{"name":"pt:input:errors","type":"PtValue | undefined","required":false},{"name":"pt:input:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:input:loading","type":"PtValue | undefined","required":false},{"name":"pt:input:open","type":"PtValue | undefined","required":false},{"name":"pt:input:readonly","type":"PtValue | undefined","required":false},{"name":"pt:input:selected","type":"PtValue | undefined","required":false},{"name":"pt:input:warnings","type":"PtValue | undefined","required":false},{"name":"pt:item","type":"PtValue | undefined","required":false},{"name":"pt:item:disabled","type":"PtValue | undefined","required":false},{"name":"pt:item:errors","type":"PtValue | undefined","required":false},{"name":"pt:item:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:item:loading","type":"PtValue | undefined","required":false},{"name":"pt:item:open","type":"PtValue | undefined","required":false},{"name":"pt:item:readonly","type":"PtValue | undefined","required":false},{"name":"pt:item:selected","type":"PtValue | undefined","required":false},{"name":"pt:item:warnings","type":"PtValue | undefined","required":false},{"name":"pt:label","type":"PtValue | undefined","required":false},{"name":"pt:label:disabled","type":"PtValue | undefined","required":false},{"name":"pt:label:errors","type":"PtValue | undefined","required":false},{"name":"pt:label:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:label:loading","type":"PtValue | undefined","required":false},{"name":"pt:label:open","type":"PtValue | undefined","required":false},{"name":"pt:label:readonly","type":"PtValue | undefined","required":false},{"name":"pt:label:selected","type":"PtValue | undefined","required":false},{"name":"pt:label:warnings","type":"PtValue | undefined","required":false},{"name":"pt:message","type":"PtValue | undefined","required":false},{"name":"pt:message:disabled","type":"PtValue | undefined","required":false},{"name":"pt:message:errors","type":"PtValue | undefined","required":false},{"name":"pt:message:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:message:loading","type":"PtValue | undefined","required":false},{"name":"pt:message:open","type":"PtValue | undefined","required":false},{"name":"pt:message:readonly","type":"PtValue | undefined","required":false},{"name":"pt:message:selected","type":"PtValue | undefined","required":false},{"name":"pt:message:warnings","type":"PtValue | undefined","required":false},{"name":"pt:panel","type":"PtValue | undefined","required":false},{"name":"pt:panel:disabled","type":"PtValue | undefined","required":false},{"name":"pt:panel:errors","type":"PtValue | undefined","required":false},{"name":"pt:panel:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:panel:loading","type":"PtValue | undefined","required":false},{"name":"pt:panel:open","type":"PtValue | undefined","required":false},{"name":"pt:panel:readonly","type":"PtValue | undefined","required":false},{"name":"pt:panel:selected","type":"PtValue | undefined","required":false},{"name":"pt:panel:warnings","type":"PtValue | undefined","required":false},{"name":"pt:prefix","type":"PtValue | undefined","required":false},{"name":"pt:prefix:disabled","type":"PtValue | undefined","required":false},{"name":"pt:prefix:errors","type":"PtValue | undefined","required":false},{"name":"pt:prefix:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:prefix:loading","type":"PtValue | undefined","required":false},{"name":"pt:prefix:open","type":"PtValue | undefined","required":false},{"name":"pt:prefix:readonly","type":"PtValue | undefined","required":false},{"name":"pt:prefix:selected","type":"PtValue | undefined","required":false},{"name":"pt:prefix:warnings","type":"PtValue | undefined","required":false},{"name":"pt:root","type":"PtValue | undefined","required":false},{"name":"pt:root:disabled","type":"PtValue | undefined","required":false},{"name":"pt:root:errors","type":"PtValue | undefined","required":false},{"name":"pt:root:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:root:loading","type":"PtValue | undefined","required":false},{"name":"pt:root:open","type":"PtValue | undefined","required":false},{"name":"pt:root:readonly","type":"PtValue | undefined","required":false},{"name":"pt:root:selected","type":"PtValue | undefined","required":false},{"name":"pt:root:warnings","type":"PtValue | undefined","required":false},{"name":"pt:sheet","type":"PtValue | undefined","required":false},{"name":"pt:sheet:disabled","type":"PtValue | undefined","required":false},{"name":"pt:sheet:errors","type":"PtValue | undefined","required":false},{"name":"pt:sheet:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:sheet:loading","type":"PtValue | undefined","required":false},{"name":"pt:sheet:open","type":"PtValue | undefined","required":false},{"name":"pt:sheet:readonly","type":"PtValue | undefined","required":false},{"name":"pt:sheet:selected","type":"PtValue | undefined","required":false},{"name":"pt:sheet:warnings","type":"PtValue | undefined","required":false},{"name":"pt:spinner","type":"PtValue | undefined","required":false},{"name":"pt:spinner:disabled","type":"PtValue | undefined","required":false},{"name":"pt:spinner:errors","type":"PtValue | undefined","required":false},{"name":"pt:spinner:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:spinner:loading","type":"PtValue | undefined","required":false},{"name":"pt:spinner:open","type":"PtValue | undefined","required":false},{"name":"pt:spinner:readonly","type":"PtValue | undefined","required":false},{"name":"pt:spinner:selected","type":"PtValue | undefined","required":false},{"name":"pt:spinner:warnings","type":"PtValue | undefined","required":false},{"name":"pt:suffix","type":"PtValue | undefined","required":false},{"name":"pt:suffix:disabled","type":"PtValue | undefined","required":false},{"name":"pt:suffix:errors","type":"PtValue | undefined","required":false},{"name":"pt:suffix:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:suffix:loading","type":"PtValue | undefined","required":false},{"name":"pt:suffix:open","type":"PtValue | undefined","required":false},{"name":"pt:suffix:readonly","type":"PtValue | undefined","required":false},{"name":"pt:suffix:selected","type":"PtValue | undefined","required":false},{"name":"pt:suffix:warnings","type":"PtValue | undefined","required":false},{"name":"range","type":"boolean | undefined","required":false,"default":"false","description":"Range selection: v-model expects a two-element array `[start, end]`.\nAn inverted pair swaps on finalize with an `end_before_start` error."},{"name":"readonly","type":"boolean | undefined","required":false,"default":"false","description":"Sets the input in a readonly state."},{"name":"required","type":"boolean | undefined","required":false,"default":"false","description":"Sets the input as required."},{"name":"reverse","type":"boolean | undefined","required":false,"default":"false","description":"Reverses the layout: the order of the label and the input is swapped."},{"name":"rules","type":"RuleExpression<string | string[] | null>","required":false,"description":"vee-validate rules for this field. Only inside a `BbForm`."},{"name":"seconds","type":"boolean | undefined","required":false,"default":"false","description":"Adds the seconds segment. Without it an incoming value carrying seconds\ndisplays truncated and zeroes out on the next user commit."},{"name":"step","type":"number | undefined","required":false,"default":"1","description":"Minute granularity for the minute column and its arrow stepping.\nConstrains what the columns produce, never what typing accepts."},{"name":"transitionDuration","type":"number | undefined","required":false,"description":"Transition duration, in milliseconds, for the popover appearance."},{"name":"validationLabel","type":"string | undefined","required":false,"description":"The field's name in validation messages (`{field}`): \"Email is not\nvalid\". Defaults to the `label` (or `legend`), then \"This field\"; the\nfield's `name` never shows. Set it when the label is not a good noun for\na sentence (an icon-only label, a question) or is hidden. Only inside a\n`BbForm`."},{"name":"validationMode","type":"ValidationMode | undefined","required":false,"values":["aggressive","balanced","lazy","submit-only","submit-live"],"description":"When this field checks itself while the user works: `aggressive` (every\nchange), `balanced` (on leave, then every change while it shows an\nerror), `lazy` (on leave only), `submit-only` (on submit only) or\n`submit-live` (on submit, then every change while it shows an error).\n\"Leave\" is blur for a text-like control, and focus leaving the whole\ncontrol for a picker or a group; a checkbox or switch commits on click.\nUnset, the enclosing `BbForm`'s `validation-mode` applies, then the app's\n`formControls.validationMode` (`'balanced'`). Only inside a `BbForm`."},{"name":"variant","type":"InputVariantType | undefined","required":false,"default":"'outline'","values":["outline","secondary","none","ghost"],"description":"Visual variant of the field box — the same names and tokens as the\n`BbButton` variants. Colours only: height, padding and border width are\nidentical across variants, so a form never reflows when one changes.\n`'ghost'` has no border in any state (errors and warnings show through\nthe icon and the messages); every variant keeps the focus ring.\nRegister extra names with the plugin's `inputVariants` option.\n\n`'none'` is a blank starting point: the field keeps its structure and\nbehaviour but takes no look, so your own classes don't fight a built-in\none. You then own hover, focus, disabled and the error / warning states.\nFine for a one-off; keep inline styling short, and register a real\nvariant (`inputVariants`) when the look recurs."},{"name":"warnings","type":"string | string[] | undefined","required":false,"description":"Warning messages to display beneath the field, in their own `aria-live`\nregion and amber (`--bb-text-warn`). A string or array; a non-empty list\nimplies the warning state. Errors suppress warnings when both are set.\nWhile displayed they are also referenced from the control's\n`aria-describedby`, after any errors and before the description/hint."}],"events":[{"name":"active","signature":"(): void","description":"Emitted when the composite control receives focus."},{"name":"error","signature":"(error: TimePickerInputError): void","description":"Emitted on every normalization (clamped time, swapped range)."},{"name":"focus","signature":"(event: FocusEvent): void","description":"Emitted when a native text field inside the control gains focus."},{"name":"hidden","signature":"(): void","description":"Emitted once the time panel has finished closing."},{"name":"hide","signature":"(): void","description":"Emitted as soon as the time panel starts to close."},{"name":"inactive","signature":"(): void","description":"Emitted when focus/click moves outside the composite control."},{"name":"show","signature":"(): void","description":"Emitted as soon as the time panel (the popover, or the sheet on a phone) starts to open."},{"name":"shown","signature":"(): void","description":"Emitted once the time panel is open and its open transition has finished."},{"name":"update:modelValue","signature":"(value: string | string[] | null): void","description":"Emitted whenever the selected time changes. `null` for cleared values,\na `HH:mm(:ss)` string, or an array in range mode."}],"slots":[{"name":"append","type":"object","description":"Content rendered after the time fields (before the clock button)."},{"name":"append:outer","type":"object","description":"Content rendered after the entire control, outside the input chrome."},{"name":"description","type":"BbTimePickerInputDescriptionSlotProps","fields":["text: string","hasErrors: boolean","hasWarnings: boolean"],"description":"Replaces the description text. Provided alone (no `description` prop) it still\nrenders the description region and wires it into `aria-describedby`."},{"name":"label","type":"BbTimePickerInputLabelSlotProps","fields":["text: string","hasErrors: boolean","hasWarnings: boolean"],"description":"Replaces the default label text rendered above the input."},{"name":"prefix","type":"object","description":"Inline content at the start of the field area."},{"name":"prepend","type":"object","description":"Content rendered before the time fields, at the start of the field box."},{"name":"prepend:outer","type":"object","description":"Content rendered before the entire control, outside the input chrome."},{"name":"suffix","type":"object","description":"Inline content at the end of the field area."}],"exposed":[],"models":[{"name":"modelValue","type":"string | string[] | null | undefined"}],"cssProps":[{"name":"--border-color","value":"per variant","selector":"pt:box","description":"The resting border, at the fixed --bb-border-w. Errors and warnings paint their frame over it, so `pt:box=\"[--border-color:…]\"` recolours the rest without hiding the state; a plain `border-*` utility on the base pt:box would hide it (ESLint `no-box-border-color`)."}],"pt":{"parts":[{"name":"root","description":"The field's outer container: the label, the box and the lines under it."},{"name":"label","description":"The label text above the box (the `label` prop)."},{"name":"description","description":"The muted line under the label (the `description` prop)."},{"name":"message","description":"The errors / warnings line under the box. A node of its own: it can show at the same time as `hint`."},{"name":"hint","description":"The helper line (the `hint` prop), shown on focus, or always with `persistent-hint`."},{"name":"box","description":"The bordered box around the input — border, background and radius; the `variant` paints here."},{"name":"input","description":"Every segment field (hours, minutes, seconds) — a broadcast."},{"name":"icon","description":"The content icons, prepend and append — a broadcast. Chrome (the clear ✕, a chevron, the error / warning glyph) is never in it."},{"name":"spinner","description":"The spinner inside the box while `loading`."},{"name":"prefix","description":"The `#prefix` slot's wrapper, inside the box before the input."},{"name":"suffix","description":"The `#suffix` slot's wrapper, inside the box after the input."},{"name":"clear","description":"The ✕ that empties this control (`clearable`) — one node, never a chip's own ✕."},{"name":"activator","description":"The button in the box that opens the panel. Merged after the input's own click handler, so a listener of yours runs after ours. Its glyph is not a part."},{"name":"panel","description":"The time surface — the popover's painted bubble on desktop, the sheet itself on a phone."},{"name":"sheet","description":"The bottom sheet around the panel on a phone only."},{"name":"header","description":"The readout above the columns — the picked time; the calendar's heading on the date pickers."},{"name":"cellColumnHeader","description":"The letters above each column (`HH`, `MM`, `SS`) — a broadcast, like the calendar's weekday letters."},{"name":"item","description":"One column entry (hour, minute, second, AM / PM) — a broadcast."}],"states":[{"name":"hasValue","description":"Component-wide: the control holds a value, by its own rule (`0` counts on `BbNumberInput`, `''` on `BbColorInput`)."},{"name":"selected","description":"Per node, on `item`: the current value's entries."},{"name":"readonly","description":"Component-wide: the control is `readonly` — shown, focusable, not editable."},{"name":"disabled","description":"Component-wide while the input is `disabled`. Also per node, on `item`: an entry outside `min` / `max` — an hour with no minute in range, a minute out of range for the selected hour, an AM / PM half with no hour in range. Like the calendar's days: shown, not pickable."},{"name":"warnings","description":"Component-wide: the control is in its warning state (`warnings` / `has-warnings`) and not in an error state — errors win, so the two are never on together."},{"name":"errors","description":"Component-wide: the control is in its error state (`errors` / `has-errors`, or its validation) — the message line and the box turn red."},{"name":"open","description":"Component-wide: the panel is showing — `pt:activator:open` styles the trigger while it is."},{"name":"loading","description":"Component-wide: `loading` is on; the box shows its `spinner`."}]},"tree":{"bindings":[{"part":"controlAttrs","target":"input.bb-segmented-field__input"},{"part":"input","target":"input.bb-segmented-field__input"},{"part":"activator","target":"button.bb-segmented-field__activator"},{"part":"suffix","target":"span.bb-field-input__suffix"},{"part":"panel","target":"div"},{"part":"panel","target":"CommonPopover"}],"forwards":[{"to":"BbOffCanvas","mapping":"{ panel: 'root', sheet: 'root' }"}],"nodes":[{"name":"BbIcon","kind":"public","cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]},{"name":"BbOffCanvas","kind":"public","vocabulary":"BbOffCanvas","bindings":[{"part":"header","target":"div.bb-offcanvas__header"},{"part":"title","target":"span.bb-offcanvas__title"},{"part":"description","target":"p.bb-offcanvas__description"},{"part":"close","target":"CloseButton"},{"part":"content","target":"div.bb-offcanvas__content"},{"part":"footer","target":"div.bb-offcanvas__footer"}],"cssProps":[{"name":"--translate-x","documented":false,"readBy":["bb-offcanvas"]},{"name":"--translate-y","documented":false,"readBy":["bb-offcanvas"]},{"name":"--translate","documented":false,"readBy":["bb-offcanvas"]},{"name":"--stack-x","documented":true,"readBy":["bb-offcanvas"]},{"name":"--stack-y","documented":false,"readBy":["bb-offcanvas"]},{"name":"--stack-fill","documented":true,"readBy":["bb-offcanvas","bb-offcanvas--right","bb-offcanvas--left","bb-offcanvas--top","bb-offcanvas--bottom"]},{"name":"--stack-transition-duration","documented":true,"readBy":["bb-offcanvas"]},{"name":"--px","documented":true,"readBy":["bb-offcanvas__header","bb-close-button","bb-offcanvas__content","bb-offcanvas__footer"]},{"name":"--py","documented":false,"readBy":["bb-offcanvas__footer","bb-offcanvas__content","bb-offcanvas__header","bb-close-button"]},{"name":"--handle-w","documented":true,"readBy":["bb-offcanvas__handle"]},{"name":"--handle-h","documented":true,"readBy":["bb-offcanvas__handle"]},{"name":"--handle-bg","documented":true,"readBy":["bb-offcanvas__handle"]},{"name":"--transition-timing-function","documented":false,"readBy":["bb-offcanvas","bb-offcanvas--open"]},{"name":"--bg","documented":false,"readBy":["bb-offcanvas"]},{"name":"--fg","documented":false,"readBy":["bb-offcanvas"]},{"name":"--safe-top","documented":true,"readBy":["bb-offcanvas","bb-offcanvas--left","bb-offcanvas--right","bb-offcanvas--top","bb-offcanvas--fullscreen"]},{"name":"--safe-right","documented":false,"readBy":["bb-offcanvas","bb-offcanvas--right","bb-offcanvas--top","bb-offcanvas--bottom","bb-offcanvas--fullscreen"]},{"name":"--safe-bottom","documented":false,"readBy":["bb-offcanvas","bb-offcanvas--left","bb-offcanvas--right","bb-offcanvas--bottom","bb-offcanvas--fullscreen"]},{"name":"--safe-left","documented":false,"readBy":["bb-offcanvas","bb-offcanvas--left","bb-offcanvas--top","bb-offcanvas--bottom","bb-offcanvas--fullscreen"]},{"name":"--inset-top","documented":false,"readBy":["bb-offcanvas__content","bb-offcanvas__header"]},{"name":"--inset-right","documented":false,"readBy":["bb-offcanvas__header","bb-offcanvas__content","bb-offcanvas__footer"]},{"name":"--inset-bottom","documented":false,"readBy":["bb-offcanvas__footer","bb-offcanvas__content"]},{"name":"--inset-left","documented":false,"readBy":["bb-offcanvas__header","bb-offcanvas__content","bb-offcanvas__footer"]},{"name":"--close-size","documented":true,"readBy":["bb-close-button"]}],"children":[{"name":"CloseButton","kind":"internal","cssProps":[{"name":"--size","documented":true,"readBy":["bb-close-button"]},{"name":"--p","documented":true,"readBy":["bb-close-button"]}]}]},{"name":"CommonField","kind":"internal","vocabulary":"BbTimePickerInput","bindings":[{"part":"root","target":"div.bb-field"},{"part":"label","target":"component"},{"part":"description","target":"span.bb-field__description"},{"part":"hint","target":"span.bb-field__hint"},{"part":"counter","target":"span.bb-field__counter"},{"part":"message","target":"div.bb-field__message"}],"cssProps":[{"name":"--ctrl-line","documented":true,"readBy":["bb-field__label","bb-field__input-wrapper"]}],"children":[{"name":"BbAsterisk","kind":"public"}]},{"name":"CommonFieldInput","kind":"internal","vocabulary":"BbTimePickerInput","bindings":[{"part":"box","target":"span.bb-field-input__box"},{"part":"prefix","target":"span.bb-field-input__prefix"},{"part":"icon","target":"BbIcon"},{"part":"clear","target":"ClearableButton"},{"part":"spinner","target":"BbSpinner"},{"part":"suffix","target":"span.bb-field-input__suffix"}],"cssProps":[{"name":"--bg","documented":true,"readBy":["bb-field-input","bb-field-input__box"]},{"name":"--bg-hover","documented":true,"readBy":["bb-field-input__box"]},{"name":"--bg-focus","documented":true,"readBy":["bb-field-input__box"]},{"name":"--bg-disabled","documented":true,"readBy":["bb-field-input__box"]},{"name":"--fg-disabled","documented":true,"readBy":["bb-field-input__box","bb-field-input__prefix","bb-field-input__suffix","bb-field-input__prepend-icon","bb-field-input__append-icon"]},{"name":"--border-color","documented":true,"readBy":["bb-field-input","bb-field-input__box"]},{"name":"--border-focus","documented":true,"readBy":["bb-field-input__box"]},{"name":"--ring-size","documented":true,"readBy":["bb-field-input__box"]},{"name":"--ring-color","documented":true,"readBy":["bb-field-input__box"]},{"name":"--elev","documented":true,"readBy":["bb-field-input__box"]},{"name":"--frost","documented":true,"readBy":["bb-field-input__box"]},{"name":"--inside-label-clearance","documented":true,"readBy":["bb-field-input__box","bb-field-input__prefix","bb-field-input__suffix"]}],"children":[{"name":"ErrorIcon","kind":"internal","cssProps":[{"name":"--accent","documented":false,"readBy":["bb-error-icon"]}],"children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]}]},{"name":"WarningIcon","kind":"internal","cssProps":[{"name":"--accent","documented":false,"readBy":["bb-warning-icon"]}],"children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]}]},{"name":"ClearableButton","kind":"internal","children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]}]},{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]},{"name":"BbSpinner","kind":"public","children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]}]}]},{"name":"CommonPopover","kind":"internal"},{"name":"CommonTimeSelector","kind":"internal","vocabulary":"BbTimePickerInput","bindings":[{"part":"header","target":"div.bb-time-selector__header"},{"part":"cellColumnHeader","target":"div.bb-time-selector__cell-column-header"},{"part":"item","target":"BbBaseButton"}],"cssProps":[{"name":"--time-row-h","documented":false,"readBy":["bb-time-selector__item","bb-time-selector__scroll"]},{"name":"--time-col-w","documented":false,"readBy":["bb-time-selector__column"]},{"name":"--time-mark","documented":true,"readBy":["bb-time-selector__item"]}],"children":[{"name":"BbBaseButton","kind":"public","vocabulary":"BbBaseButton","bindings":[{"part":"root","target":"RouterComponent"},{"part":"root","target":"a"},{"part":"root","target":"component"}],"children":[{"name":"RouterComponent","kind":"internal"}]}]}]},"css":{"classes":{"bb-time-picker-input":["","__accessible-description","__field","__field--range","__panel","__panel--sheet","__popover","__sheet"]},"locals":["--color-gray-200"]},"attrTargets":["div","input"],"removed":[{"name":"hasWarning","new":"hasWarnings","since":"3.0.0-beta.26","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"direction","new":"layout","since":"3.0.0-beta.33","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"prepend-outer","new":"prepend:outer","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"append-outer","new":"append:outer","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"vid","new":null,"hint":"a display name (v2: `vid=\"Email address\"`) is now `validation-label`; a field path (3.0 betas: `vid=\"address.city\"`) is now `name` (brackets for a native post: `address[city]`). `check --fix` picks by the value","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"byValue","display":"validationLabel","key":"name"}},{"name":"validateOn","new":"validationMode","hint":"an array of events became one mode (`aggressive` | `balanced` | `lazy` | `submit-only` | `submit-live`). The old defaults (`['blur']`, `['inactive']`, a toggle's `['update:modelValue', 'change', 'blur']`) are `balanced`, the new default: delete the prop. A text field on `['update:modelValue']` is `validation-mode=\"aggressive\"`. Set it once on `<BbForm validation-mode>` instead of per field","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"manual"}}],"renamed":[{"from":"hasWarning","to":"hasWarnings","since":"3.0.0-beta.26","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"direction","to":"layout","since":"3.0.0-beta.33","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"prepend-outer","to":"prepend:outer","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"append-outer","to":"append:outer","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"validateOn","to":"validationMode","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"manual"}}]},
506
507
  {"name":"BbToast","group":"Feedback","description":"Shows transient notification messages (includes the co-located BbToastPortal export).","referenceOnly":false,"hasGuide":true,"contract":"ai/BbToast.md","source":"ai/source/BbToast.md","props":[{"name":"position","type":"BbToastPosition | undefined","required":false,"values":["top-left","top-center","top-right","bottom-left","bottom-center","bottom-right"],"description":"Where toasts stack when the toast itself names no `position`\n(`toast({ position })` wins). Falls back to `config.toastPosition`."},{"name":"pt","type":"(PtMap<BbToastPtPart, never> & { \"icon:loading\"?: PtValue | undefined; \"text:loading\"?: PtValue | undefined; \"panel:loading\"?: PtValue | undefined; \"footer:loading\"?: PtValue | undefined; \"content:loading\"?: PtValue | undefined; \"title:loading\"?: PtValue | undefined; \"close:loading\"?: PtValue | undefined; \"action:loading\"?: PtValue | undefined; }) | undefined","required":false,"description":"Passthrough, object form: the same keys as the `pt:*` attributes\nwithout the prefix. See the `pt:<part>` row."},{"name":"pt:action","type":"PtValue | undefined","required":false},{"name":"pt:action:loading","type":"PtValue | undefined","required":false},{"name":"pt:close","type":"PtValue | undefined","required":false},{"name":"pt:close:loading","type":"PtValue | undefined","required":false},{"name":"pt:content","type":"PtValue | undefined","required":false},{"name":"pt:content:loading","type":"PtValue | undefined","required":false},{"name":"pt:footer","type":"PtValue | undefined","required":false},{"name":"pt:footer:loading","type":"PtValue | undefined","required":false},{"name":"pt:icon","type":"PtValue | undefined","required":false},{"name":"pt:icon:loading","type":"PtValue | undefined","required":false},{"name":"pt:panel","type":"PtValue | undefined","required":false},{"name":"pt:panel:loading","type":"PtValue | undefined","required":false},{"name":"pt:root","type":"PtValue | undefined","required":false},{"name":"pt:text","type":"PtValue | undefined","required":false},{"name":"pt:text:loading","type":"PtValue | undefined","required":false},{"name":"pt:title","type":"PtValue | undefined","required":false},{"name":"pt:title:loading","type":"PtValue | undefined","required":false}],"events":[],"slots":[],"exposed":[],"models":[],"cssProps":[{"name":"--gap","value":"14px","selector":".bb-toast","description":"space between stacked toasts (the peek in the collapsed pile)"},{"name":"--offset","value":"20px","selector":".bb-toast","description":"distance from the viewport corner; 14px under 600px wide"},{"name":"--width","value":"356px","selector":".bb-toast","description":"stack width; `auto` (edge to edge) under 600px"},{"name":"--lift","value":"-1","selector":".bb-toast__panel","description":"Direction sign, not elevation: +1 for a top-anchored stack, -1 for a bottom-anchored one. Every vertical term (stack offset, enter/exit slide) is multiplied by it, so one set of formulas serves both corners."},{"name":"--stack-y","value":"0px","selector":".bb-toast__panel","description":"resting offset up/down the pile; composed by the layout rules below"},{"name":"--stack-scale","value":"1","selector":".bb-toast__panel","description":"resting scale — behind toasts shrink 5% per position in the collapsed pile"},{"name":"--enter-y","value":"0px","selector":".bb-toast__panel","description":"the enter/exit slide term of the same transform"},{"name":"--swipe-amount","value":"0px","selector":".bb-toast__panel","description":"live drag offset, set inline while the user swipes to dismiss"},{"name":"--z","value":"1","selector":".bb-toast__panel","description":"stacking order, set inline (front toast highest)"},{"name":"--r","value":"min(var(--bb-radius), 10px)","selector":".bb-toast__panel","description":"Card corners. `border-radius` caps whatever lands here again, at 14px."},{"name":"--ring-size","value":"2px","selector":".bb-toast__panel","description":"focus ring on the close button"},{"name":"--bg","value":"var(--bb-panel)","selector":".bb-toast__panel","description":"card fill, and the close button's own fill"},{"name":"--border-color","value":"var(--bb-border)","selector":".bb-toast__panel","description":"Card edge, painted as an inset ring (the card carries no `border`)"},{"name":"--fg","value":"var(--bb-text)","selector":".bb-toast__panel","description":"title, text and close glyph"},{"name":"--icon-color","value":"var(--bb-text)","selector":".bb-toast__panel","description":"The status glyph only — the variants below re-point this and nothing else"},{"name":"--icon-color","value":"var(--bb-success)","selector":".bb-toast__panel--success"},{"name":"--icon-color","value":"var(--bb-info)","selector":".bb-toast__panel--info"},{"name":"--icon-color","value":"var(--bb-warn)","selector":".bb-toast__panel--warning"},{"name":"--icon-color","value":"var(--bb-danger)","selector":".bb-toast__panel--destructive"},{"name":"--icon-color","value":"color-mix(in oklab, var(--bb-text) 75%, transparent)","selector":".bb-toast__panel--default"}],"pt":{"parts":[{"name":"root","description":"One region per corner in use — a broadcast over the corners."},{"name":"panel","description":"One toast card — a broadcast."},{"name":"icon","description":"A toast's icon box: its `icon`, or the spinner while it is `loading`. Not rendered for a toast with neither, nor for a portal toast."},{"name":"content","description":"A toast's body column — title, text and actions, or the wrapper around a portal's content."},{"name":"title","description":"A toast's heading. A portal toast renders its own body and has neither `title` nor `text`."},{"name":"text","description":"A toast's body copy."},{"name":"footer","description":"The row of a toast's `actions`. Not rendered without actions, nor for a portal toast."},{"name":"action","description":"Every button of a toast's `actions`, at the button's root — a broadcast. Never the ✕ (`close`)."},{"name":"close","description":"A toast's ✕."}],"states":[{"name":"loading","description":"Per toast, on its card parts (every part but `root`): the toast is `loading` (the spinner shows in its `icon`)."}]},"tree":{"nodes":[{"name":"BbToastRegion","kind":"internal","vocabulary":"BbToast","bindings":[{"part":"root","target":"ol.bb-toast"}],"children":[{"name":"BbToastMessage","kind":"internal","children":[{"name":"BbIcon","kind":"public","cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]},{"name":"BbSpinner","kind":"public","children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]}]},{"name":"BbButton","kind":"public","vocabulary":"BbButton","bindings":[{"part":"root","target":"BbBaseButton"},{"part":"spinner","target":"BbSpinner"},{"part":"icon","target":"BbIcon"},{"part":"text","target":"span.bb-button__text"}],"cssProps":[{"name":"--h-xs","documented":true,"readBy":["bb-button","bb-button--xs","bb-button--sm-xs","bb-button--md-xs","bb-button--lg-xs","bb-button--xl-xs","bb-button--2xl-xs"]},{"name":"--icon-size-xs","documented":false,"readBy":["bb-button","bb-button--xs"]},{"name":"--px-xs","documented":false,"readBy":["bb-button","bb-button--xs"]},{"name":"--fs-xs","documented":false,"readBy":["bb-button","bb-button--xs","bb-button--sm-xs","bb-button--md-xs","bb-button--lg-xs","bb-button--xl-xs","bb-button--2xl-xs"]},{"name":"--r-xs","documented":false,"readBy":["bb-button","bb-button--xs"]},{"name":"--gap-xs","documented":false,"readBy":["bb-button","bb-button--xs","bb-button--sm-xs","bb-button--md-xs","bb-button--lg-xs","bb-button--xl-xs","bb-button--2xl-xs"]},{"name":"--h-sm","documented":false,"readBy":["bb-button","bb-button--sm","bb-button--sm-sm","bb-button--md-sm","bb-button--lg-sm","bb-button--xl-sm","bb-button--2xl-sm"]},{"name":"--icon-size-sm","documented":false,"readBy":["bb-button","bb-button--sm"]},{"name":"--px-sm","documented":false,"readBy":["bb-button","bb-button--sm"]},{"name":"--fs-sm","documented":false,"readBy":["bb-button","bb-button--sm","bb-button--sm-sm","bb-button--md-sm","bb-button--lg-sm","bb-button--xl-sm","bb-button--2xl-sm"]},{"name":"--r-sm","documented":false,"readBy":["bb-button","bb-button--sm"]},{"name":"--gap-sm","documented":false,"readBy":["bb-button","bb-button--sm","bb-button--sm-sm","bb-button--md-sm","bb-button--lg-sm","bb-button--xl-sm","bb-button--2xl-sm"]},{"name":"--h-md","documented":false,"readBy":["bb-button","bb-button--md","bb-button--sm-md","bb-button--md-md","bb-button--lg-md","bb-button--xl-md","bb-button--2xl-md"]},{"name":"--icon-size-md","documented":false,"readBy":["bb-button","bb-button--md"]},{"name":"--px-md","documented":false,"readBy":["bb-button","bb-button--md"]},{"name":"--fs-md","documented":false,"readBy":["bb-button","bb-button--md","bb-button--sm-md","bb-button--md-md","bb-button--lg-md","bb-button--xl-md","bb-button--2xl-md"]},{"name":"--r-md","documented":false,"readBy":["bb-button","bb-button--md"]},{"name":"--gap-md","documented":false,"readBy":["bb-button","bb-button--md","bb-button--sm-md","bb-button--md-md","bb-button--lg-md","bb-button--xl-md","bb-button--2xl-md"]},{"name":"--h-lg","documented":false,"readBy":["bb-button","bb-button--lg","bb-button--sm-lg","bb-button--md-lg","bb-button--lg-lg","bb-button--xl-lg","bb-button--2xl-lg"]},{"name":"--icon-size-lg","documented":false,"readBy":["bb-button","bb-button--lg"]},{"name":"--px-lg","documented":false,"readBy":["bb-button","bb-button--lg"]},{"name":"--fs-lg","documented":false,"readBy":["bb-button","bb-button--lg","bb-button--sm-lg","bb-button--md-lg","bb-button--lg-lg","bb-button--xl-lg","bb-button--2xl-lg"]},{"name":"--r-lg","documented":false,"readBy":["bb-button","bb-button--lg"]},{"name":"--gap-lg","documented":false,"readBy":["bb-button","bb-button--lg","bb-button--sm-lg","bb-button--md-lg","bb-button--lg-lg","bb-button--xl-lg","bb-button--2xl-lg"]},{"name":"--h-xl","documented":false,"readBy":["bb-button","bb-button--xl","bb-button--sm-xl","bb-button--md-xl","bb-button--lg-xl","bb-button--xl-xl","bb-button--2xl-xl"]},{"name":"--icon-size-xl","documented":false,"readBy":["bb-button","bb-button--xl"]},{"name":"--px-xl","documented":false,"readBy":["bb-button","bb-button--xl"]},{"name":"--fs-xl","documented":false,"readBy":["bb-button","bb-button--xl","bb-button--sm-xl","bb-button--md-xl","bb-button--lg-xl","bb-button--xl-xl","bb-button--2xl-xl"]},{"name":"--r-xl","documented":false,"readBy":["bb-button","bb-button--xl"]},{"name":"--gap-xl","documented":false,"readBy":["bb-button","bb-button--xl","bb-button--sm-xl","bb-button--md-xl","bb-button--lg-xl","bb-button--xl-xl","bb-button--2xl-xl"]},{"name":"--h-2xl","documented":false,"readBy":["bb-button","bb-button--2xl","bb-button--sm-2xl","bb-button--md-2xl","bb-button--lg-2xl","bb-button--xl-2xl","bb-button--2xl-2xl"]},{"name":"--icon-size-2xl","documented":false,"readBy":["bb-button","bb-button--2xl"]},{"name":"--px-2xl","documented":false,"readBy":["bb-button","bb-button--2xl"]},{"name":"--fs-2xl","documented":false,"readBy":["bb-button","bb-button--2xl","bb-button--sm-2xl","bb-button--md-2xl","bb-button--lg-2xl","bb-button--xl-2xl","bb-button--2xl-2xl"]},{"name":"--r-2xl","documented":false,"readBy":["bb-button","bb-button--2xl"]},{"name":"--gap-2xl","documented":false,"readBy":["bb-button","bb-button--2xl","bb-button--sm-2xl","bb-button--md-2xl","bb-button--lg-2xl","bb-button--xl-2xl","bb-button--2xl-2xl"]},{"name":"--h","documented":true,"readBy":["bb-button","bb-button--icon"]},{"name":"--icon-size","documented":true,"readBy":["bb-button__text","bb-spinner","bb-button__icon","bb-button__prepend-icon","bb-button__append-icon"]},{"name":"--px","documented":true,"readBy":["bb-button","bb-button__prepend-icon","bb-button__append-icon"]},{"name":"--fs","documented":true,"readBy":["bb-button"]},{"name":"--r","documented":true,"readBy":["bb-button"]},{"name":"--gap","documented":true,"readBy":["bb-button","bb-button__text","bb-spinner"]},{"name":"--bg","documented":true,"readBy":["bb-button"]},{"name":"--bg-hover","documented":true,"readBy":["bb-button","bb-base-button--disabled"]},{"name":"--bg-pressed","documented":true,"readBy":["bb-button","bb-base-button--disabled"]},{"name":"--fg","documented":true,"readBy":["bb-button"]},{"name":"--border-color","documented":true,"readBy":["bb-button"]},{"name":"--ring-color","documented":true,"readBy":["bb-button"]},{"name":"--ring-size","documented":true,"readBy":["bb-button"]},{"name":"--bw","documented":true,"readBy":["bb-button"]},{"name":"--fg-hover","documented":true,"readBy":["bb-button","bb-base-button--disabled"]},{"name":"--border-hover","documented":true,"readBy":["bb-button","bb-base-button--disabled"]},{"name":"--fg-pressed","documented":true,"readBy":["bb-button","bb-base-button--disabled"]},{"name":"--border-pressed","documented":true,"readBy":["bb-button","bb-base-button--disabled"]},{"name":"--bg-disabled","documented":true,"readBy":["bb-button","bb-base-button--disabled","bb-button--loading"]},{"name":"--fg-disabled","documented":true,"readBy":["bb-button","bb-base-button--disabled","bb-button--loading"]},{"name":"--border-disabled","documented":true,"readBy":["bb-button","bb-base-button--disabled","bb-button--loading"]},{"name":"--opacity-disabled","documented":true,"readBy":["bb-button","bb-base-button--disabled","bb-button--loading"]},{"name":"--elev-tier","documented":true,"readBy":["bb-button--primary","bb-button--secondary","bb-button--outline","bb-button--destructive"]},{"name":"--elev","documented":true,"readBy":["bb-button"]}],"children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]},{"name":"BbBaseButton","kind":"public","vocabulary":"BbBaseButton","bindings":[{"part":"root","target":"RouterComponent"},{"part":"root","target":"a"},{"part":"root","target":"component"}],"children":[{"name":"RouterComponent","kind":"internal"}]},{"name":"BbSpinner","kind":"public","repeated":true}]}]}]}]},"css":{"classes":{"bb-toast":["","--*","--bottom-center","--bottom-left","--bottom-right","--expanded","--top-center","--top-left","--top-right","__action","__close","__content","__content--portal","__footer","__icon","__inner","__panel","__panel--*","__panel--default","__panel--destructive","__panel--front","__panel--hidden","__panel--info","__panel--mounted","__panel--removed","__panel--success","__panel--swiping","__panel--warning","__text","__title"]},"locals":["--bg","--border-color","--color-gray-200","--enter-y","--fg","--front-height","--front-index","--gap","--height-before","--hit","--icon-color","--lift","--offset","--r","--ring-size","--safe-h","--safe-v","--stack-scale","--stack-y","--swipe-amount","--toast-height","--width","--z"]},"removed":[{"name":"placement","new":"position","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-toast.md","silent":true,"fix":{"kind":"valueMap","valueMap":{"bottom":"bottom-center","bottom-start":"bottom-left","bottom-end":"bottom-right","top":"top-center","top-start":"top-left","top-end":"top-right"}}},{"name":"theme","new":"variant","surface":"option","hint":"a `toast()` / `useToast().toast()` option, not a prop: `toast({ variant: 'success' })` (plus an `icon` for the tone to show)","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-toast.md","silent":true,"fix":{"kind":"manual"}},{"name":"timeout","new":"duration","surface":"option","hint":"a `toast()` option: `toast({ duration: 4000 })`; the default fell from 6000 to 4000 ms","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-toast.md","silent":true,"fix":{"kind":"manual"}},{"name":"showClose","new":"hideClose","surface":"option","hint":"a `toast()` option, polarity inverted: `showClose: false` → `hideClose: true`; `showClose: true` was the default, delete it","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-toast.md","silent":true,"fix":{"kind":"manual"}}],"renamed":[{"from":"placement","to":"position","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-toast.md","fix":{"kind":"valueMap","valueMap":{"bottom":"bottom-center","bottom-start":"bottom-left","bottom-end":"bottom-right","top":"top-center","top-start":"top-left","top-end":"top-right"}}}]},