bitboss-ui 3.0.0-beta.44 → 3.0.0-beta.45
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.
- package/dist/ai/BbDropdownButton.md +4 -0
- package/dist/ai/BbRadioGroup.md +1 -1
- package/dist/ai/BbSelect.md +2 -1
- package/dist/ai/BbSelectPopover.md +1 -1
- package/dist/ai/BbTable.md +25 -9
- package/dist/ai/changelog.json +3 -2
- package/dist/ai/components.json +13 -13
- package/dist/ai/guides/fetch-items-playbook.md +1 -1
- package/dist/ai/manifest/components/BbCheckboxGroup.json +1 -1
- package/dist/ai/manifest/components/BbRadioGroup.json +2 -2
- package/dist/ai/manifest/components/BbSelect.json +1 -1
- package/dist/ai/manifest/components/BbSelectPopover.json +2 -2
- package/dist/ai/manifest/components/BbSwitchGroup.json +1 -1
- package/dist/ai/manifest/components/BbTable.json +1 -1
- package/dist/ai/manifest/components/BbTable.tree.json +11 -1
- package/dist/ai/manifest/index.json +2 -2
- package/dist/ai/manifest/types.advanced.json +3 -5
- package/dist/ai/manifest/types.api.json +5 -3
- package/dist/ai/source/BbDropdownButton.md +14 -2
- package/dist/ai/source/BbSmoothHeight.md +5 -0
- package/dist/ai/source/BbTable.md +70 -8
- package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +52 -50
- package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +739 -737
- package/dist/components/BbTable/utils.js +11 -4
- package/dist/llms-full.txt +34 -13
- package/dist/styles.css +2 -2
- package/dist/types/ItemsProvider.d.ts +13 -10
- package/dist/utils/versionCheck.js +1 -1
- package/package.json +1 -1
package/dist/ai/components.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"library": "bitboss-ui",
|
|
4
|
-
"version": "3.0.0-beta.
|
|
5
|
-
"generatedAt": "2026-10-
|
|
4
|
+
"version": "3.0.0-beta.45",
|
|
5
|
+
"generatedAt": "2026-10-02T12:07:33.079Z",
|
|
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.",
|
|
@@ -262,7 +262,7 @@
|
|
|
262
262
|
{"name":"BbCalendarSlots","usage":"wrapper","component":"BbCalendar","usedBy":[]},
|
|
263
263
|
{"name":"BbCheckboxEvents","usage":"wrapper","component":null,"usedBy":[]},
|
|
264
264
|
{"name":"BbCheckboxGroupEvents","usage":"wrapper","component":"BbCheckboxGroup","usedBy":[]},
|
|
265
|
-
{"name":"BbCheckboxGroupItemsContext","usage":"api","component":null,"usedBy":[{"component":"BbCheckboxGroup","surface":"prop","name":"items"},{"component":"
|
|
265
|
+
{"name":"BbCheckboxGroupItemsContext","usage":"api","component":null,"usedBy":[{"component":"BbCheckboxGroup","surface":"prop","name":"items"},{"component":"BbSwitchGroup","surface":"prop","name":"items"}],"definition":"type BbCheckboxGroupItemsContext<M = any> = BbItemsProviderContext<M> & { reason: 'initial' | 'dependencies' | 'model'; };"},
|
|
266
266
|
{"name":"BbCheckboxGroupProps","usage":"wrapper","component":"BbCheckboxGroup","usedBy":[]},
|
|
267
267
|
{"name":"BbCheckboxProps","usage":"wrapper","component":null,"usedBy":[]},
|
|
268
268
|
{"name":"BbCollapsibleProps","usage":"wrapper","component":"BbCollapsible","usedBy":[]},
|
|
@@ -292,7 +292,7 @@
|
|
|
292
292
|
{"name":"BbDropdownContextOption","usage":"advanced","component":null,"usedBy":[],"definition":"type BbDropdownContextOption = { text?: string; description?: string; original?: unknown; value?: unknown; };"},
|
|
293
293
|
{"name":"BbDropdownDirectiveValue","usage":"advanced","component":null,"usedBy":[],"definition":"type BbDropdownDirectiveValue = BbDropdownItem[] | (Partial<Omit<BbDropdownProps, 'items'>> & { items: BbDropdownItem[]; });"},
|
|
294
294
|
{"name":"BbDropdownEvents","usage":"wrapper","component":"BbDropdown","usedBy":[]},
|
|
295
|
-
{"name":"BbDropdownGroupItemsContext","usage":"advanced","component":null,"usedBy":[],"definition":"type BbDropdownGroupItemsContext = BbItemsProviderContext & { query?: string; reason: 'initial' | 'search' | 'dependencies'; };"},
|
|
295
|
+
{"name":"BbDropdownGroupItemsContext","usage":"advanced","component":null,"usedBy":[],"definition":"type BbDropdownGroupItemsContext<M = any> = BbItemsProviderContext<M> & { query?: string; reason: 'initial' | 'search' | 'dependencies'; };"},
|
|
296
296
|
{"name":"BbDropdownGroupModel","usage":"advanced","component":"BbDropdown","usedBy":[],"definition":"type BbDropdownGroupModel<T = any> = T[] | T | string[] | string | null;"},
|
|
297
297
|
{"name":"BbDropdownGroupProps","usage":"wrapper","component":"BbDropdown","usedBy":[]},
|
|
298
298
|
{"name":"BbDropdownItem","usage":"api","component":"BbDropdown","usedBy":[{"component":"BbDropdown","surface":"prop","name":"items"},{"component":"BbDropdownButton","surface":"prop","name":"items"}],"definition":"type BbDropdownItem = InternalItem | InternalGroup | BbDropdownItem[];","members":{"InternalItem":["text: string","disabled?: boolean","href?: string","rel?: string","target?: string","activeClass?: string","ariaCurrentValue?: \"page\" | \"step\" | \"location\" | \"date\" | \"time\" | \"true\" | \"false\"","data?: object","exactActiveClass?: string","headers?: object","download?: string | boolean","external?: boolean","method?: \"get\" | \"post\" | \"put\" | \"patch\" | \"delete\"","onBefore?: (() => void)","onCancel?: (() => void)","onCancelToken?: ((cancelToken: unknown) => void)","onFinish?: (() => void)","only?: string[]","onProgress?: ((progress: { percentage: number | undefined; }) => void)","onStart?: (() => void)","onSuccess?: (() => void)","preserveScroll?: boolean | ((props: Record<string, unknown>) => boolean)","preserveState?: boolean | ((props: Record<string, unknown>) => boolean) | null","queryStringArrayFormat?: \"brackets\" | \"indices\"","replace?: boolean","to?: string | RouteLocationAsRelativeGeneric | RouteLocationAsPathGeneric","async?: boolean","cacheFor?: string | number | (string | number)[]","cacheTags?: string | string[]","component?: string","except?: string[]","instant?: boolean","onError?: ((errors: Record<string, string>) => void)","onPrefetched?: (() => void)","onPrefetching?: (() => void)","pageProps?: Record<string, unknown> | ((currentProps: Record<string, unknown>, sharedProps: Record<string, unknown>) => Record<string, unknown>) | null","prefetch?: string | boolean | string[]","preserveUrl?: boolean","viewTransition?: boolean","items?: BbDropdownItem[]","onClick?: ((...args: any[]) => any)","append:icon?: string","key?: string","keyless?: true","meta?: any","prepend:icon?: string","variant?: keyof DropdownItemVariantRegistry","description?: string","placeholder?: \"loading\" | \"empty\" | \"failed\"","error?: unknown","fetched?: true","slotKey?: string"],"InternalGroup":["append:icon?: string","key?: string","keyless?: true","meta?: any","onClick?: ((...args: any[]) => any)","prepend:icon?: string","variant?: keyof DropdownItemVariantRegistry","dependencies?: unknown[]","depsDebounceTime?: number","enforceCoherence?: boolean","filterBy?: string[]","group?: true","items: any[] | DropdownGroupItemsGetter | (InternalItem | InternalItem[])[]","itemText?: string | ((item: any) => string)","itemProps?: BbDropdownItemProps<any>","itemValue?: string | ((item: any) => any)","loadingText?: string","max?: number","maxHeight?: string | number","multiple?: boolean","clearable?: boolean","emptyText?: string","failedText?: string","prefill?: boolean | \"interaction\"","searchable?: boolean","searchPlaceholder?: string","selectable?: boolean | ((item: any) => boolean)","stash?: boolean","label?: string","hideLabel?: boolean"]}},
|
|
@@ -314,7 +314,7 @@
|
|
|
314
314
|
{"name":"BbIconSize","usage":"advanced","component":"BbIcon","usedBy":[],"definition":"type BbIconSize = BbDialogSizes;"},
|
|
315
315
|
{"name":"BbIndicatorProps","usage":"wrapper","component":"BbIndicator","usedBy":[]},
|
|
316
316
|
{"name":"BbIndicatorSlots","usage":"wrapper","component":"BbIndicator","usedBy":[]},
|
|
317
|
-
{"name":"BbItemsProviderContext","usage":"advanced","component":null,"usedBy":[],"definition":"type BbItemsProviderContext = { reason: BbItemsProviderReason; modelValue:
|
|
317
|
+
{"name":"BbItemsProviderContext","usage":"advanced","component":null,"usedBy":[],"definition":"type BbItemsProviderContext<M = any> = { reason: BbItemsProviderReason; modelValue: M; signal: AbortSignal; };"},
|
|
318
318
|
{"name":"BbItemsProviderReason","usage":"advanced","component":null,"usedBy":[],"definition":"type BbItemsProviderReason = 'search' | 'initial' | 'dependencies' | 'model' | 'reopen' | 'pagination';","values":["search","initial","dependencies","model","reopen","pagination"]},
|
|
319
319
|
{"name":"BbNumberInputEvents","usage":"wrapper","component":"BbNumberInput","usedBy":[]},
|
|
320
320
|
{"name":"BbNumberInputProps","usage":"wrapper","component":"BbNumberInput","usedBy":[]},
|
|
@@ -331,16 +331,16 @@
|
|
|
331
331
|
{"name":"BbPtScopeSlots","usage":"wrapper","component":"BbPtScope","usedBy":[]},
|
|
332
332
|
{"name":"BbRadioEvents","usage":"wrapper","component":"BbRadio","usedBy":[]},
|
|
333
333
|
{"name":"BbRadioGroupEvents","usage":"wrapper","component":"BbRadioGroup","usedBy":[]},
|
|
334
|
-
{"name":"BbRadioGroupItemsContext","usage":"
|
|
334
|
+
{"name":"BbRadioGroupItemsContext","usage":"api","component":null,"usedBy":[{"component":"BbRadioGroup","surface":"prop","name":"items"}],"definition":"type BbRadioGroupItemsContext<M = any> = BbCheckboxGroupItemsContext<M>;"},
|
|
335
335
|
{"name":"BbRadioGroupProps","usage":"wrapper","component":"BbRadioGroup","usedBy":[]},
|
|
336
336
|
{"name":"BbRadioProps","usage":"wrapper","component":"BbRadio","usedBy":[]},
|
|
337
337
|
{"name":"BbRatingEvents","usage":"wrapper","component":"BbRating","usedBy":[]},
|
|
338
338
|
{"name":"BbRatingProps","usage":"wrapper","component":"BbRating","usedBy":[]},
|
|
339
339
|
{"name":"BbSelectEvents","usage":"wrapper","component":"BbSelect","usedBy":[]},
|
|
340
340
|
{"name":"BbSelectItemProps","usage":"api","component":null,"usedBy":[{"component":"BbSelect","surface":"prop","name":"itemProps"},{"component":"BbSelectPopover","surface":"prop","name":"itemProps"}],"definition":"type BbSelectItemProps<T = any> = ItemProps<T, SelectItemFields>;","fields":["description?: ItemAccessor<T, string | null | undefined>","prepend:icon?: ItemAccessor<T, string | null | undefined>","append:icon?: ItemAccessor<T, string | null | undefined>"]},
|
|
341
|
-
{"name":"BbSelectItemsContext","usage":"api","component":null,"usedBy":[{"component":"BbSelect","surface":"prop","name":"items"}
|
|
341
|
+
{"name":"BbSelectItemsContext","usage":"api","component":null,"usedBy":[{"component":"BbSelect","surface":"prop","name":"items"}],"definition":"type BbSelectItemsContext<M = any> = BbItemsProviderContext<M> & { query: string; reason: 'search' | 'initial' | 'dependencies' | 'model' | 'reopen'; };"},
|
|
342
342
|
{"name":"BbSelectPopoverEvents","usage":"wrapper","component":"BbSelectPopover","usedBy":[]},
|
|
343
|
-
{"name":"BbSelectPopoverItemsContext","usage":"
|
|
343
|
+
{"name":"BbSelectPopoverItemsContext","usage":"api","component":null,"usedBy":[{"component":"BbSelectPopover","surface":"prop","name":"items"}],"definition":"type BbSelectPopoverItemsContext<M = any> = BbSelectItemsContext<M>;"},
|
|
344
344
|
{"name":"BbSelectPopoverProps","usage":"wrapper","component":"BbSelectPopover","usedBy":[]},
|
|
345
345
|
{"name":"BbSelectPopoverSlots","usage":"wrapper","component":"BbSelectPopover","usedBy":[]},
|
|
346
346
|
{"name":"BbSelectProps","usage":"wrapper","component":"BbSelect","usedBy":[]},
|
|
@@ -354,7 +354,7 @@
|
|
|
354
354
|
{"name":"BbSpinnerSizes","usage":"advanced","component":"BbSpinner","usedBy":[],"definition":"type BbSpinnerSizes = BbIconSize;"},
|
|
355
355
|
{"name":"BbSwitchEvents","usage":"wrapper","component":"BbSwitch","usedBy":[]},
|
|
356
356
|
{"name":"BbSwitchGroupEvents","usage":"wrapper","component":"BbSwitchGroup","usedBy":[]},
|
|
357
|
-
{"name":"BbSwitchGroupItemsContext","usage":"advanced","component":null,"usedBy":[],"definition":"type BbSwitchGroupItemsContext = BbCheckboxGroupItemsContext
|
|
357
|
+
{"name":"BbSwitchGroupItemsContext","usage":"advanced","component":null,"usedBy":[],"definition":"type BbSwitchGroupItemsContext<M = any> = BbCheckboxGroupItemsContext<M>;"},
|
|
358
358
|
{"name":"BbSwitchGroupProps","usage":"wrapper","component":"BbSwitchGroup","usedBy":[]},
|
|
359
359
|
{"name":"BbSwitchProps","usage":"wrapper","component":"BbSwitch","usedBy":[]},
|
|
360
360
|
{"name":"BbTabEvents","usage":"wrapper","component":"BbTabs","deprecated":true,"replacedBy":"BbTabsEvents","usedBy":[]},
|
|
@@ -362,7 +362,7 @@
|
|
|
362
362
|
{"name":"BbTableColumn","usage":"api","component":"BbTable","usedBy":[{"component":"BbTable","surface":"prop","name":"columns"}],"definition":"type BbTableColumn<Item = any> = BaseColumn<Item> & { align?: 'left' | 'right' | 'center'; skeleton?: SkeletonType; sortable?: boolean; rowHeader?: boolean; reorderable?: boolean; sorted?: 'asc' | 'desc'; rowClass?: ColumnClasses<Item>; tdClass?: ColumnClasses<Item>; thClass?: Classes; hidden?: boolean; fixed?: 'left' | 'right'; width?: number | string; snap?: string | [ start: string, end: string ]; };","fields":["formatOnNull?: boolean","formatter?: ((content: any, key: string, item: Item) => any)","key: ItemKey<Item>","label: string","placeholder?: string","align?: \"center\" | \"left\" | \"right\"","skeleton?: SkeletonType","sortable?: boolean","rowHeader?: boolean","reorderable?: boolean","sorted?: \"asc\" | \"desc\"","rowClass?: ColumnClasses<Item>","tdClass?: ColumnClasses<Item>","thClass?: Classes","hidden?: boolean","fixed?: \"left\" | \"right\"","width?: string | number","snap?: string | [start: string, end: string]"]},
|
|
363
363
|
{"name":"BbTableContext","usage":"advanced","component":null,"usedBy":[],"definition":"type BbTableContext = { isReady: ComputedRef<boolean>; selected: WritableComputedRef<any>; unselected: WritableComputedRef<any[]>; all: WritableComputedRef<boolean>; highlighted: WritableComputedRef<any>; sort: WritableComputedRef<BbTableSortEntry[]>; order: WritableComputedRef<string[]>; page: WritableComputedRef<number>; perPage: WritableComputedRef<number>; totalItems: WritableComputedRef<number>; totalPages: WritableComputedRef<number>; };"},
|
|
364
364
|
{"name":"BbTableEvents","usage":"wrapper","component":"BbTable","usedBy":[]},
|
|
365
|
-
{"name":"BbTableItemsContext","usage":"api","component":null,"usedBy":[{"component":"BbTable","surface":"prop","name":"items"}],"definition":"type BbTableItemsContext = BbItemsProviderContext & { reason: 'initial' | 'dependencies' | 'pagination'; };"},
|
|
365
|
+
{"name":"BbTableItemsContext","usage":"api","component":null,"usedBy":[{"component":"BbTable","surface":"prop","name":"items"}],"definition":"type BbTableItemsContext<M = any> = BbItemsProviderContext<M> & { reason: 'initial' | 'dependencies' | 'pagination'; };"},
|
|
366
366
|
{"name":"BbTableProps","usage":"wrapper","component":"BbTable","usedBy":[]},
|
|
367
367
|
{"name":"BbTableRowClasses","usage":"api","component":"BbTable","usedBy":[{"component":"BbTable","surface":"prop","name":"rowClass"}],"definition":"type BbTableRowClasses<Item = any> = Classes | ((item: Item) => Classes | undefined);"},
|
|
368
368
|
{"name":"BbTableSlots","usage":"wrapper","component":"BbTable","usedBy":[]},
|
|
@@ -484,16 +484,16 @@
|
|
|
484
484
|
{"name":"BbProgress","group":"Feedback","description":"Visualizes task or operation progress state.","referenceOnly":false,"hasGuide":true,"contract":"ai/BbProgress.md","source":"ai/source/BbProgress.md","props":[{"name":"label","type":"string | undefined","required":false,"default":"undefined","description":"Accessible name for the progress bar, forwarded to `aria-label`. A\n`progressbar` with no name is announced only as a bare percentage, so give\nit one whenever the surrounding text doesn't already name it (e.g.\n`\"Upload\"`). Matches the `label` naming prop on BbSpinner / BbIcon."},{"name":"max","type":"number | undefined","required":false,"default":"100","description":"Maximum value. Upper cap."},{"name":"min","type":"number | undefined","required":false,"default":"0","description":"Minimum value. Lower cap."},{"name":"modelValue","type":"number | null","required":true,"default":"0","description":"The current progress value — a number between `min` and `max`. This is a\none-way input prop (BbProgress is a display component and never emits\n`update:modelValue`); `null` means no value and renders an empty bar."},{"name":"pt","type":"PtMap<BbProgressPtPart, never> | undefined","required":false,"description":"Passthrough, object form: the same keys as the `pt:*` attributes\nwithout the prefix. See the `pt:<part>` row."},{"name":"pt:bar","type":"PtValue | undefined","required":false},{"name":"pt:root","type":"PtValue | undefined","required":false}],"events":[],"slots":[],"exposed":[],"models":[],"cssProps":[{"name":"--track","value":"4px","selector":".bb-progress"},{"name":"--track-color","value":"var(--bb-track)","selector":".bb-progress","description":"The recessed rail surface, not `--bb-secondary`: that is the secondary BUTTON fill, so tuning the track moved buttons and tuning buttons moved the track. `--bb-track` is the token for a rail, and it is a step stronger, so the unfilled remainder actually reads."},{"name":"--accent","value":"var(--bb-primary)","selector":".bb-progress"},{"name":"--r","value":"var(--bb-radius)","selector":".bb-progress"}],"pt":{"parts":[{"name":"root","description":"The track (the `progressbar` element); the bar follows it through its locals (`--track`, `--track-color`, `--accent`, `--r`, the same words as BbSlider's rail and bar)."},{"name":"bar","description":"The fill itself. Its inline `transform` IS the value (it slides from -100% to 0), so style its look here — colour, gradient, radius — never its position."}],"states":[]},"css":{"classes":{"bb-progress":["","__bar"]},"locals":["--accent","--color-gray-200","--r","--track","--track-color","--transition-duration"]},"attrTargets":["div"]},
|
|
485
485
|
{"name":"BbPtScope","group":"Layout & Utility","description":"Renderless provider that switches on a named passthrough scope (`ptScopes` in the plugin config) for its subtree — a backoffice and a member area with different looks in one app.","referenceOnly":false,"hasGuide":true,"contract":"ai/BbPtScope.md","source":"ai/source/BbPtScope.md","props":[{"name":"name","type":"BbPtScopeName","required":true,"values":["bitboss-ui: no ptScopes configured — add ptScopes to bitbossUi() and commit bitboss-ui.d.ts"],"description":"The scope to switch on for everything inside: a key of the plugin's\n`ptScopes` option (`BbPtScopeName`, generated from your config).\nNested scopes add up: the outer scope's entries apply first, the inner\nscope's after them. Reactive — changing it restyles the subtree."}],"events":[],"slots":[{"name":"default","type":"any","description":"The subtree the scope applies to. Rendered as is — no wrapper element."}],"exposed":[],"models":[]},
|
|
486
486
|
{"name":"BbRadio","group":"Selection","description":"Represents a single choice in exclusive options.","referenceOnly":false,"hasGuide":true,"contract":"ai/BbRadio.md","source":"ai/source/BbRadio.md","props":[{"name":"autofocus","type":"Booleanish | undefined","required":false,"description":"Sets autofocus on page load."},{"name":"checked","type":"boolean | undefined","required":false,"default":"undefined","description":"Defines the input as checked."},{"name":"compact","type":"boolean | undefined","required":false,"default":"false","description":"Compact density. Swaps `--bb-label-spacing-y` for\n`--bb-label-spacing-y-compact`, so tune a compact field's label gap with\nthe `-compact` token, not the base one. The same meaning as on the\ncheckbox, radio and switch groups."},{"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":"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":"inputPosition","type":"\"left\" | \"center\" | \"right\" | undefined","required":false,"default":"\"left\"","description":"Sets the alignment of the input. Since inputs are inline block they can be aligned just as text can."},{"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":"labelPosition","type":"\"left\" | \"center\" | \"right\" | undefined","required":false,"description":"Sets the text alignment of the label."},{"name":"layout","type":"FieldLayout | undefined","required":false,"default":"\"auto\"","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":"modelValue","type":"any","required":false,"description":"Used by v-model. Can be any serializable type."},{"name":"name","type":"string | undefined","required":false,"description":"Defines the name of the input. Optional: an omitted name falls back to a\ngenerated one, unique to this button and stable for its lifetime, so a lone\nradio needs no name at all. Buttons that must form ONE exclusive group still\nhave to share an explicit `name` — generated names are per-instance, so they\nwould never group. Pass a name too when the value has to be submitted under a\nknown key by a native (non-JS) form post."},{"name":"persistentHint","type":"boolean | undefined","required":false,"default":"false","description":"Keeps the hint displayed."},{"name":"pt","type":"PtMap<TogglePtPart, TogglePtState> | undefined","required":false,"description":"Passthrough, object form: the same keys as the `pt:*` attributes\nwithout the prefix. See the `pt:<part>` row."},{"name":"pt:description","type":"PtValue | undefined","required":false},{"name":"pt:description:checked","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:focused","type":"PtValue | undefined","required":false},{"name":"pt:description:focusVisible","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:checked","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:focused","type":"PtValue | undefined","required":false},{"name":"pt:hint:focusVisible","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:checked","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:focused","type":"PtValue | undefined","required":false},{"name":"pt:icon:focusVisible","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:label","type":"PtValue | undefined","required":false},{"name":"pt:label:checked","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:focused","type":"PtValue | undefined","required":false},{"name":"pt:label:focusVisible","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:checked","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:focused","type":"PtValue | undefined","required":false},{"name":"pt:message:focusVisible","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:root","type":"PtValue | undefined","required":false},{"name":"pt:root:checked","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:focused","type":"PtValue | undefined","required":false},{"name":"pt:root:focusVisible","type":"PtValue | undefined","required":false},{"name":"pt:root:readonly","type":"PtValue | undefined","required":false},{"name":"pt:root: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: in every direction the order of the label and the\ninput is swapped from the standard arrangement."},{"name":"value","type":"any","required":true,"description":"Defines the value of the radio input.\nIt can be any serializable value."},{"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 radio selection changes.\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":"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 radio input.\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":"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":"update:modelValue","signature":"(value: any): void","description":"Emitted when the radio becomes selected, carrying the radio's `value` prop."}],"slots":[{"name":"description","type":"BbRadioDescriptionSlotProps","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":"icon","type":"BbRadioIconSlotProps","fields":["checked: boolean","disabled: boolean","focused: boolean","focusVisible: boolean","hasErrors: boolean","hasWarnings: boolean","id: string","name: string","parsedValue: string","readonly: boolean","value: any","text: string"],"description":"Replaces the default radio dot visual inside the radio container. Receives\nthe radio state plus the label text."},{"name":"label","type":"BbRadioLabelSlotProps","fields":["text: string","hasErrors: boolean","hasWarnings: boolean"],"description":"Replaces the default label text rendered next to the radio button."}],"exposed":[],"models":[{"name":"modelValue","type":"any"}],"pt":{"parts":[{"name":"root","description":"The toggle's container: the glyph, the label and the lines under them."},{"name":"label","description":"The label text beside the glyph (the `label` prop)."},{"name":"description","description":"The muted line under the label (the `description` prop)."},{"name":"message","description":"The errors / warnings line. 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":"icon","description":"The drawn glyph — the box, the dot or the switch track. The default one: a consumer `icon` slot replaces it. The hidden native input is not a part."}],"states":[{"name":"checked","description":"Component-wide: the toggle is on."},{"name":"readonly","description":"Component-wide: the toggle is `readonly` — focusable, cannot change."},{"name":"disabled","description":"Component-wide: the toggle is `disabled`."},{"name":"warnings","description":"Component-wide: the toggle shows warnings and no errors."},{"name":"errors","description":"Component-wide: the toggle shows errors — the glyph and the message line turn red."},{"name":"focused","description":"Component-wide: the native input has focus — any focus, mouse included, like the `focused` slot prop."},{"name":"focusVisible","description":"Component-wide: that focus is keyboard-visible — where a focus ring belongs."}]},"tree":{"bindings":[{"part":"icon","target":"BbBaseRadioIcon"}],"nodes":[{"name":"CommonField","kind":"internal","vocabulary":"BbRadio","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":"BbBaseRadioIcon","kind":"public","cssProps":[{"name":"--accent","documented":false,"readBy":["bb-base-radio-icon","bb-base-radio-icon--errors","bb-base-radio-icon--warnings","bb-base-radio-icon--disabled"]},{"name":"--size","documented":false,"readBy":["bb-base-radio-icon"]},{"name":"--space","documented":false,"readBy":["bb-base-radio-icon"]},{"name":"--ring-color","documented":false,"readBy":["bb-base-radio-icon--focus-visible"]},{"name":"--elev","documented":true,"readBy":["bb-base-radio-icon","bb-base-radio-icon--focus-visible"]},{"name":"--bg","documented":true,"readBy":["bb-base-radio-icon"]},{"name":"--border-color","documented":false,"readBy":["bb-base-radio-icon"]}]}]},"css":{"classes":{"bb-radio":[""]},"locals":["--color-gray-200"]},"attrTargets":["div"],"removed":[{"name":"color","new":null,"since":"3.0.0-beta.15","migration":"ai/guides/migration/components/bb-checkbox.md","silent":true,"fix":{"kind":"manual"}},{"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"}}],"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"}}]},
|
|
487
|
-
{"name":"BbRadioGroup","group":"Selection","description":"Coordinates exclusive selection among radio options.","referenceOnly":false,"hasGuide":true,"contract":"ai/BbRadioGroup.md","source":"ai/source/BbRadioGroup.md","props":[{"name":"autofocus","type":"Booleanish | undefined","required":false,"description":"Sets autofocus on page load."},{"name":"compact","type":"boolean | undefined","required":false,"default":"false","description":"Compact density. Swaps `--bb-label-spacing-y` for\n`--bb-label-spacing-y-compact`, so tune a compact group's label gap with\nthe `-compact` token, not the base one."},{"name":"dependencies","type":"unknown[] | undefined","required":false,"description":"Defines an array of dependencies that will trigger actions in the component upon change."},{"name":"depsDebounceTime","type":"number | undefined","required":false,"description":"Timeout used to debounce response to changes to dependencies."},{"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":"emptyText","type":"string | undefined","required":false,"description":"String displayed when there are no items to display."},{"name":"enforceCoherence","type":"boolean | undefined","required":false,"default":"false","description":"If coherence is enforced the input cannot have a modelValue that is incoherent with its current items.\n\ne.g. You cannot set v-model to a user that is not present in the items passed.\n\nmodelValue will be reset upon incoherence.\n\nChecked after every applied, successful load (an empty one included);\na failed load never prunes."},{"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":"failedText","type":"string | undefined","required":false,"default":"the localized `common.failedText` (\"Couldn't load items\")","description":"String displayed in the empty state while the latest load FAILED (the\n`items` provider threw): the twin of `emptyText` for that case."},{"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 each option's label text (the text rendered next to every\ninput) while keeping it accessible to screen readers.\nDoes not affect the fieldset legend — use `hideLegend` for that."},{"name":"hideLegend","type":"boolean | undefined","required":false,"default":"false","description":"Visually hides the legend of the fieldset 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":"Prefix for the ids of each option's input and of the label, description\nand message. 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":"inputPosition","type":"\"left\" | \"center\" | \"right\" | undefined","required":false,"default":"\"left\"","description":"Sets the alignment of the input. Since inputs are inline block they can be aligned just as text can."},{"name":"itemInputAlign","type":"FieldCrossAlign | undefined","required":false,"values":["top","center","bottom"],"description":"Vertical position of each option's control in its row; `'center'` is\nthe middle of the label plus its description. Omitted, it sits on the\nlabel's first line."},{"name":"itemLabelAlign","type":"FieldCrossAlign | undefined","required":false,"values":["top","center","bottom"],"description":"Vertical position of each option's label in its row. Omitted, it stays\nas it is."},{"name":"itemLayout","type":"FieldLayout | undefined","required":false,"default":"'auto'","description":"How each row's input and label sit together — the keywords of `layout`:\n`'auto'`, `'vertical'` (the input above the label), `'horizontal'`\n(50/50), `'label-fill'` (the label takes the row's free space — pair it\nwith `list-layout=\"vertical-stretch\"` and `item-reverse` for a settings\nlist), `'input-fill'`, or a two-word ratio pattern like `'xx xxxxx'`,\nread in on-screen order."},{"name":"itemProps","type":"BbOptionGroupItemProps<T> | undefined","required":false,"description":"ADDITIONAL row fields resolved from each item — never its text or value\n(those stay on `itemText` / `itemValue`). Option groups accept one field:\n\n- `description` — a muted line under the option label, beside the control;\n it may wrap.\n\nEither an object with a path or getter per field\n(`{ description: 'email' }`) or a function returning the fields\n(`(item) => ({ description: item.email })`). Without it no field renders —\nan item's own `description` is never read implicitly — and an empty value\nrenders nothing for that item. The description is announced as the\noption's description, never part of its name. To disable individual\noptions use `selectable`."},{"name":"itemReverse","type":"boolean | undefined","required":false,"default":"false","description":"Swaps each row's input and label from their natural order (input first),\nin every `item-layout`. `reverse` swaps the legend and the options instead."},{"name":"items","type":"T[] | ((context: BbCheckboxGroupItemsContext) => T[] | Promise<T[]>)","required":true,"description":"The options: an array, or a provider function called with ONE context\nobject and returning the rows, sync or async. The context carries:\n- `reason` — why this call happened: `'initial'` (the first load, on\n mount), `'dependencies'` (a `dependencies` entry or the `items`\n function changed; a retry arrives this way) or `'model'` (the model\n changed from outside and the options cannot resolve it). The group has\n no search field, so it never passes `query`;\n- `modelValue` — the `v-model` as-is;\n- `signal` — an `AbortSignal`, aborted when a newer call starts or the\n group is disposed; pass it to every request.\n\nA provider signals a failure by THROWING, never by returning `[]`: the\nrows are cleared, nothing is pruned, and `#empty` receives the `error`\n(`failed-text` is shown). Zero-argument providers keep working. Annotate\nthe parameter `BbRadioGroupItemsContext`."},{"name":"itemText","type":"ItemAccessor<T, string> | undefined","required":false,"default":"JSON.stringify(item)","description":"Defines a path that returns a property of the object to use as text or a function that returns a string."},{"name":"itemValue","type":"ItemAccessor<T> | undefined","required":false,"default":"the whole item","description":"Defines a path that returns a property of the object to use as value or a function that returns any value."},{"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":"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":"legend","type":"string","required":true,"description":"Text content of the legend."},{"name":"legendMode","type":"\"outside\" | \"inside\" | undefined","required":false,"description":"Legend rendering mode. `'outside'` renders the legend above the fieldset in the normal flow;\n`'inside'` overlays the legend inside the fieldset border.\nFloating mode is not supported for radio groups."},{"name":"legendPosition","type":"\"left\" | \"center\" | \"right\" | undefined","required":false,"description":"Sets the text alignment of the label."},{"name":"listLayout","type":"ListLayout | undefined","required":false,"default":"'horizontal'","values":["horizontal","vertical","vertical-stretch","tiles"],"description":"How the rows sit inside the list: `'horizontal'` (on a line, wrapping,\neach row its own size), `'vertical'` (stacked, each row its own size),\n`'vertical-stretch'` (stacked, each row as wide as the list) or\n`'tiles'` (equal-size boxes, wrapping onto new lines as the field\nnarrows; `--tile-min-width` on `pt:list` sets how narrow a tile gets)."},{"name":"loadingText","type":"string | undefined","required":false,"description":"String displayed while items are being loaded."},{"name":"modelValue","type":"any","required":false,"description":"Used by v-model. Can be any serializable type."},{"name":"modelValueDebounceTime","type":"number | undefined","required":false,"description":"Timeout used to debounce response to changes to modelValue."},{"name":"name","type":"string | undefined","required":false,"description":"Defines the name of the option inputs. Optional: the options live inside a\nsingle component instance, so an omitted name falls back to a generated one\nthat groups them correctly on its own — unique per group, so two groups never\nclear each other's selection, and stable for the group's lifetime. Pass a name\nonly when the value has to be submitted under a known key by a native (non-JS)\nform post."},{"name":"persistentHint","type":"boolean | undefined","required":false,"default":"false","description":"Keeps the hint displayed."},{"name":"pt","type":"GroupPtMap<T> | undefined","required":false,"description":"Passthrough, object form: the same keys as the `pt:*` attributes\nwithout the prefix. See the `pt:<part>` row."},{"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 | ((ctx: PtItemCtx<T, GroupPtState>) => PtItemResult) | undefined","required":false},{"name":"pt:icon:checked","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:focused","type":"PtValue | undefined","required":false},{"name":"pt:icon:focusVisible","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:item","type":"PtValue | ((ctx: PtItemCtx<T, GroupPtState>) => PtItemResult) | undefined","required":false},{"name":"pt:item:checked","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:focused","type":"PtValue | undefined","required":false},{"name":"pt:item:focusVisible","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:readonly","type":"PtValue | undefined","required":false},{"name":"pt:item:warnings","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription","type":"PtValue | ((ctx: PtItemCtx<T, GroupPtState>) => PtItemResult) | undefined","required":false},{"name":"pt:itemDescription:checked","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:disabled","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:errors","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:focused","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:focusVisible","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:loading","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:readonly","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:warnings","type":"PtValue | undefined","required":false},{"name":"pt:label","type":"PtValue | ((ctx: PtItemCtx<T, GroupPtState>) => PtItemResult) | undefined","required":false},{"name":"pt:label:checked","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:focused","type":"PtValue | undefined","required":false},{"name":"pt:label:focusVisible","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:legend","type":"PtValue | undefined","required":false},{"name":"pt:legend:disabled","type":"PtValue | undefined","required":false},{"name":"pt:legend:errors","type":"PtValue | undefined","required":false},{"name":"pt:legend:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:legend:loading","type":"PtValue | undefined","required":false},{"name":"pt:legend:readonly","type":"PtValue | undefined","required":false},{"name":"pt:legend:warnings","type":"PtValue | undefined","required":false},{"name":"pt:list","type":"PtValue | undefined","required":false},{"name":"pt:list:disabled","type":"PtValue | undefined","required":false},{"name":"pt:list:errors","type":"PtValue | undefined","required":false},{"name":"pt:list:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:list:loading","type":"PtValue | undefined","required":false},{"name":"pt:list:readonly","type":"PtValue | undefined","required":false},{"name":"pt:list: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: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":"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 the input is swapped."},{"name":"rules","type":"RuleExpression<any>","required":false,"description":"vee-validate rules for this field. Only inside a `BbForm`."},{"name":"selectable","type":"boolean | ((item: T) => boolean) | undefined","required":false,"default":"true","description":"Defines whether options are selectable.\nCan be a global boolean that affects all options or a function\nthat accepts an item and returns a boolean that only affects that item.\nNon-selectable options are rendered disabled."},{"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":"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 group becomes active (focus/click enters it)."},{"name":"blur","signature":"(event: FocusEvent): void","description":"Emitted when one of the generated radio inputs loses focus.\nForwards the original DOM `FocusEvent`."},{"name":"change","signature":"(event: Event): void","description":"Emitted when a radio option is selected.\nForwards the original DOM `Event` from the radio input."},{"name":"click","signature":"(event: MouseEvent): void","description":"Emitted when one of the generated radio inputs is clicked.\nForwards the original DOM `MouseEvent`."},{"name":"focus","signature":"(event: FocusEvent): void","description":"Emitted when one of the generated radio inputs receives focus.\nForwards the original DOM `FocusEvent`."},{"name":"inactive","signature":"(): void","description":"Emitted when focus/click moves outside the group after it was active.\nUseful for validation-on-blur flows at group level."},{"name":"input","signature":"(event: Event): void","description":"Emitted on native input events from generated radio inputs.\nForwards the original DOM `Event`."},{"name":"keydown","signature":"(event: KeyboardEvent): void","description":"Emitted for keyboard interaction on generated radio inputs.\nForwards the original DOM `KeyboardEvent`."},{"name":"mousedown","signature":"(event: MouseEvent): void","description":"Emitted when a pointing device button is pressed over a radio input.\nForwards the original DOM `MouseEvent`."},{"name":"mouseup","signature":"(event: MouseEvent): void","description":"Emitted when a pointing device button is released over a radio input.\nForwards the original DOM `MouseEvent`."},{"name":"update:modelValue","signature":"(value: any): void","description":"Emitted with the newly selected value when the selection changes."}],"slots":[{"name":"append","type":"object","description":"Content rendered after the last option, inside the options container."},{"name":"description","type":"BbRadioGroupDescriptionSlotProps","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":"empty","type":"{ error: unknown; }","description":"Content shown when no options are available (replaces the default \"no\ndata\" text). `error` is what the latest failed load rejected with,\nuntouched, and `null` when nothing failed — a failed load clears the\nrows, so this slot is where it shows."},{"name":"icon","type":"BbRadioGroupIconSlotProps<T>","fields":["disabled: boolean","readonly: boolean","checked: boolean","focused: boolean","focusVisible: boolean","id: string","name: string","hasErrors: boolean","hasWarnings: boolean","parsedValue: string","value: any","item: T","text: string"],"description":"Replaces the default radio dot icon for each option. Receives the radio\nstate plus the source item and its display text."},{"name":"label","type":"BbRadioGroupLabelSlotProps<T>","fields":["item: T","text: string","checked: boolean","description: string"],"description":"Replaces the default label text for each option."},{"name":"legend","type":"BbRadioGroupLegendSlotProps","fields":["text: string","hasErrors: boolean","hasWarnings: boolean"],"description":"Replaces the default fieldset legend text for the group."},{"name":"loading","type":"object","description":"Content shown while options are loading (replaces the default loading text)."},{"name":"prepend","type":"object","description":"Content rendered before the first option, inside the options container."}],"exposed":[],"models":[{"name":"modelValue","type":"any"}],"cssProps":[{"name":"--gap","value":"24px","selector":".bb-radio-group__list","description":"Space between rows on one line."},{"name":"--row-gap","value":"10px","selector":".bb-radio-group__list","description":"Space between wrapped lines."},{"name":"--tile-min-width","value":"96px","selector":".bb-radio-group__list","description":"How narrow a tile may get before the tiles wrap (`tiles` only)."}],"pt":{"parts":[{"name":"root","description":"The group's container (the fieldset)."},{"name":"legend","description":"The group's heading — the fieldset `<legend>` (the `legend` prop)."},{"name":"description","description":"The muted line under the legend (the `description` prop)."},{"name":"message","description":"The errors / warnings line. 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":"list","description":"The node that lays the rows out (flex + wrap, gaps on `--gap` / `--row-gap`): `pt:list=\"grid grid-cols-3\"` re-lays them, `pt:list=\"[--gap:8px]\"` tightens them. Takes the group-wide states only."},{"name":"item","description":"One option row — a broadcast, resolved per option with its own `checked` / `disabled` / focus. Takes a per-item function."},{"name":"icon","description":"One row's drawn glyph — the default one: a consumer `icon` slot replaces it. Takes a per-item function."},{"name":"label","description":"One option's label text (the `label` slot's default). Takes a per-item function."},{"name":"itemDescription","description":"One option's muted second line, its description. Takes a per-item function."}],"states":[{"name":"hasValue","description":"Component-wide: at least one option is chosen."},{"name":"checked","description":"Per row, on `item`, `icon`, `label` and `itemDescription`: that option is chosen. Never on a field part."},{"name":"readonly","description":"Component-wide: the group is `readonly`."},{"name":"disabled","description":"Component-wide while the group is `disabled`; also per row, on the row parts of an option that is disabled on its own."},{"name":"warnings","description":"Component-wide: the group shows warnings and no errors."},{"name":"errors","description":"Component-wide: the group shows errors."},{"name":"focused","description":"Per row, on the row parts: that option's input has focus — any focus, mouse included."},{"name":"focusVisible","description":"Per row, on the row parts: that option's focus is keyboard-visible — where a focus ring belongs."},{"name":"loading","description":"Component-wide: the items are being fetched."}]},"tree":{"bindings":[{"part":"icon","target":"BbBaseRadioIcon"}],"nodes":[{"name":"CommonField","kind":"internal","vocabulary":"BbRadioGroup","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":"OptionsContainer","kind":"internal","vocabulary":"BbRadioGroup","bindings":[{"part":"list","target":"span"},{"part":"item","target":"label"},{"part":"label","target":"span"},{"part":"itemDescription","target":"span"}]},{"name":"BbBaseRadioIcon","kind":"public","cssProps":[{"name":"--accent","documented":false,"readBy":["bb-base-radio-icon","bb-base-radio-icon--errors","bb-base-radio-icon--warnings","bb-base-radio-icon--disabled"]},{"name":"--size","documented":false,"readBy":["bb-base-radio-icon"]},{"name":"--space","documented":false,"readBy":["bb-base-radio-icon"]},{"name":"--ring-color","documented":false,"readBy":["bb-base-radio-icon--focus-visible"]},{"name":"--elev","documented":true,"readBy":["bb-base-radio-icon","bb-base-radio-icon--focus-visible"]},{"name":"--bg","documented":true,"readBy":["bb-base-radio-icon"]},{"name":"--border-color","documented":false,"readBy":["bb-base-radio-icon"]}]}]},"css":{"classes":{"bb-radio-group":["","__empty","__item","__item--*","__item--aligned","__item--description","__item--disabled","__item--focus-visible","__item--focused","__item--input-align-*","__item--input-align-bottom","__item--input-align-center","__item--input-align-top","__item--label-align-*","__item--label-align-bottom","__item--label-align-center","__item--label-align-top","__item--reverse","__item--selected","__item--vertical","__item-description","__label","__list","__list--*","__list--errors","__list--tiles","__list--warnings","__loading"]},"locals":["--color-gray-200","--gap","--hit","--row-gap","--size","--tap-row-gap","--tile-min-width"]},"attrTargets":["div"],"removed":[{"name":"color","new":null,"since":"3.0.0-beta.15","migration":"ai/guides/migration/components/bb-checkbox-group.md","silent":true,"fix":{"kind":"manual"}},{"name":"labelPosition","new":"legendPosition","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-checkbox-group.md","silent":true,"fix":{"kind":"rename"}},{"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":"inputDirection","new":"listLayout","since":"3.0.0-beta.33","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename","valueMap":{"horizontal":"horizontal","vertical":"vertical-stretch"}}},{"name":"noDataText","new":"emptyText","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"no-data","new":"empty","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":"labelPosition","to":"legendPosition","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-checkbox-group.md","fix":{"kind":"rename"}},{"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":"inputDirection","to":"listLayout","since":"3.0.0-beta.33","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename","valueMap":{"horizontal":"horizontal","vertical":"vertical-stretch"}}},{"from":"noDataText","to":"emptyText","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"no-data","to":"empty","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"}}]},
|
|
487
|
+
{"name":"BbRadioGroup","group":"Selection","description":"Coordinates exclusive selection among radio options.","referenceOnly":false,"hasGuide":true,"contract":"ai/BbRadioGroup.md","source":"ai/source/BbRadioGroup.md","props":[{"name":"autofocus","type":"Booleanish | undefined","required":false,"description":"Sets autofocus on page load."},{"name":"compact","type":"boolean | undefined","required":false,"default":"false","description":"Compact density. Swaps `--bb-label-spacing-y` for\n`--bb-label-spacing-y-compact`, so tune a compact group's label gap with\nthe `-compact` token, not the base one."},{"name":"dependencies","type":"unknown[] | undefined","required":false,"description":"Defines an array of dependencies that will trigger actions in the component upon change."},{"name":"depsDebounceTime","type":"number | undefined","required":false,"description":"Timeout used to debounce response to changes to dependencies."},{"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":"emptyText","type":"string | undefined","required":false,"description":"String displayed when there are no items to display."},{"name":"enforceCoherence","type":"boolean | undefined","required":false,"default":"false","description":"If coherence is enforced the input cannot have a modelValue that is incoherent with its current items.\n\ne.g. You cannot set v-model to a user that is not present in the items passed.\n\nmodelValue will be reset upon incoherence.\n\nChecked after every applied, successful load (an empty one included);\na failed load never prunes."},{"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":"failedText","type":"string | undefined","required":false,"default":"the localized `common.failedText` (\"Couldn't load items\")","description":"String displayed in the empty state while the latest load FAILED (the\n`items` provider threw): the twin of `emptyText` for that case."},{"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 each option's label text (the text rendered next to every\ninput) while keeping it accessible to screen readers.\nDoes not affect the fieldset legend — use `hideLegend` for that."},{"name":"hideLegend","type":"boolean | undefined","required":false,"default":"false","description":"Visually hides the legend of the fieldset 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":"Prefix for the ids of each option's input and of the label, description\nand message. 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":"inputPosition","type":"\"left\" | \"center\" | \"right\" | undefined","required":false,"default":"\"left\"","description":"Sets the alignment of the input. Since inputs are inline block they can be aligned just as text can."},{"name":"itemInputAlign","type":"FieldCrossAlign | undefined","required":false,"values":["top","center","bottom"],"description":"Vertical position of each option's control in its row; `'center'` is\nthe middle of the label plus its description. Omitted, it sits on the\nlabel's first line."},{"name":"itemLabelAlign","type":"FieldCrossAlign | undefined","required":false,"values":["top","center","bottom"],"description":"Vertical position of each option's label in its row. Omitted, it stays\nas it is."},{"name":"itemLayout","type":"FieldLayout | undefined","required":false,"default":"'auto'","description":"How each row's input and label sit together — the keywords of `layout`:\n`'auto'`, `'vertical'` (the input above the label), `'horizontal'`\n(50/50), `'label-fill'` (the label takes the row's free space — pair it\nwith `list-layout=\"vertical-stretch\"` and `item-reverse` for a settings\nlist), `'input-fill'`, or a two-word ratio pattern like `'xx xxxxx'`,\nread in on-screen order."},{"name":"itemProps","type":"BbOptionGroupItemProps<T> | undefined","required":false,"description":"ADDITIONAL row fields resolved from each item — never its text or value\n(those stay on `itemText` / `itemValue`). Option groups accept one field:\n\n- `description` — a muted line under the option label, beside the control;\n it may wrap.\n\nEither an object with a path or getter per field\n(`{ description: 'email' }`) or a function returning the fields\n(`(item) => ({ description: item.email })`). Without it no field renders —\nan item's own `description` is never read implicitly — and an empty value\nrenders nothing for that item. The description is announced as the\noption's description, never part of its name. To disable individual\noptions use `selectable`."},{"name":"itemReverse","type":"boolean | undefined","required":false,"default":"false","description":"Swaps each row's input and label from their natural order (input first),\nin every `item-layout`. `reverse` swaps the legend and the options instead."},{"name":"items","type":"T[] | ((context: BbRadioGroupItemsContext) => T[] | Promise<T[]>)","required":true,"description":"The options: an array, or a provider function called with ONE context\nobject and returning the rows, sync or async. The context carries:\n- `reason` — why this call happened: `'initial'` (the first load, on\n mount), `'dependencies'` (a `dependencies` entry or the `items`\n function changed; a retry arrives this way) or `'model'` (the model\n changed from outside and the options cannot resolve it). The group has\n no search field, so it never passes `query`;\n- `modelValue` — the `v-model` as-is;\n- `signal` — an `AbortSignal`, aborted when a newer call starts or the\n group is disposed; pass it to every request.\n\nA provider signals a failure by THROWING, never by returning `[]`: the\nrows are cleared, nothing is pruned, and `#empty` receives the `error`\n(`failed-text` is shown). Zero-argument providers keep working. Annotate\nthe parameter `BbRadioGroupItemsContext`."},{"name":"itemText","type":"ItemAccessor<T, string> | undefined","required":false,"default":"JSON.stringify(item)","description":"Defines a path that returns a property of the object to use as text or a function that returns a string."},{"name":"itemValue","type":"ItemAccessor<T> | undefined","required":false,"default":"the whole item","description":"Defines a path that returns a property of the object to use as value or a function that returns any value."},{"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":"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":"legend","type":"string","required":true,"description":"Text content of the legend."},{"name":"legendMode","type":"\"outside\" | \"inside\" | undefined","required":false,"description":"Legend rendering mode. `'outside'` renders the legend above the fieldset in the normal flow;\n`'inside'` overlays the legend inside the fieldset border.\nFloating mode is not supported for radio groups."},{"name":"legendPosition","type":"\"left\" | \"center\" | \"right\" | undefined","required":false,"description":"Sets the text alignment of the label."},{"name":"listLayout","type":"ListLayout | undefined","required":false,"default":"'horizontal'","values":["horizontal","vertical","vertical-stretch","tiles"],"description":"How the rows sit inside the list: `'horizontal'` (on a line, wrapping,\neach row its own size), `'vertical'` (stacked, each row its own size),\n`'vertical-stretch'` (stacked, each row as wide as the list) or\n`'tiles'` (equal-size boxes, wrapping onto new lines as the field\nnarrows; `--tile-min-width` on `pt:list` sets how narrow a tile gets)."},{"name":"loadingText","type":"string | undefined","required":false,"description":"String displayed while items are being loaded."},{"name":"modelValue","type":"any","required":false,"description":"Used by v-model. Can be any serializable type."},{"name":"modelValueDebounceTime","type":"number | undefined","required":false,"description":"Timeout used to debounce response to changes to modelValue."},{"name":"name","type":"string | undefined","required":false,"description":"Defines the name of the option inputs. Optional: the options live inside a\nsingle component instance, so an omitted name falls back to a generated one\nthat groups them correctly on its own — unique per group, so two groups never\nclear each other's selection, and stable for the group's lifetime. Pass a name\nonly when the value has to be submitted under a known key by a native (non-JS)\nform post."},{"name":"persistentHint","type":"boolean | undefined","required":false,"default":"false","description":"Keeps the hint displayed."},{"name":"pt","type":"GroupPtMap<T> | undefined","required":false,"description":"Passthrough, object form: the same keys as the `pt:*` attributes\nwithout the prefix. See the `pt:<part>` row."},{"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 | ((ctx: PtItemCtx<T, GroupPtState>) => PtItemResult) | undefined","required":false},{"name":"pt:icon:checked","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:focused","type":"PtValue | undefined","required":false},{"name":"pt:icon:focusVisible","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:item","type":"PtValue | ((ctx: PtItemCtx<T, GroupPtState>) => PtItemResult) | undefined","required":false},{"name":"pt:item:checked","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:focused","type":"PtValue | undefined","required":false},{"name":"pt:item:focusVisible","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:readonly","type":"PtValue | undefined","required":false},{"name":"pt:item:warnings","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription","type":"PtValue | ((ctx: PtItemCtx<T, GroupPtState>) => PtItemResult) | undefined","required":false},{"name":"pt:itemDescription:checked","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:disabled","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:errors","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:focused","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:focusVisible","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:loading","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:readonly","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:warnings","type":"PtValue | undefined","required":false},{"name":"pt:label","type":"PtValue | ((ctx: PtItemCtx<T, GroupPtState>) => PtItemResult) | undefined","required":false},{"name":"pt:label:checked","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:focused","type":"PtValue | undefined","required":false},{"name":"pt:label:focusVisible","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:legend","type":"PtValue | undefined","required":false},{"name":"pt:legend:disabled","type":"PtValue | undefined","required":false},{"name":"pt:legend:errors","type":"PtValue | undefined","required":false},{"name":"pt:legend:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:legend:loading","type":"PtValue | undefined","required":false},{"name":"pt:legend:readonly","type":"PtValue | undefined","required":false},{"name":"pt:legend:warnings","type":"PtValue | undefined","required":false},{"name":"pt:list","type":"PtValue | undefined","required":false},{"name":"pt:list:disabled","type":"PtValue | undefined","required":false},{"name":"pt:list:errors","type":"PtValue | undefined","required":false},{"name":"pt:list:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:list:loading","type":"PtValue | undefined","required":false},{"name":"pt:list:readonly","type":"PtValue | undefined","required":false},{"name":"pt:list: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: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":"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 the input is swapped."},{"name":"rules","type":"RuleExpression<any>","required":false,"description":"vee-validate rules for this field. Only inside a `BbForm`."},{"name":"selectable","type":"boolean | ((item: T) => boolean) | undefined","required":false,"default":"true","description":"Defines whether options are selectable.\nCan be a global boolean that affects all options or a function\nthat accepts an item and returns a boolean that only affects that item.\nNon-selectable options are rendered disabled."},{"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":"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 group becomes active (focus/click enters it)."},{"name":"blur","signature":"(event: FocusEvent): void","description":"Emitted when one of the generated radio inputs loses focus.\nForwards the original DOM `FocusEvent`."},{"name":"change","signature":"(event: Event): void","description":"Emitted when a radio option is selected.\nForwards the original DOM `Event` from the radio input."},{"name":"click","signature":"(event: MouseEvent): void","description":"Emitted when one of the generated radio inputs is clicked.\nForwards the original DOM `MouseEvent`."},{"name":"focus","signature":"(event: FocusEvent): void","description":"Emitted when one of the generated radio inputs receives focus.\nForwards the original DOM `FocusEvent`."},{"name":"inactive","signature":"(): void","description":"Emitted when focus/click moves outside the group after it was active.\nUseful for validation-on-blur flows at group level."},{"name":"input","signature":"(event: Event): void","description":"Emitted on native input events from generated radio inputs.\nForwards the original DOM `Event`."},{"name":"keydown","signature":"(event: KeyboardEvent): void","description":"Emitted for keyboard interaction on generated radio inputs.\nForwards the original DOM `KeyboardEvent`."},{"name":"mousedown","signature":"(event: MouseEvent): void","description":"Emitted when a pointing device button is pressed over a radio input.\nForwards the original DOM `MouseEvent`."},{"name":"mouseup","signature":"(event: MouseEvent): void","description":"Emitted when a pointing device button is released over a radio input.\nForwards the original DOM `MouseEvent`."},{"name":"update:modelValue","signature":"(value: any): void","description":"Emitted with the newly selected value when the selection changes."}],"slots":[{"name":"append","type":"object","description":"Content rendered after the last option, inside the options container."},{"name":"description","type":"BbRadioGroupDescriptionSlotProps","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":"empty","type":"{ error: unknown; }","description":"Content shown when no options are available (replaces the default \"no\ndata\" text). `error` is what the latest failed load rejected with,\nuntouched, and `null` when nothing failed — a failed load clears the\nrows, so this slot is where it shows."},{"name":"icon","type":"BbRadioGroupIconSlotProps<T>","fields":["disabled: boolean","readonly: boolean","checked: boolean","focused: boolean","focusVisible: boolean","id: string","name: string","hasErrors: boolean","hasWarnings: boolean","parsedValue: string","value: any","item: T","text: string"],"description":"Replaces the default radio dot icon for each option. Receives the radio\nstate plus the source item and its display text."},{"name":"label","type":"BbRadioGroupLabelSlotProps<T>","fields":["item: T","text: string","checked: boolean","description: string"],"description":"Replaces the default label text for each option."},{"name":"legend","type":"BbRadioGroupLegendSlotProps","fields":["text: string","hasErrors: boolean","hasWarnings: boolean"],"description":"Replaces the default fieldset legend text for the group."},{"name":"loading","type":"object","description":"Content shown while options are loading (replaces the default loading text)."},{"name":"prepend","type":"object","description":"Content rendered before the first option, inside the options container."}],"exposed":[],"models":[{"name":"modelValue","type":"any"}],"cssProps":[{"name":"--gap","value":"24px","selector":".bb-radio-group__list","description":"Space between rows on one line."},{"name":"--row-gap","value":"10px","selector":".bb-radio-group__list","description":"Space between wrapped lines."},{"name":"--tile-min-width","value":"96px","selector":".bb-radio-group__list","description":"How narrow a tile may get before the tiles wrap (`tiles` only)."}],"pt":{"parts":[{"name":"root","description":"The group's container (the fieldset)."},{"name":"legend","description":"The group's heading — the fieldset `<legend>` (the `legend` prop)."},{"name":"description","description":"The muted line under the legend (the `description` prop)."},{"name":"message","description":"The errors / warnings line. 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":"list","description":"The node that lays the rows out (flex + wrap, gaps on `--gap` / `--row-gap`): `pt:list=\"grid grid-cols-3\"` re-lays them, `pt:list=\"[--gap:8px]\"` tightens them. Takes the group-wide states only."},{"name":"item","description":"One option row — a broadcast, resolved per option with its own `checked` / `disabled` / focus. Takes a per-item function."},{"name":"icon","description":"One row's drawn glyph — the default one: a consumer `icon` slot replaces it. Takes a per-item function."},{"name":"label","description":"One option's label text (the `label` slot's default). Takes a per-item function."},{"name":"itemDescription","description":"One option's muted second line, its description. Takes a per-item function."}],"states":[{"name":"hasValue","description":"Component-wide: at least one option is chosen."},{"name":"checked","description":"Per row, on `item`, `icon`, `label` and `itemDescription`: that option is chosen. Never on a field part."},{"name":"readonly","description":"Component-wide: the group is `readonly`."},{"name":"disabled","description":"Component-wide while the group is `disabled`; also per row, on the row parts of an option that is disabled on its own."},{"name":"warnings","description":"Component-wide: the group shows warnings and no errors."},{"name":"errors","description":"Component-wide: the group shows errors."},{"name":"focused","description":"Per row, on the row parts: that option's input has focus — any focus, mouse included."},{"name":"focusVisible","description":"Per row, on the row parts: that option's focus is keyboard-visible — where a focus ring belongs."},{"name":"loading","description":"Component-wide: the items are being fetched."}]},"tree":{"bindings":[{"part":"icon","target":"BbBaseRadioIcon"}],"nodes":[{"name":"CommonField","kind":"internal","vocabulary":"BbRadioGroup","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":"OptionsContainer","kind":"internal","vocabulary":"BbRadioGroup","bindings":[{"part":"list","target":"span"},{"part":"item","target":"label"},{"part":"label","target":"span"},{"part":"itemDescription","target":"span"}]},{"name":"BbBaseRadioIcon","kind":"public","cssProps":[{"name":"--accent","documented":false,"readBy":["bb-base-radio-icon","bb-base-radio-icon--errors","bb-base-radio-icon--warnings","bb-base-radio-icon--disabled"]},{"name":"--size","documented":false,"readBy":["bb-base-radio-icon"]},{"name":"--space","documented":false,"readBy":["bb-base-radio-icon"]},{"name":"--ring-color","documented":false,"readBy":["bb-base-radio-icon--focus-visible"]},{"name":"--elev","documented":true,"readBy":["bb-base-radio-icon","bb-base-radio-icon--focus-visible"]},{"name":"--bg","documented":true,"readBy":["bb-base-radio-icon"]},{"name":"--border-color","documented":false,"readBy":["bb-base-radio-icon"]}]}]},"css":{"classes":{"bb-radio-group":["","__empty","__item","__item--*","__item--aligned","__item--description","__item--disabled","__item--focus-visible","__item--focused","__item--input-align-*","__item--input-align-bottom","__item--input-align-center","__item--input-align-top","__item--label-align-*","__item--label-align-bottom","__item--label-align-center","__item--label-align-top","__item--reverse","__item--selected","__item--vertical","__item-description","__label","__list","__list--*","__list--errors","__list--tiles","__list--warnings","__loading"]},"locals":["--color-gray-200","--gap","--hit","--row-gap","--size","--tap-row-gap","--tile-min-width"]},"attrTargets":["div"],"removed":[{"name":"color","new":null,"since":"3.0.0-beta.15","migration":"ai/guides/migration/components/bb-checkbox-group.md","silent":true,"fix":{"kind":"manual"}},{"name":"labelPosition","new":"legendPosition","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-checkbox-group.md","silent":true,"fix":{"kind":"rename"}},{"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":"inputDirection","new":"listLayout","since":"3.0.0-beta.33","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename","valueMap":{"horizontal":"horizontal","vertical":"vertical-stretch"}}},{"name":"noDataText","new":"emptyText","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"no-data","new":"empty","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":"labelPosition","to":"legendPosition","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-checkbox-group.md","fix":{"kind":"rename"}},{"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":"inputDirection","to":"listLayout","since":"3.0.0-beta.33","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename","valueMap":{"horizontal":"horizontal","vertical":"vertical-stretch"}}},{"from":"noDataText","to":"emptyText","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"no-data","to":"empty","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"}}]},
|
|
488
488
|
{"name":"BbRating","group":"Selection","description":"Collects scalar ratings through interactive icons.","referenceOnly":false,"hasGuide":true,"contract":"ai/BbRating.md","source":"ai/source/BbRating.md","props":[{"name":"autofocus","type":"Booleanish | undefined","required":false,"description":"Sets autofocus on page load."},{"name":"clearable","type":"boolean | undefined","required":false,"default":"false","description":"Allows clearing the selected rating by clicking the current value."},{"name":"compact","type":"boolean | undefined","required":false,"default":"false","description":"Compact density. Swaps `--bb-label-spacing-y` for\n`--bb-label-spacing-y-compact`, so tune a compact group's label gap with\nthe `-compact` token, not the base one."},{"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":"hideLegend","type":"boolean | undefined","required":false,"default":"false","description":"Visually hides the legend of the fieldset 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":"Prefix for the ids of each option's input and of the label, description\nand message. 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":"inputPosition","type":"\"left\" | \"center\" | \"right\" | undefined","required":false,"default":"\"left\"","description":"Sets the alignment of the input. Since inputs are inline block they can be aligned just as text can."},{"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":"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":"legend","type":"string","required":true,"description":"Text content of the legend."},{"name":"legendMode","type":"\"outside\" | \"inside\" | undefined","required":false,"description":"Legend rendering mode. `'outside'` renders the legend above the fieldset in the normal flow;\n`'inside'` overlays the legend inside the fieldset border.\nFloating mode is not supported for rating groups."},{"name":"legendPosition","type":"\"left\" | \"center\" | \"right\" | undefined","required":false,"description":"Sets the text alignment of the legend."},{"name":"modelValue","type":"number | null | undefined","required":false,"description":"Used by v-model."},{"name":"name","type":"string | undefined","required":false,"description":"Defines the name of the star radio inputs. Optional: the stars live inside a\nsingle component instance, so an omitted name falls back to a generated one\nthat groups them correctly on its own. Pass a name only when the value has to\nbe submitted under a known key by a native (non-JS) form post."},{"name":"persistentHint","type":"boolean | undefined","required":false,"default":"false","description":"Keeps the hint displayed."},{"name":"pt","type":"PtMap<BbRatingPtPart, BbRatingPtState> | undefined","required":false,"description":"Passthrough, object form: the same keys as the `pt:*` attributes\nwithout the prefix. See the `pt:<part>` row."},{"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: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: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: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: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: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: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: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: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: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":"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 the input is swapped."},{"name":"rules","type":"RuleExpression<number | null>","required":false,"description":"vee-validate rules for this field. Only inside a `BbForm`."},{"name":"size","type":"number | CssSize | keyof Sizes | undefined","required":false,"default":"'md'","description":"Defines the component size.\n\nAccepted values:\n- A key from the provided size map (`keyof T`), e.g. `'sm' | 'md' | 'lg'`\n- A custom CSS size string (e.g. `'20px'`, `'1.5rem'`, `'2em'`)\n- A number, typically interpreted as pixels by size parsers"},{"name":"stars","type":"number | undefined","required":false,"default":"5","description":"Maximum number of stars to render and maximum value of the component."},{"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":"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 rating becomes active (focus/click enters it)."},{"name":"blur","signature":"(event: FocusEvent): void","description":"Emitted when a star input loses focus.\nForwards the original DOM `FocusEvent`."},{"name":"change","signature":"(event: Event): void","description":"Emitted when the selected rating changes.\nForwards the original DOM `Event`."},{"name":"click","signature":"(event: MouseEvent): void","description":"Emitted when a star input receives a click.\nForwards the original DOM `MouseEvent`."},{"name":"focus","signature":"(event: FocusEvent): void","description":"Emitted when a star input gains focus.\nForwards the original DOM `FocusEvent`."},{"name":"inactive","signature":"(): void","description":"Emitted when focus/click moves outside the rating after it was active."},{"name":"input","signature":"(event: Event): void","description":"Emitted on native input events from the star inputs.\nForwards the original DOM `Event`."},{"name":"keydown","signature":"(event: KeyboardEvent): void","description":"Emitted for keyboard interaction on a star input.\nForwards the original DOM `KeyboardEvent`."},{"name":"mousedown","signature":"(event: MouseEvent): void","description":"Emitted when a pointing device button is pressed over a star input.\nForwards the original DOM `MouseEvent`."},{"name":"mouseup","signature":"(event: MouseEvent): void","description":"Emitted when a pointing device button is released over a star input.\nForwards the original DOM `MouseEvent`."},{"name":"update:modelValue","signature":"(value: number | null): void","description":"Emitted with the selected rating (1 to `stars`) when clicked. Emits `null`\nonly when `clearable` is enabled and the already-selected star is clicked."}],"slots":[{"name":"append","type":"object","description":"Content rendered after the row of rating stars."},{"name":"description","type":"BbRatingDescriptionSlotProps","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":"icon","type":"BbRatingIconSlotProps","fields":["checked: boolean","disabled: boolean","id?: string","size: CssSize","value: number"],"description":"Replaces the default star SVG for each rating option."},{"name":"legend","type":"BbRatingLegendSlotProps","fields":["text: string","hasErrors: boolean","hasWarnings: boolean"],"description":"Replaces the default fieldset legend text rendered above the rating stars."},{"name":"prepend","type":"object","description":"Content rendered before the row of rating stars."}],"exposed":[],"models":[{"name":"modelValue","type":"number | null | undefined"}],"cssProps":[{"name":"--accent","value":"var(--bb-primary)","selector":".bb-rating","description":"a filled star, and the hover preview"},{"name":"--empty","value":"var(--bb-panel)","selector":".bb-rating","description":"an unfilled star"},{"name":"--border-color","value":"var(--bb-text-faint)","selector":".bb-rating","description":"Every star's outline. `--bb-text-faint`, not `--bb-border` (Q56.21b): an empty star is `--empty` (the panel) inside it, so the outline alone draws the star, and a hairline read ~1.5:1 — under 3:1 in both schemes."},{"name":"--space","value":"0px","selector":".bb-rating","description":"Gap between stars. On the root (Q56.21a) so `pt:root` reaches it; the star row inherits it. Named `--space`, not `--spacing`: Tailwind v4 builds its whole spacing scale on a variable of that name, and a local of the same name zeroed every spacing utility used inside the slots."},{"name":"--ring-color","value":"var(--bb-ring)","selector":".bb-rating__stars","description":"focus ring around the focused star"},{"name":"--size","value":"24px","selector":".bb-rating__stars","description":"one star's box; overridden inline from the `size` prop"}],"pt":{"parts":[{"name":"root","description":"The rating's container: the legend, the stars and the lines under them."},{"name":"label","description":"The rating's name — the fieldset `<legend>`, from the `legend` prop (the part keeps the family's word)."},{"name":"description","description":"The muted line under the legend (the `description` prop)."},{"name":"message","description":"The errors / warnings line. A node of its own: it can show at the same time as `hint`."},{"name":"hint","description":"The helper line (the `hint` prop)."},{"name":"item","description":"One star, the choice you click: the hidden radio, its screen-reader text and the glyph — a broadcast resolved per star. The hook for the hit area, the focus ring, spacing and the disabled cursor. NOT for colour: a `text-*` class here freezes the hover preview and the error tint; set `--accent` / `--empty` / `--border-color` on `root`. The glyph has no part of its own (dropped 2026-09-23, before any release): its size is the `size` prop, its colour the variables."}],"states":[{"name":"hasValue","description":"Component-wide: a rating is set."},{"name":"selected","description":"Per node, on `item`: a filled star."},{"name":"readonly","description":"Component-wide: the rating is `readonly`."},{"name":"disabled","description":"Component-wide while the rating is `disabled`; also per node, on `item`: a star that cannot be picked."},{"name":"warnings","description":"Component-wide: the rating shows warnings and no errors."},{"name":"errors","description":"Component-wide: the rating shows errors."}]},"tree":{"bindings":[{"part":"item","target":"label.bb-rating__item"}],"nodes":[{"name":"BbIcon","kind":"public","cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]},{"name":"CommonField","kind":"internal","vocabulary":"BbRating","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"}]}]},"css":{"classes":{"bb-rating":["","__icon","__item","__item--disabled","__item--empty","__item--filled","__item--readonly","__label-text","__options","__stars","__stars--disabled","__stars--errors","__stars--forced-clear","__stars--has-value","__stars--readonly","__stars--warnings"]},"locals":["--accent","--bg","--border-color","--color-gray-200","--empty","--hit","--ring-color","--size","--space","--star-size","--tap-gap"]},"attrTargets":["div"],"removed":[{"name":"color","new":null,"since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-rating.md","silent":true,"fix":{"kind":"manual"}},{"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-rating.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-rating.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"}}]},
|
|
489
489
|
{"name":"BbSelect","group":"Selection","description":"Selects one or many options from structured data.","referenceOnly":false,"hasGuide":true,"contract":"ai/BbSelect.md","source":"ai/source/BbSelect.md","props":[{"name":"adaptive","type":"boolean | undefined","required":false,"default":"`config.adaptive` (`true`)","description":"When `true`, the options panel opens as a bottom off-canvas sheet on mobile\nviewports instead of a floating popover; on desktop it stays a popover.\n\nWhen unset, falls back to the global `config.adaptive`."},{"name":"append:icon","type":"string | undefined","required":false,"default":"the chevron-down glyph","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":"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":"dependencies","type":"unknown[] | undefined","required":false,"description":"Defines an array of dependencies that will trigger actions in the component upon change."},{"name":"depsDebounceTime","type":"number | undefined","required":false,"default":"0","description":"Timeout used to debounce response to changes to dependencies."},{"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":"disableWriting","type":"boolean | \"auto\" | \"mobile\" | \"desktop\" | undefined","required":false,"default":"'auto'","description":"Controls whether the search input is shown inside the dropdown panel.\n`true` removes it everywhere; `'mobile'` / `'desktop'` remove it on that\nplatform only; `'auto'` removes it when an **array** `items` renders fewer\noptions than the plugin's `autoDisableWritingThreshold` (default `6`;\ndisabled options count, group headers don't). `'auto'` is decided when the\npanel opens and held until it closes, never applies to a provider\n(function) `items`, never when you listen to `option:add` (a creatable\nselect keeps its field), and is off when the threshold is `0`. There is\nno global switch: hiding or forcing a field is this prop, per instance."},{"name":"emptyText","type":"string | undefined","required":false,"description":"String displayed when there are no items to display."},{"name":"enforceCoherence","type":"boolean | undefined","required":false,"default":"false","description":"If coherence is enforced the input cannot have a modelValue that is incoherent\nwith its current items. modelValue will be reset upon incoherence.\n\nChecked after every applied, successful load whose `reason` is not\n`'search'` (an empty one included), against the FETCHED rows only (a\n`stash` does not count); a search or a failed load never prunes."},{"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":"failedText","type":"string | undefined","required":false,"default":"the localized `common.failedText` (\"Couldn't load items\")","description":"String displayed in the empty state while the latest load FAILED (the\nprovider threw): the twin of `emptyText` for that case."},{"name":"filterBy","type":"string[] | undefined","required":false,"default":"[]","description":"Property paths used to filter options when the user types in the search input.\nWhen empty (default) options are matched against their display text.\nWhen non-empty the provided paths are searched instead of the display text.\nTo disable filtering entirely set `disableWriting` so the user cannot type a query."},{"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":"groupBy","type":"string | ((item: T) => string | number | symbol) | undefined","required":false,"description":"Path to item property for grouping options."},{"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":"headerHeight","type":"number | undefined","required":false,"description":"Height of group headers in the listbox (px). Defaults to 32px (24px\ncompact; 36px / 32px on mobile viewports). Only applies when `groupBy`\nis set. An explicit value wins on every viewport."},{"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":"itemHeight","type":"number | undefined","required":false,"default":"28","description":"Height of the options in the listbox (px). Defaults to 28px (24px\ncompact; 44px / 36px on mobile viewports). An explicit value wins on\nevery viewport."},{"name":"itemProps","type":"BbSelectItemProps<T> | undefined","required":false,"description":"ADDITIONAL row fields resolved from each item — never its text or value\n(those stay on `itemText` / `itemValue`). Accepted fields:\n\n- `description` — a muted line under the option label. Setting it gives\n every row a fixed two-line height (the list is virtualized); the\n description stays on one line and ellipsizes. Announced as the option's\n description, never part of its name; matched by the search with the text\n when `filterBy` is empty.\n- `prepend:icon` — an icon before the label.\n- `append:icon` — an icon after the label; on the selected row the check\n takes its place.\n\nEither an object with a path or getter per field\n(`{ description: 'email', 'prepend:icon': 'icon' }`) or a function\nreturning the fields (`(item) => ({ description: item.email })`). Without\nit no field renders — nothing is read off the item implicitly — and an empty\nvalue renders nothing for that item. Never shown in the trigger or the\nchips. To disable individual options use `selectable`."},{"name":"items","type":"T[] | ((context: BbSelectItemsContext) => T[] | Promise<T[]>)","required":true,"description":"The options: an array, or a provider function called with ONE context\nobject and returning the rows, sync or async. The context carries:\n- `query` — what the user typed, `''` until they type;\n- `reason` — why this call happened: `'search'` (the user typed, and\n nothing else), `'initial'` (the first load, on mount or on the first\n open), `'dependencies'` (a `dependencies` entry or the `items` function\n changed; a retry arrives this way), `'model'` (the model changed from\n outside and the options cannot resolve it), `'reopen'` (the panel\n reopened over a searched list). To resolve the selection by id, branch\n on `reason !== 'search'`;\n- `modelValue` — the `v-model` as-is;\n- `signal` — an `AbortSignal`, aborted when a newer call starts or the\n component is disposed; pass it to every request.\n\nA provider signals a failure by THROWING, never by returning `[]`: the\nrows are cleared, nothing is pruned, and `#empty` receives the `error`\n(`failed-text` is shown). A newer call aborts the one in flight, and the\naborted call's rejection or resolution is dropped silently.\nZero-argument providers keep working. Annotate the parameter\n`BbSelectItemsContext`."},{"name":"itemText","type":"ItemAccessor<T, string> | undefined","required":false,"default":"JSON.stringify(item)","description":"Defines a path that returns a property of the object to use as text or a function\nthat returns a string."},{"name":"itemValue","type":"ItemAccessor<T> | undefined","required":false,"default":"the whole item","description":"Defines a path that returns a property of the object to use as value or a function\nthat returns any value."},{"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":"loadingText","type":"string | undefined","required":false,"description":"String displayed while items are being loaded."},{"name":"max","type":"number | undefined","required":false,"description":"Maximum number of selectable items when the multiple flag is set."},{"name":"maxSelectedLabels","type":"number | undefined","required":false,"default":"Infinity","description":"Maximum number of labels shown before collapsing to a count summary.\nUnset, the labels collapse only when they overflow the field."},{"name":"modelValue","type":"any","required":false,"description":"Used by v-model. Can be any serializable type."},{"name":"modelValueDebounceTime","type":"number | undefined","required":false,"default":"0","description":"Timeout used to debounce response to changes to modelValue."},{"name":"multiple","type":"boolean | undefined","required":false,"default":"false","description":"Allows the selection of multiple items."},{"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 mobile.\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."},{"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":"prefill","type":"boolean | \"interaction\" | undefined","required":false,"default":"'interaction'","description":"Controls when items are pre-loaded.\n`'interaction'` loads on the first user interaction, `true` loads\nimmediately on mount, `false` is *search-first*: with a provider, nothing\nis fetched until the user types — opening alone does not load, and the\npanel shows a \"search to begin\" hint meanwhile.\n\n`false` falls back to loading on open when the user could not otherwise\nreach the options: array `items` (resolved on mount regardless), or\n`disable-writing` (no search field to type into). When the input has a\nvalue, it always loads immediately so the selection's text can render."},{"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":"PtItemMap<BbSelectPtPart, BbSelectOptionPtPart, BbSelectPtState, T> | 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:badge","type":"PtValue | ((ctx: PtItemCtx<T, BbSelectPtState>) => 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:loading","type":"PtValue | undefined","required":false},{"name":"pt:badge:open","type":"PtValue | undefined","required":false},{"name":"pt:badge:readonly","type":"PtValue | undefined","required":false},{"name":"pt:badge:selected","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: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: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:comma","type":"PtValue | ((ctx: PtItemCtx<T, BbSelectPtState>) => 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:loading","type":"PtValue | undefined","required":false},{"name":"pt:comma:open","type":"PtValue | undefined","required":false},{"name":"pt:comma:readonly","type":"PtValue | undefined","required":false},{"name":"pt:comma:selected","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: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:footer","type":"PtValue | undefined","required":false},{"name":"pt:footer:disabled","type":"PtValue | undefined","required":false},{"name":"pt:footer:errors","type":"PtValue | undefined","required":false},{"name":"pt:footer:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:footer:loading","type":"PtValue | undefined","required":false},{"name":"pt:footer:open","type":"PtValue | undefined","required":false},{"name":"pt:footer:readonly","type":"PtValue | undefined","required":false},{"name":"pt:footer:selected","type":"PtValue | undefined","required":false},{"name":"pt:footer: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:itemDescription","type":"PtValue | ((ctx: PtItemCtx<T, BbSelectPtState>) => PtItemResult) | undefined","required":false},{"name":"pt:itemDescription:disabled","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:errors","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:loading","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:open","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:readonly","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:selected","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:warnings","type":"PtValue | undefined","required":false},{"name":"pt:itemIcon","type":"PtValue | ((ctx: PtItemCtx<T, BbSelectPtState>) => PtItemResult) | undefined","required":false},{"name":"pt:itemIcon:disabled","type":"PtValue | undefined","required":false},{"name":"pt:itemIcon:errors","type":"PtValue | undefined","required":false},{"name":"pt:itemIcon:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:itemIcon:loading","type":"PtValue | undefined","required":false},{"name":"pt:itemIcon:open","type":"PtValue | undefined","required":false},{"name":"pt:itemIcon:readonly","type":"PtValue | undefined","required":false},{"name":"pt:itemIcon:selected","type":"PtValue | undefined","required":false},{"name":"pt:itemIcon:warnings","type":"PtValue | undefined","required":false},{"name":"pt:itemText","type":"PtValue | ((ctx: PtItemCtx<T, BbSelectPtState>) => PtItemResult) | undefined","required":false},{"name":"pt:itemText:disabled","type":"PtValue | undefined","required":false},{"name":"pt:itemText:errors","type":"PtValue | undefined","required":false},{"name":"pt:itemText:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:itemText:loading","type":"PtValue | undefined","required":false},{"name":"pt:itemText:open","type":"PtValue | undefined","required":false},{"name":"pt:itemText:readonly","type":"PtValue | undefined","required":false},{"name":"pt:itemText:selected","type":"PtValue | undefined","required":false},{"name":"pt:itemText: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:list","type":"PtValue | undefined","required":false},{"name":"pt:list:disabled","type":"PtValue | undefined","required":false},{"name":"pt:list:errors","type":"PtValue | undefined","required":false},{"name":"pt:list:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:list:loading","type":"PtValue | undefined","required":false},{"name":"pt:list:open","type":"PtValue | undefined","required":false},{"name":"pt:list:readonly","type":"PtValue | undefined","required":false},{"name":"pt:list:selected","type":"PtValue | undefined","required":false},{"name":"pt:list: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:option","type":"PtValue | ((ctx: PtItemCtx<T, BbSelectPtState>) => PtItemResult) | undefined","required":false},{"name":"pt:option:disabled","type":"PtValue | undefined","required":false},{"name":"pt:option:errors","type":"PtValue | undefined","required":false},{"name":"pt:option:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:option:loading","type":"PtValue | undefined","required":false},{"name":"pt:option:open","type":"PtValue | undefined","required":false},{"name":"pt:option:readonly","type":"PtValue | undefined","required":false},{"name":"pt:option:selected","type":"PtValue | undefined","required":false},{"name":"pt:option: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":"queryDebounceTime","type":"number | undefined","required":false,"default":"500","description":"Time to wait when the user stops writing in the input before querying data."},{"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<any>","required":false,"description":"vee-validate rules for this field. Only inside a `BbForm`."},{"name":"selectable","type":"boolean | ((item: T) => boolean) | undefined","required":false,"default":"true","description":"Defines whether options are selectable.\nCan be a global boolean that affects all options or a function\nthat accepts an item and returns a boolean that only affects that item.\nNon-selectable options are rendered disabled."},{"name":"selectedLabelsFn","type":"((count: number) => string) | undefined","required":false,"description":"Function that returns a string to be displayed when the number of selected labels\nis greater than `maxSelectedLabels`."},{"name":"stash","type":"boolean | undefined","required":false,"default":"false","description":"Adds a stash to accumulate selected values across searches: a picked\noption stays resolvable (its chip keeps its text) when a later search or\na failed load no longer returns it. The stash follows the model — an\nunselect, a chip ✕, a parent write or an `enforce-coherence` prune drops\nthe row — and it is NOT evidence a pick is still valid: coherence checks\nthe model against the FETCHED rows only, so a `dependencies` reload whose\nresult lacks a stashed pick still prunes it."},{"name":"transitionDuration","type":"number | undefined","required":false,"default":"250","description":"How long the transition has to last in milliseconds."},{"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 select becomes active (focus enters it)."},{"name":"blur","signature":"(event: FocusEvent): void","description":"Emitted when the activator loses focus. Forwards the original DOM `FocusEvent`."},{"name":"change","signature":"(event: Event): void","description":"Emitted on the native `change` event. Forwards the original DOM `Event`."},{"name":"click","signature":"(event: MouseEvent): void","description":"Emitted when the activator is clicked. Forwards the original DOM `MouseEvent`."},{"name":"focus","signature":"(event: FocusEvent): void","description":"Emitted when the activator receives focus. Forwards the original DOM `FocusEvent`."},{"name":"hidden","signature":"(): void","description":"Emitted once the options surface has finished closing."},{"name":"hide","signature":"(): void","description":"Emitted as soon as the options surface starts to close."},{"name":"inactive","signature":"(): void","description":"Emitted when focus moves outside the whole select after it was active."},{"name":"input","signature":"(event: Event): void","description":"Emitted on native `input` events from the search field. Forwards the DOM `Event`."},{"name":"option:add","signature":"(text: string): void","description":"Emitted with the typed text when the user confirms a value that is not in\nthe list (Enter in the search field). Binding it keeps the search field\nwritable, which makes the select creatable."},{"name":"show","signature":"(): void","description":"Emitted as soon as the options surface starts to open (the popover, or the sheet on a phone)."},{"name":"shown","signature":"(): void","description":"Emitted once the options surface is open and its open transition has finished."},{"name":"update:modelValue","signature":"(value: any): void","description":"Emitted with the new value whenever `v-model` changes."}],"slots":[{"name":"append","type":"{ query: string; focus: () => void; close: () => Promise<void>; }","description":"Content appended inside the input field, after the value area."},{"name":"append:outer","type":"{ query: string; close: () => Promise<void>; }","description":"Content appended outside the input field wrapper."},{"name":"chip","type":"BbSelectChipSlotProps<T>","fields":["item: T","text: string","value: any","disabled: boolean","deselect: () => void"],"description":"Replaces the default badge rendered for each selection in `multiple` mode.\nNot called in `comma` mode, nor for the collapsed \"+N\" summary."},{"name":"description","type":"BbSelectDescriptionSlotProps","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":"empty","type":"{ query: string; focus: () => void; error: unknown; }","description":"Content shown when no options match the query or the list is empty.\n`error` is what the latest failed load rejected with, untouched (an\n`Error`, a `Response`, anything thrown; a nullish rejection becomes an\n`Error`), and `null` when nothing failed — the rows are cleared on a\nfailure, so this slot is where it shows."},{"name":"footer","type":"BbSelectPanelSlotProps","fields":["close: () => Promise<void>","clear: () => void","focus: () => void","query: string","selectedOptions: BbSelectResolvedOption[]"],"description":"Content pinned to the bottom of the options panel, below the options list.\nRendered in both the desktop popover and the adaptive sheet."},{"name":"group","type":"BbSelectGroupSlotProps<T>","fields":["text: string","item: T","index: number","length: number","disabled: boolean"],"description":"Replaces the default group header rendered above grouped options."},{"name":"header","type":"BbSelectPanelSlotProps","fields":["close: () => Promise<void>","clear: () => void","focus: () => void","query: string","selectedOptions: BbSelectResolvedOption[]"],"description":"Content pinned to the top of the options panel, above the search field.\nRendered in both the desktop popover and the adaptive sheet."},{"name":"label","type":"BbSelectLabelSlotProps","fields":["text: string","hasErrors: boolean","hasWarnings: boolean"],"description":"Replaces the default label text rendered above the input."},{"name":"loading","type":"{ query: string; }","description":"Content shown inside the options dropdown while items are loading."},{"name":"option","type":"BbSelectOptionSlotProps<T>","fields":["disabled: boolean","focused: boolean","index: number","hasErrors?: boolean","item: T","loading: boolean","selected: boolean","text: string","value: any","description: string"],"description":"Replaces the default rendering of each option row in the dropdown."},{"name":"prefix","type":"object","description":"Content rendered as an inline prefix inside the input field."},{"name":"prepend","type":"{ query: string; focus: () => void; close: () => Promise<void>; }","description":"Content prepended inside the input field, before the value area."},{"name":"prepend:outer","type":"{ query: string; close: () => Promise<void>; }","description":"Content prepended outside the input field wrapper."},{"name":"suffix","type":"object","description":"Content rendered as an inline suffix inside the input field."}],"exposed":[],"models":[{"name":"modelValue","type":"any"}],"cssProps":[{"name":"--compensation-multiplier","value":"0.3","selector":".bb-select__field","description":"Fraction of the shell's inner padding the chips 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; a `class` on the component lands here. (The options surface is `panel`.)"},{"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":"activator","description":"The button you act on to open the options — the field's control (not a text field: `data-test` fits here, `autocomplete` does not). The chevron is chrome. It is `activator`, not the family's `input`: the field itself is a button (the date / time inputs' trigger is the same word)."},{"name":"input","description":"The search field inside the options surface, when it shows one (see `disable-writing`) — handed to the `BbSelectPopover` as its own `pt:input`. Its ✕ is chrome."},{"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 ✕ in the field that empties the selection (`clearable`) — one node, never a chip's own ✕."},{"name":"panel","description":"The options surface — the popover's painted bubble on desktop, the sheet itself on a phone."},{"name":"sheet","description":"The bottom sheet the options open in on a phone only."},{"name":"header","description":"The band around your `#header` slot: at the top of the flyout on desktop, the sheet's header on a phone."},{"name":"footer","description":"The band around your `#footer` slot: at the bottom of the flyout on desktop, the sheet's footer on a phone."},{"name":"list","description":"The `role=\"listbox\"` node that holds the options. Virtualised: its height is written inline and its rows are positioned by the list, which limits what a layout utility can do there. The listbox's groups and the chips are not parts."},{"name":"option","description":"One listbox option — a broadcast resolved per option. Also takes a per-item function, called with the option's raw item."},{"name":"itemText","description":"An option's label — resolved with that option's states. A custom `#option` slot replaces it. Also takes a per-item function."},{"name":"itemIcon","description":"An option's prepend / append icons (`itemProps`) — resolved with that option's states. Also takes a per-item function."},{"name":"itemDescription","description":"An option's second line (its description) — resolved with that option's states. A custom `#option` slot replaces it. Also takes a per-item function."},{"name":"badge","description":"Each selected value's `BbBadge` root with `multiple` — a broadcast resolved per value, on the field's chips and on the phone sheet's. The badge's own ✕ is chrome, never `clear`. In the field, not rendered when the `#chip` slot replaces it, nor in `comma` mode; the sheet's chips are always badges."},{"name":"comma","description":"Each selected value with `multiple` and `comma` — a broadcast resolved per value."}],"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 `option` and its `item-*` parts: a chosen option."},{"name":"readonly","description":"Component-wide: the control is `readonly` — shown, focusable, not editable."},{"name":"disabled","description":"Component-wide while the select is `disabled`; also per node, on `option` and its `item-*` parts: an option that 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":"open","description":"Component-wide: the options surface is showing."},{"name":"loading","description":"Component-wide: `loading` is on; the box shows its `spinner`."}]},"tree":{"bindings":[{"part":"badge","target":"CommonField"},{"part":"activator","target":"input.bb-select__activator"},{"part":"badge","target":"input.bb-select__activator"},{"part":"comma","target":"span.bb-select__comma"},{"part":"badge","target":"span.bb-select__comma"},{"part":"badge","target":"BbBadge"},{"part":"controlAttrs","target":"input"},{"part":"badge","target":"input"}],"forwards":[{"to":"BbSelectPopover","mapping":"{ panel: 'panel', sheet: 'sheet', header: 'header', footer: 'footer', input: 'input', list: 'list', option: 'option', itemText: 'itemText', itemIcon: 'itemIcon', itemDescription: 'itemDescription' }"}],"nodes":[{"name":"CommonField","kind":"internal","vocabulary":"BbSelect","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":"BbSelect","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":"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":"BbSelectPopover","kind":"public","vocabulary":"BbSelectPopover","bindings":[{"part":"input","target":"input.bb-select-popover__input"},{"part":"clear","target":"ClearableButton"},{"part":"panel","target":"CommonPopover"},{"part":"root","target":"CommonPopover"},{"part":"header","target":"div.bb-select-popover__header"},{"part":"footer","target":"div.bb-select-popover__footer"}],"forwards":[{"to":"BbOffCanvas","mapping":"{ header: 'header', footer: 'footer', panel: 'root', sheet: 'root' }"}],"cssProps":[{"name":"--bg","documented":false,"readBy":["bb-listbox__outer-container"]},{"name":"--min-size","documented":false},{"name":"--px","documented":false},{"name":"--clear-size","documented":false}],"children":[{"name":"BbBadge","kind":"public","repeated":true,"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}]},{"name":"BbIcon","kind":"public","repeated":true,"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":"ClearableButton","kind":"internal","repeated":true},{"name":"CommonPopover","kind":"internal"},{"name":"ErrorIcon","kind":"internal","repeated":true,"cssProps":[{"name":"--accent","documented":false,"readBy":["bb-error-icon"]}]},{"name":"WarningIcon","kind":"internal","repeated":true,"cssProps":[{"name":"--accent","documented":false,"readBy":["bb-warning-icon"]}]},{"name":"ListBox","kind":"internal","children":[{"name":"FlatListBox","kind":"internal","vocabulary":"BbSelectPopover","bindings":[{"part":"list","target":"span.bb-listbox__list"},{"part":"option","target":"span.bb-listbox__option"},{"part":"itemIcon","target":"BbIcon"},{"part":"itemText","target":"span.bb-listbox__item-text"},{"part":"itemDescription","target":"span.bb-listbox__item-description"}],"children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]},{"name":"ErrorIcon","kind":"internal","repeated":true,"cssProps":[{"name":"--accent","documented":false,"readBy":["bb-error-icon"]}]}]},{"name":"GroupedListBox","kind":"internal","vocabulary":"BbSelectPopover","bindings":[{"part":"list","target":"span.bb-listbox__list"},{"part":"option","target":"span.bb-listbox__option"},{"part":"itemIcon","target":"BbIcon"},{"part":"itemText","target":"span.bb-listbox__item-text"},{"part":"itemDescription","target":"span.bb-listbox__item-description"}],"children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]},{"name":"ErrorIcon","kind":"internal","repeated":true,"cssProps":[{"name":"--accent","documented":false,"readBy":["bb-error-icon"]}]}]}]},{"name":"BbSmoothHeight","kind":"public"}]}]},"css":{"classes":{"bb-select":["","__activator","__badge","__chips-row","__chips-row--chips","__chips-row--hidden","__comma","__display-value","__field","__field--disabled","__field--readonly","__field--shown","__max-reached","__placeholder","__value"]},"locals":["--color-gray-200","--compensation-multiplier"]},"attrTargets":["div","input"],"removed":[{"name":"allowWriting","new":"disableWriting","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-select.md","silent":true,"fix":{"kind":"invert","valueMap":{"not-mobile":"mobile"}}},{"name":"showChevron","new":null,"since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-select.md","silent":true,"fix":{"kind":"remove"}},{"name":"updateOnAnimationFrame","new":null,"since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-select.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-select.md","silent":true,"fix":{"kind":"rename"}},{"name":"noDataText","new":"emptyText","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"no-data","new":"empty","surface":"slot","since":"3.0.0-beta.41","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":"allowWriting","to":"disableWriting","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-select.md","fix":{"kind":"invert","valueMap":{"not-mobile":"mobile"}}},{"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-select.md","fix":{"kind":"rename"}},{"from":"noDataText","to":"emptyText","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"no-data","to":"empty","surface":"slot","since":"3.0.0-beta.41","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"}}]},
|
|
490
|
-
{"name":"BbSelectPopover","group":"Selection","description":"Provides popover-driven option selection and search.","referenceOnly":false,"hasGuide":true,"contract":"ai/BbSelectPopover.md","source":"ai/source/BbSelectPopover.md","props":[{"name":"activator","type":"Record<string, any> | HTMLElement | null | undefined","required":false,"description":"External activator element or component ref.\nWhen provided, the activator slot is not rendered and event listeners\nare attached programmatically to the referenced element."},{"name":"adaptive","type":"boolean | undefined","required":false,"default":"`config.adaptive` (`true`)","description":"When `true`, the panel opens as a bottom off-canvas sheet on mobile viewports\ninstead of a floating popover; on desktop it stays a popover. The sheet reuses\nthe same search field and options list, adding a representation of the current\nselection between them. Mirrors the adaptive behaviour of `BbPopover`/`BbDropdown`.\n\nWhen unset, falls back to the global `config.adaptive`."},{"name":"anchor","type":"Record<string, any> | HTMLElement | null | undefined","required":false,"default":"null","description":"Override the element used for popover positioning and width measurement.\nUseful when the focusable activator is narrower than its visual container\n(e.g. a button inside a wrapper). Falls back to `activatorEl` when omitted."},{"name":"ariaDescribedby","type":"string | string[] | undefined","required":false,"description":"Space-separated IDREF(s) that describe this field for assistive technologies.\nAccepts either a string or array of ids."},{"name":"ariaInvalid","type":"boolean | undefined","required":false,"default":"undefined","description":"Explicit invalid state for accessibility semantics.\nFalls back to `hasErrors` when not provided."},{"name":"autocomplete","type":"string | undefined","required":false,"default":"\"off\"","description":"Browser autocomplete hint for the popover search input."},{"name":"boundary","type":"string | Record<string, any> | HTMLElement | null | undefined","required":false,"description":"Constrains the popover to a specific boundary element."},{"name":"clearable","type":"boolean | undefined","required":false,"default":"false","description":"Shows a clear button inside the search field's icon stack: it takes the\nlens' place while there is a query or selection to clear (the error or\nwarning icon wins the slot), and resets both. Off by default; with no\nsearch field (`disableWriting`) there is no clear button. Leave it off when the component is\nwrapped by a control that already exposes its own clear affordance (e.g.\nBbSelect clears from the activator) to avoid a duplicate clear button."},{"name":"compact","type":"boolean | undefined","required":false,"default":"false","description":"Apply the compact density variant."},{"name":"dependencies","type":"unknown[] | undefined","required":false,"default":"[]","description":"Additional dependencies that trigger item reloading when changed."},{"name":"depsDebounceTime","type":"number | undefined","required":false,"default":"0","description":"Debounce delay (ms) for dependency-triggered reloads."},{"name":"disabled","type":"boolean | undefined","required":false,"default":"false","description":"Disables the component."},{"name":"disableFlip","type":"boolean | undefined","required":false,"default":"false","description":"Disables the automatic flip to the opposite side when the popover\nwould overflow (flipping is on by default)."},{"name":"disableWriting","type":"boolean | \"auto\" | \"mobile\" | \"desktop\" | undefined","required":false,"default":"'auto'","description":"Controls whether the search input is shown inside the popover panel.\n`true` removes it everywhere; `'mobile'` / `'desktop'` remove it on that\nplatform only; `'auto'` removes it when an **array** `items` renders fewer\noptions than the plugin's `autoDisableWritingThreshold` (default `6`;\ndisabled options count, group headers don't). `'auto'` is decided when the\npanel opens and held until it closes, never applies to a provider\n(function) `items`, never when you listen to `option:add` (a creatable\npopover keeps its field), and is off when the threshold is `0`. There is\nno global switch: hiding or forcing a field is this prop, per instance."},{"name":"emptyText","type":"string | undefined","required":false,"description":"Message displayed when no items are available."},{"name":"enforceCoherence","type":"boolean | undefined","required":false,"default":"false","description":"Reset modelValue to `null` or empty array if it no longer matches available items.\n\nChecked after every applied, successful load whose `reason` is not\n`'search'` (an empty one included), against the FETCHED rows only (a\n`stash` does not count); a search or a failed load never prunes."},{"name":"failedText","type":"string | undefined","required":false,"default":"the localized `common.failedText` (\"Couldn't load items\")","description":"Message displayed in the empty state while the latest load FAILED (the\nprovider threw): the twin of `emptyText` for that case."},{"name":"filterBy","type":"string[] | undefined","required":false,"default":"[]","description":"Property paths used to filter options when the user types in the search input.\nWhen empty (default) options are matched against their display text.\nWhen non-empty the provided paths are searched instead of the display text.\nTo disable filtering entirely set `disableWriting` so the user cannot type a query."},{"name":"groupBy","type":"string | ((item: Item) => string | number | symbol) | undefined","required":false,"description":"Path to item property for grouping options."},{"name":"hasErrors","type":"boolean | undefined","required":false,"default":"false","description":"Marks the component as being in error state."},{"name":"hasWarnings","type":"boolean | undefined","required":false,"default":"false","description":"Marks the component as being in a warning state. Visually mirrors\n`hasErrors` but uses `--bb-warn` chrome; errors take priority when both\nare set."},{"name":"headerHeight","type":"number | undefined","required":false,"description":"Height of group headers in the listbox (px). Defaults to 32px (24px\ncompact; 36px / 32px on mobile viewports). Only applies when `groupBy`\nis set. An explicit value wins on every viewport."},{"name":"id","type":"string | undefined","required":false,"description":"Seeds the ids the popover sets: its listbox is `<id>_listbox` (the\nactivator's `aria-controls`) and each option's id derives from it.\nGenerated when omitted."},{"name":"itemHeight","type":"number | undefined","required":false,"default":"28","description":"Height of the options in the listbox (px). Defaults to 28px (24px\ncompact; 44px / 36px on mobile viewports). An explicit value wins on\nevery viewport."},{"name":"itemProps","type":"BbSelectItemProps<Item> | undefined","required":false,"description":"ADDITIONAL row fields resolved from each item — never its text or value\n(those stay on `itemText` / `itemValue`). Accepted fields:\n\n- `description` — a muted line under the option label. Setting it gives\n every row a fixed two-line height (the list is virtualized); the\n description stays on one line and ellipsizes. Announced as the option's\n description, never part of its name; matched by the search with the text\n when `filterBy` is empty.\n- `prepend:icon` — an icon before the label.\n- `append:icon` — an icon after the label; on the selected row the check\n takes its place.\n\nEither an object with a path or getter per field\n(`{ description: 'email', 'prepend:icon': 'icon' }`) or a function\nreturning the fields (`(item) => ({ description: item.email })`). Without\nit no field renders — nothing is read off the item implicitly — and an empty\nvalue renders nothing for that item. Never shown in the trigger or the\nchips. To disable individual options use `selectable`."},{"name":"items","type":"Item[] | ((context: BbSelectItemsContext) => Item[] | Promise<Item[]>)","required":true,"default":"[]","description":"The options: an array, or a provider function called with ONE context\nobject and returning the rows, sync or async. The context carries:\n- `query` — what the user typed, `''` until they type;\n- `reason` — why this call happened: `'search'` (the user typed, and\n nothing else), `'initial'` (the first load, on mount or on the first\n open), `'dependencies'` (a `dependencies` entry or the `items` function\n changed; a retry arrives this way), `'model'` (the model changed from\n outside and the options cannot resolve it), `'reopen'` (the panel\n reopened over a searched list). To resolve the selection by id, branch\n on `reason !== 'search'`;\n- `modelValue` — the raw v-model: an array in `multiple` mode, the raw\n model value (possibly `null`) in single mode;\n- `signal` — an `AbortSignal`, aborted when a newer call starts or the\n component is disposed; pass it to every request.\n\nA provider signals a failure by THROWING, never by returning `[]`: the\nrows are cleared, nothing is pruned, and `#empty` receives the `error`\n(`failed-text` is shown). A newer call aborts the one in flight, and the\naborted call's rejection or resolution is dropped silently.\nZero-argument providers keep working. Annotate the parameter\n`BbSelectPopoverItemsContext`."},{"name":"itemText","type":"ItemAccessor<Item, string> | undefined","required":false,"default":"JSON.stringify(item)","description":"Path to item property for display text or function to extract it."},{"name":"itemValue","type":"ItemAccessor<Item> | undefined","required":false,"default":"the whole item","description":"Path to item property for value or function to extract it."},{"name":"loading","type":"boolean | undefined","required":false,"default":"false","description":"Display the loading state styles."},{"name":"loadingText","type":"string | undefined","required":false,"description":"Message shown while items are being loaded."},{"name":"max","type":"number | undefined","required":false,"default":"Infinity","description":"Maximum number of selectable items (limits selection when `multiple` is true)."},{"name":"modelValue","type":"any","required":true,"description":"v-model value. Single value for single select, array for multiple select."},{"name":"modelValueDebounceTime","type":"number | undefined","required":false,"default":"0","description":"Debounce delay (ms) for modelValue change handling."},{"name":"multiple","type":"boolean | undefined","required":false,"default":"false","description":"Enable multiple item selection. When true, modelValue must be an array."},{"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. `size`, `draggable`, `fullscreen`, `stack`).\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."},{"name":"offset","type":"number | undefined","required":false,"default":"4","description":"Distance (px) between the activator and the popover."},{"name":"padding","type":"number | undefined","required":false,"default":"10","description":"Minimum page padding used by floating shift middleware."},{"name":"placement","type":"Placement | undefined","required":false,"default":"\"bottom\"","values":["top","bottom","left","right","top-start","top-end","right-start","right-end","bottom-start","bottom-end","left-start","left-end"],"description":"Floating placement of the popover."},{"name":"prefill","type":"boolean | \"interaction\" | undefined","required":false,"default":"\"interaction\"","description":"Controls when items are pre-loaded.\n`'interaction'` loads on the first user interaction (opening the\npopover), `true` loads immediately on mount (and during SSR via\n`onServerPrefetch`), `false` is *search-first*: nothing is fetched until\nthe user types a query — opening the panel alone does not load, and the\npanel shows a \"search to begin\" hint until it does.\nWith the default, a seeded model resolves its option text on the first\ninteraction, not on mount — set `prefill: true` when the trigger must\nshow the selection's text without user interaction.\n\nSearch-first needs a way to search and something to defer, so `false`\nfalls back to loading on open when any of these is true: `items` is an\narray (nothing to defer — arrays resolve on mount), writing is disabled\n(no search field, so the user could never trigger a load), or the model\nis non-empty (its text must resolve to render the selection)."},{"name":"pt","type":"PtItemMap<BbSelectPopoverPtPart, BbSelectPopoverOptionPtPart, BbSelectPopoverPtState, Item> | undefined","required":false,"description":"Passthrough, object form: the same keys as the `pt:*` attributes\nwithout the prefix. See the `pt:<part>` row."},{"name":"pt:clear","type":"PtValue | undefined","required":false},{"name":"pt:clear:disabled","type":"PtValue | undefined","required":false},{"name":"pt:clear:open","type":"PtValue | undefined","required":false},{"name":"pt:clear:selected","type":"PtValue | undefined","required":false},{"name":"pt:footer","type":"PtValue | undefined","required":false},{"name":"pt:footer:disabled","type":"PtValue | undefined","required":false},{"name":"pt:footer:open","type":"PtValue | undefined","required":false},{"name":"pt:footer: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:input","type":"PtValue | undefined","required":false},{"name":"pt:input:disabled","type":"PtValue | undefined","required":false},{"name":"pt:input:open","type":"PtValue | undefined","required":false},{"name":"pt:input:selected","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription","type":"PtValue | ((ctx: PtItemCtx<Item, BbSelectPopoverPtState>) => PtItemResult) | undefined","required":false},{"name":"pt:itemDescription:disabled","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:open","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:selected","type":"PtValue | undefined","required":false},{"name":"pt:itemIcon","type":"PtValue | ((ctx: PtItemCtx<Item, BbSelectPopoverPtState>) => PtItemResult) | undefined","required":false},{"name":"pt:itemIcon:disabled","type":"PtValue | undefined","required":false},{"name":"pt:itemIcon:open","type":"PtValue | undefined","required":false},{"name":"pt:itemIcon:selected","type":"PtValue | undefined","required":false},{"name":"pt:itemText","type":"PtValue | ((ctx: PtItemCtx<Item, BbSelectPopoverPtState>) => PtItemResult) | undefined","required":false},{"name":"pt:itemText:disabled","type":"PtValue | undefined","required":false},{"name":"pt:itemText:open","type":"PtValue | undefined","required":false},{"name":"pt:itemText:selected","type":"PtValue | undefined","required":false},{"name":"pt:list","type":"PtValue | undefined","required":false},{"name":"pt:list:disabled","type":"PtValue | undefined","required":false},{"name":"pt:list:open","type":"PtValue | undefined","required":false},{"name":"pt:list:selected","type":"PtValue | undefined","required":false},{"name":"pt:option","type":"PtValue | ((ctx: PtItemCtx<Item, BbSelectPopoverPtState>) => PtItemResult) | undefined","required":false},{"name":"pt:option:disabled","type":"PtValue | undefined","required":false},{"name":"pt:option:open","type":"PtValue | undefined","required":false},{"name":"pt:option: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":"queryDebounceTime","type":"number | undefined","required":false,"default":"500","description":"Debounce delay (ms) before triggering search queries after user input stops."},{"name":"readonly","type":"boolean | undefined","required":false,"default":"false","description":"Prevents opening the popover while keeping the activator accessible."},{"name":"searchInputAriaLabel","type":"string | undefined","required":false,"default":"`t('select.searchLabel')` (`'Search options'`)","description":"Accessible label used by the search input rendered inside the popover.\nFalls back to the localized `select.searchLabel` key when omitted."},{"name":"selectable","type":"boolean | ((item: Item) => boolean) | undefined","required":false,"default":"true","description":"Defines whether options are selectable.\nCan be a global boolean that affects all options or a function\nthat accepts an item and returns a boolean that only affects that item.\nNon-selectable options are rendered disabled."},{"name":"stash","type":"boolean | undefined","required":false,"default":"false","description":"Accumulate selected items across searches instead of replacing them: a\npicked option stays resolvable when a later search or a failed load no\nlonger returns it. The stash follows the model (an unselect, a parent\nwrite or an `enforce-coherence` prune drops the row) and is NOT evidence a\npick is still valid: coherence checks the model against the FETCHED rows\nonly, so a `dependencies` reload whose result lacks a stashed pick still\nprunes it."},{"name":"transitionDuration","type":"number | undefined","required":false,"default":"250","description":"Transition duration (ms) for popover show/hide animations."},{"name":"width","type":"string | number | undefined","required":false,"default":"\"200\"","description":"Width of the popover in pixels, percentage, or `'auto'`. A bare number is\nread as pixels — the default is the string `'200'`, not the number `200`."}],"events":[{"name":"active","signature":"(): void","description":"Emitted when the component becomes active (focus enters it)."},{"name":"blur","signature":"(event: FocusEvent): void","description":"Emitted when the activator loses focus."},{"name":"change","signature":"(event: Event): void","description":"Emitted when the value changes via native change event."},{"name":"click","signature":"(event: MouseEvent): void","description":"Emitted when the activator is clicked."},{"name":"focus","signature":"(event: FocusEvent): void","description":"Emitted when the activator receives focus."},{"name":"hidden","signature":"(): void","description":"Emitted once the options surface has finished closing."},{"name":"hide","signature":"(): void","description":"Emitted as soon as the options surface starts to close."},{"name":"inactive","signature":"(): void","description":"Emitted when focus moves outside the entire component after it was active."},{"name":"input","signature":"(event: Event): void","description":"Emitted on native input events from the search input."},{"name":"option:add","signature":"(text: string): void","description":"Emitted when the user types a new value and confirms it (Enter key) while\nwriting is enabled (i.e. `disableWriting` does not suppress the search\ninput for the current surface)."},{"name":"show","signature":"(): void","description":"Emitted as soon as the options surface starts to open (the popover, or the sheet on a phone)."},{"name":"shown","signature":"(): void","description":"Emitted once the options surface is open and its open transition has finished."},{"name":"update:modelValue","signature":"(value: any): void","description":"Emitted with the next selection value whenever selection changes."}],"slots":[{"name":"activator","type":"BbSelectPopoverActivatorSlotProps","fields":["clear: () => void","close: () => Promise<void>","focus: () => void","disabled: boolean","loading: boolean","open: () => Promise<void>","props: { ref: (reference: unknown) => void; }","query: string","readonly: boolean","selectedOptions: BbSelectResolvedOption<any>[]","shown: boolean","text: string","toggle: () => Promise<void>"],"description":"Replaces the default trigger element that opens the select popover."},{"name":"empty","type":"{ query: string; focus: () => void; error: unknown; }","description":"Content shown when no options match the query or the list is empty.\n`error` is what the latest failed load rejected with, untouched (an\n`Error`, a `Response`, anything thrown; a nullish rejection becomes an\n`Error`), and `null` when nothing failed — the rows are cleared on a\nfailure, so this slot is where it shows."},{"name":"footer","type":"BbSelectPopoverPanelSlotProps","fields":["close: () => Promise<void>","clear: () => void","focus: () => void","query: string","selectedOptions: BbSelectResolvedOption<any>[]"],"description":"Content pinned to the bottom of the panel, below the options list. Rendered in\nboth the desktop popover and the adaptive sheet."},{"name":"group","type":"BbSelectPopoverGroupSlotProps<Item>","fields":["disabled: boolean","index: number","item: Item","length: number","text: string"],"description":"Replaces the default group header rendered above grouped options."},{"name":"header","type":"BbSelectPopoverPanelSlotProps","fields":["close: () => Promise<void>","clear: () => void","focus: () => void","query: string","selectedOptions: BbSelectResolvedOption<any>[]"],"description":"Content pinned to the top of the panel, above the search field. Rendered in\nboth the desktop popover and the adaptive sheet."},{"name":"loading","type":"{ query: string; }","description":"Content shown inside the options dropdown while items are loading."},{"name":"option","type":"BbSelectPopoverOptionSlotProps<Item>","fields":["disabled: boolean","focused: boolean","index: number","item: Item","loading: boolean","selected: boolean","text: string","value: any","description: string"],"description":"Replaces the default rendering of each option row in the dropdown."}],"exposed":[],"models":[{"name":"modelValue","type":"any"}],"cssProps":[{"name":"--bg","value":"var(--bb-panel)","selector":".bb-listbox__outer-container"},{"name":"--min-size","value":"2.125rem","selector":".bb-select-popover__sheet-chip"},{"name":"--px","value":"0.75rem","selector":".bb-select-popover__sheet-chip"},{"name":"--clear-size","value":"1.25rem","selector":".bb-select-popover__sheet-chip"}],"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 options surface you see — the popover's painted bubble on desktop, the sheet itself on a phone."},{"name":"sheet","description":"The bottom sheet the surface becomes on a phone (the `BbOffCanvas` root) — never the desktop surface. Applied after `panel`, so it wins a conflict there."},{"name":"input","description":"The search field."},{"name":"clear","description":"The ✕ that empties the search field."},{"name":"list","description":"The `role=\"listbox\"` node that holds the options. Virtualised: its height is written inline and its rows are positioned by the list, which limits what a layout utility can do there. The listbox's groups and the chips are not parts."},{"name":"option","description":"One listbox option — a broadcast resolved per option. Also takes a per-item function, called with the option's raw item."},{"name":"itemText","description":"An option's label — resolved with that option's states. A custom `#option` slot replaces it. Also takes a per-item function."},{"name":"itemIcon","description":"An option's prepend / append icons (`itemProps`) — resolved with that option's states. Also takes a per-item function."},{"name":"itemDescription","description":"An option's second line (its description) — resolved with that option's states. A custom `#option` slot replaces it. Also takes a per-item function."},{"name":"header","description":"The flyout's header band."},{"name":"footer","description":"The flyout's footer band."}],"states":[{"name":"selected","description":"Per node, on `option` and its `item-*` parts: a chosen option."},{"name":"disabled","description":"Per node, on `option` and its `item-*` parts: an option that is disabled."},{"name":"open","description":"Component-wide: the options surface is showing."}]},"tree":{"bindings":[{"part":"input","target":"input.bb-select-popover__input"},{"part":"clear","target":"ClearableButton"},{"part":"panel","target":"CommonPopover"},{"part":"root","target":"CommonPopover"},{"part":"header","target":"div.bb-select-popover__header"},{"part":"footer","target":"div.bb-select-popover__footer"}],"forwards":[{"to":"BbOffCanvas","mapping":"{ header: 'header', footer: 'footer', panel: 'root', sheet: 'root' }"}],"nodes":[{"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","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":"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":"BbIcon","kind":"public","repeated":true,"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":"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":"CommonPopover","kind":"internal"},{"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":"ListBox","kind":"internal","children":[{"name":"FlatListBox","kind":"internal","vocabulary":"BbSelectPopover","bindings":[{"part":"list","target":"span.bb-listbox__list"},{"part":"option","target":"span.bb-listbox__option"},{"part":"itemIcon","target":"BbIcon"},{"part":"itemText","target":"span.bb-listbox__item-text"},{"part":"itemDescription","target":"span.bb-listbox__item-description"}],"children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]},{"name":"ErrorIcon","kind":"internal","repeated":true,"cssProps":[{"name":"--accent","documented":false,"readBy":["bb-error-icon"]}]}]},{"name":"GroupedListBox","kind":"internal","vocabulary":"BbSelectPopover","bindings":[{"part":"list","target":"span.bb-listbox__list"},{"part":"option","target":"span.bb-listbox__option"},{"part":"itemIcon","target":"BbIcon"},{"part":"itemText","target":"span.bb-listbox__item-text"},{"part":"itemDescription","target":"span.bb-listbox__item-description"}],"children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]},{"name":"ErrorIcon","kind":"internal","repeated":true,"cssProps":[{"name":"--accent","documented":false,"readBy":["bb-error-icon"]}]}]}]},{"name":"BbSmoothHeight","kind":"public"}]},"css":{"classes":{"bb-listbox":["","--compact","--described","--empty","--grouped","--loading","--multiple","--open","__empty","__failed","__failed--divided","__failed-icon","__failed-text","__group","__group-header","__group-header-label","__inner-container","__item-description","__item-icon","__item-text","__list","__loading","__option","__option--disabled","__option--focused","__option--selected","__option-append-icon","__option-check","__option-content","__option-prepend-icon","__outer-container"],"bb-select-popover":["","--clearable-active","--errors","--loading","--reloading","--sheet","--warnings","__clear","__focus-proxy","__footer","__header","__input","__panel","__search-container","__search-error-icon","__search-icon","__search-strip","__search-warning-icon","__sheet","__sheet-chip","__sheet-chips","__sheet-selection"],"bb-select-popover-escape":[""],"bb-select-sheet-chip-attrs":[""]},"locals":["--bg","--close-size","--color-gray-200","--group-header-height","--option-font-size","--option-h","--option-height","--py","--transition-duration","--w"]},"removed":[{"name":"allowWriting","new":"disableWriting","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-select-popover.md","silent":true,"fix":{"kind":"invert","valueMap":{"not-mobile":"mobile"}}},{"name":"arrowPadding","new":null,"since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-select-popover.md","silent":true,"fix":{"kind":"remove"}},{"name":"flip","new":"disableFlip","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-select-popover.md","silent":true,"fix":{"kind":"invert"}},{"name":"hideArrow","new":null,"since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-select-popover.md","silent":true,"fix":{"kind":"remove"}},{"name":"showArrow","new":null,"since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-select-popover.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":"noDataText","new":"emptyText","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"no-data","new":"empty","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}}],"renamed":[{"from":"allowWriting","to":"disableWriting","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-select-popover.md","fix":{"kind":"invert","valueMap":{"not-mobile":"mobile"}}},{"from":"flip","to":"disableFlip","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-select-popover.md","fix":{"kind":"invert"}},{"from":"hasWarning","to":"hasWarnings","since":"3.0.0-beta.26","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"noDataText","to":"emptyText","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"no-data","to":"empty","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}}]},
|
|
490
|
+
{"name":"BbSelectPopover","group":"Selection","description":"Provides popover-driven option selection and search.","referenceOnly":false,"hasGuide":true,"contract":"ai/BbSelectPopover.md","source":"ai/source/BbSelectPopover.md","props":[{"name":"activator","type":"Record<string, any> | HTMLElement | null | undefined","required":false,"description":"External activator element or component ref.\nWhen provided, the activator slot is not rendered and event listeners\nare attached programmatically to the referenced element."},{"name":"adaptive","type":"boolean | undefined","required":false,"default":"`config.adaptive` (`true`)","description":"When `true`, the panel opens as a bottom off-canvas sheet on mobile viewports\ninstead of a floating popover; on desktop it stays a popover. The sheet reuses\nthe same search field and options list, adding a representation of the current\nselection between them. Mirrors the adaptive behaviour of `BbPopover`/`BbDropdown`.\n\nWhen unset, falls back to the global `config.adaptive`."},{"name":"anchor","type":"Record<string, any> | HTMLElement | null | undefined","required":false,"default":"null","description":"Override the element used for popover positioning and width measurement.\nUseful when the focusable activator is narrower than its visual container\n(e.g. a button inside a wrapper). Falls back to `activatorEl` when omitted."},{"name":"ariaDescribedby","type":"string | string[] | undefined","required":false,"description":"Space-separated IDREF(s) that describe this field for assistive technologies.\nAccepts either a string or array of ids."},{"name":"ariaInvalid","type":"boolean | undefined","required":false,"default":"undefined","description":"Explicit invalid state for accessibility semantics.\nFalls back to `hasErrors` when not provided."},{"name":"autocomplete","type":"string | undefined","required":false,"default":"\"off\"","description":"Browser autocomplete hint for the popover search input."},{"name":"boundary","type":"string | Record<string, any> | HTMLElement | null | undefined","required":false,"description":"Constrains the popover to a specific boundary element."},{"name":"clearable","type":"boolean | undefined","required":false,"default":"false","description":"Shows a clear button inside the search field's icon stack: it takes the\nlens' place while there is a query or selection to clear (the error or\nwarning icon wins the slot), and resets both. Off by default; with no\nsearch field (`disableWriting`) there is no clear button. Leave it off when the component is\nwrapped by a control that already exposes its own clear affordance (e.g.\nBbSelect clears from the activator) to avoid a duplicate clear button."},{"name":"compact","type":"boolean | undefined","required":false,"default":"false","description":"Apply the compact density variant."},{"name":"dependencies","type":"unknown[] | undefined","required":false,"default":"[]","description":"Additional dependencies that trigger item reloading when changed."},{"name":"depsDebounceTime","type":"number | undefined","required":false,"default":"0","description":"Debounce delay (ms) for dependency-triggered reloads."},{"name":"disabled","type":"boolean | undefined","required":false,"default":"false","description":"Disables the component."},{"name":"disableFlip","type":"boolean | undefined","required":false,"default":"false","description":"Disables the automatic flip to the opposite side when the popover\nwould overflow (flipping is on by default)."},{"name":"disableWriting","type":"boolean | \"auto\" | \"mobile\" | \"desktop\" | undefined","required":false,"default":"'auto'","description":"Controls whether the search input is shown inside the popover panel.\n`true` removes it everywhere; `'mobile'` / `'desktop'` remove it on that\nplatform only; `'auto'` removes it when an **array** `items` renders fewer\noptions than the plugin's `autoDisableWritingThreshold` (default `6`;\ndisabled options count, group headers don't). `'auto'` is decided when the\npanel opens and held until it closes, never applies to a provider\n(function) `items`, never when you listen to `option:add` (a creatable\npopover keeps its field), and is off when the threshold is `0`. There is\nno global switch: hiding or forcing a field is this prop, per instance."},{"name":"emptyText","type":"string | undefined","required":false,"description":"Message displayed when no items are available."},{"name":"enforceCoherence","type":"boolean | undefined","required":false,"default":"false","description":"Reset modelValue to `null` or empty array if it no longer matches available items.\n\nChecked after every applied, successful load whose `reason` is not\n`'search'` (an empty one included), against the FETCHED rows only (a\n`stash` does not count); a search or a failed load never prunes."},{"name":"failedText","type":"string | undefined","required":false,"default":"the localized `common.failedText` (\"Couldn't load items\")","description":"Message displayed in the empty state while the latest load FAILED (the\nprovider threw): the twin of `emptyText` for that case."},{"name":"filterBy","type":"string[] | undefined","required":false,"default":"[]","description":"Property paths used to filter options when the user types in the search input.\nWhen empty (default) options are matched against their display text.\nWhen non-empty the provided paths are searched instead of the display text.\nTo disable filtering entirely set `disableWriting` so the user cannot type a query."},{"name":"groupBy","type":"string | ((item: Item) => string | number | symbol) | undefined","required":false,"description":"Path to item property for grouping options."},{"name":"hasErrors","type":"boolean | undefined","required":false,"default":"false","description":"Marks the component as being in error state."},{"name":"hasWarnings","type":"boolean | undefined","required":false,"default":"false","description":"Marks the component as being in a warning state. Visually mirrors\n`hasErrors` but uses `--bb-warn` chrome; errors take priority when both\nare set."},{"name":"headerHeight","type":"number | undefined","required":false,"description":"Height of group headers in the listbox (px). Defaults to 32px (24px\ncompact; 36px / 32px on mobile viewports). Only applies when `groupBy`\nis set. An explicit value wins on every viewport."},{"name":"id","type":"string | undefined","required":false,"description":"Seeds the ids the popover sets: its listbox is `<id>_listbox` (the\nactivator's `aria-controls`) and each option's id derives from it.\nGenerated when omitted."},{"name":"itemHeight","type":"number | undefined","required":false,"default":"28","description":"Height of the options in the listbox (px). Defaults to 28px (24px\ncompact; 44px / 36px on mobile viewports). An explicit value wins on\nevery viewport."},{"name":"itemProps","type":"BbSelectItemProps<Item> | undefined","required":false,"description":"ADDITIONAL row fields resolved from each item — never its text or value\n(those stay on `itemText` / `itemValue`). Accepted fields:\n\n- `description` — a muted line under the option label. Setting it gives\n every row a fixed two-line height (the list is virtualized); the\n description stays on one line and ellipsizes. Announced as the option's\n description, never part of its name; matched by the search with the text\n when `filterBy` is empty.\n- `prepend:icon` — an icon before the label.\n- `append:icon` — an icon after the label; on the selected row the check\n takes its place.\n\nEither an object with a path or getter per field\n(`{ description: 'email', 'prepend:icon': 'icon' }`) or a function\nreturning the fields (`(item) => ({ description: item.email })`). Without\nit no field renders — nothing is read off the item implicitly — and an empty\nvalue renders nothing for that item. Never shown in the trigger or the\nchips. To disable individual options use `selectable`."},{"name":"items","type":"Item[] | ((context: BbSelectPopoverItemsContext) => Item[] | Promise<Item[]>)","required":true,"default":"[]","description":"The options: an array, or a provider function called with ONE context\nobject and returning the rows, sync or async. The context carries:\n- `query` — what the user typed, `''` until they type;\n- `reason` — why this call happened: `'search'` (the user typed, and\n nothing else), `'initial'` (the first load, on mount or on the first\n open), `'dependencies'` (a `dependencies` entry or the `items` function\n changed; a retry arrives this way), `'model'` (the model changed from\n outside and the options cannot resolve it), `'reopen'` (the panel\n reopened over a searched list). To resolve the selection by id, branch\n on `reason !== 'search'`;\n- `modelValue` — the raw v-model: an array in `multiple` mode, the raw\n model value (possibly `null`) in single mode;\n- `signal` — an `AbortSignal`, aborted when a newer call starts or the\n component is disposed; pass it to every request.\n\nA provider signals a failure by THROWING, never by returning `[]`: the\nrows are cleared, nothing is pruned, and `#empty` receives the `error`\n(`failed-text` is shown). A newer call aborts the one in flight, and the\naborted call's rejection or resolution is dropped silently.\nZero-argument providers keep working. Annotate the parameter\n`BbSelectPopoverItemsContext`."},{"name":"itemText","type":"ItemAccessor<Item, string> | undefined","required":false,"default":"JSON.stringify(item)","description":"Path to item property for display text or function to extract it."},{"name":"itemValue","type":"ItemAccessor<Item> | undefined","required":false,"default":"the whole item","description":"Path to item property for value or function to extract it."},{"name":"loading","type":"boolean | undefined","required":false,"default":"false","description":"Display the loading state styles."},{"name":"loadingText","type":"string | undefined","required":false,"description":"Message shown while items are being loaded."},{"name":"max","type":"number | undefined","required":false,"default":"Infinity","description":"Maximum number of selectable items (limits selection when `multiple` is true)."},{"name":"modelValue","type":"any","required":true,"description":"v-model value. Single value for single select, array for multiple select."},{"name":"modelValueDebounceTime","type":"number | undefined","required":false,"default":"0","description":"Debounce delay (ms) for modelValue change handling."},{"name":"multiple","type":"boolean | undefined","required":false,"default":"false","description":"Enable multiple item selection. When true, modelValue must be an array."},{"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. `size`, `draggable`, `fullscreen`, `stack`).\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."},{"name":"offset","type":"number | undefined","required":false,"default":"4","description":"Distance (px) between the activator and the popover."},{"name":"padding","type":"number | undefined","required":false,"default":"10","description":"Minimum page padding used by floating shift middleware."},{"name":"placement","type":"Placement | undefined","required":false,"default":"\"bottom\"","values":["top","bottom","left","right","top-start","top-end","right-start","right-end","bottom-start","bottom-end","left-start","left-end"],"description":"Floating placement of the popover."},{"name":"prefill","type":"boolean | \"interaction\" | undefined","required":false,"default":"\"interaction\"","description":"Controls when items are pre-loaded.\n`'interaction'` loads on the first user interaction (opening the\npopover), `true` loads immediately on mount (and during SSR via\n`onServerPrefetch`), `false` is *search-first*: nothing is fetched until\nthe user types a query — opening the panel alone does not load, and the\npanel shows a \"search to begin\" hint until it does.\nWith the default, a seeded model resolves its option text on the first\ninteraction, not on mount — set `prefill: true` when the trigger must\nshow the selection's text without user interaction.\n\nSearch-first needs a way to search and something to defer, so `false`\nfalls back to loading on open when any of these is true: `items` is an\narray (nothing to defer — arrays resolve on mount), writing is disabled\n(no search field, so the user could never trigger a load), or the model\nis non-empty (its text must resolve to render the selection)."},{"name":"pt","type":"PtItemMap<BbSelectPopoverPtPart, BbSelectPopoverOptionPtPart, BbSelectPopoverPtState, Item> | undefined","required":false,"description":"Passthrough, object form: the same keys as the `pt:*` attributes\nwithout the prefix. See the `pt:<part>` row."},{"name":"pt:clear","type":"PtValue | undefined","required":false},{"name":"pt:clear:disabled","type":"PtValue | undefined","required":false},{"name":"pt:clear:open","type":"PtValue | undefined","required":false},{"name":"pt:clear:selected","type":"PtValue | undefined","required":false},{"name":"pt:footer","type":"PtValue | undefined","required":false},{"name":"pt:footer:disabled","type":"PtValue | undefined","required":false},{"name":"pt:footer:open","type":"PtValue | undefined","required":false},{"name":"pt:footer: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:input","type":"PtValue | undefined","required":false},{"name":"pt:input:disabled","type":"PtValue | undefined","required":false},{"name":"pt:input:open","type":"PtValue | undefined","required":false},{"name":"pt:input:selected","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription","type":"PtValue | ((ctx: PtItemCtx<Item, BbSelectPopoverPtState>) => PtItemResult) | undefined","required":false},{"name":"pt:itemDescription:disabled","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:open","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:selected","type":"PtValue | undefined","required":false},{"name":"pt:itemIcon","type":"PtValue | ((ctx: PtItemCtx<Item, BbSelectPopoverPtState>) => PtItemResult) | undefined","required":false},{"name":"pt:itemIcon:disabled","type":"PtValue | undefined","required":false},{"name":"pt:itemIcon:open","type":"PtValue | undefined","required":false},{"name":"pt:itemIcon:selected","type":"PtValue | undefined","required":false},{"name":"pt:itemText","type":"PtValue | ((ctx: PtItemCtx<Item, BbSelectPopoverPtState>) => PtItemResult) | undefined","required":false},{"name":"pt:itemText:disabled","type":"PtValue | undefined","required":false},{"name":"pt:itemText:open","type":"PtValue | undefined","required":false},{"name":"pt:itemText:selected","type":"PtValue | undefined","required":false},{"name":"pt:list","type":"PtValue | undefined","required":false},{"name":"pt:list:disabled","type":"PtValue | undefined","required":false},{"name":"pt:list:open","type":"PtValue | undefined","required":false},{"name":"pt:list:selected","type":"PtValue | undefined","required":false},{"name":"pt:option","type":"PtValue | ((ctx: PtItemCtx<Item, BbSelectPopoverPtState>) => PtItemResult) | undefined","required":false},{"name":"pt:option:disabled","type":"PtValue | undefined","required":false},{"name":"pt:option:open","type":"PtValue | undefined","required":false},{"name":"pt:option: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":"queryDebounceTime","type":"number | undefined","required":false,"default":"500","description":"Debounce delay (ms) before triggering search queries after user input stops."},{"name":"readonly","type":"boolean | undefined","required":false,"default":"false","description":"Prevents opening the popover while keeping the activator accessible."},{"name":"searchInputAriaLabel","type":"string | undefined","required":false,"default":"`t('select.searchLabel')` (`'Search options'`)","description":"Accessible label used by the search input rendered inside the popover.\nFalls back to the localized `select.searchLabel` key when omitted."},{"name":"selectable","type":"boolean | ((item: Item) => boolean) | undefined","required":false,"default":"true","description":"Defines whether options are selectable.\nCan be a global boolean that affects all options or a function\nthat accepts an item and returns a boolean that only affects that item.\nNon-selectable options are rendered disabled."},{"name":"stash","type":"boolean | undefined","required":false,"default":"false","description":"Accumulate selected items across searches instead of replacing them: a\npicked option stays resolvable when a later search or a failed load no\nlonger returns it. The stash follows the model (an unselect, a parent\nwrite or an `enforce-coherence` prune drops the row) and is NOT evidence a\npick is still valid: coherence checks the model against the FETCHED rows\nonly, so a `dependencies` reload whose result lacks a stashed pick still\nprunes it."},{"name":"transitionDuration","type":"number | undefined","required":false,"default":"250","description":"Transition duration (ms) for popover show/hide animations."},{"name":"width","type":"string | number | undefined","required":false,"default":"\"200\"","description":"Width of the popover in pixels, percentage, or `'auto'`. A bare number is\nread as pixels — the default is the string `'200'`, not the number `200`."}],"events":[{"name":"active","signature":"(): void","description":"Emitted when the component becomes active (focus enters it)."},{"name":"blur","signature":"(event: FocusEvent): void","description":"Emitted when the activator loses focus."},{"name":"change","signature":"(event: Event): void","description":"Emitted when the value changes via native change event."},{"name":"click","signature":"(event: MouseEvent): void","description":"Emitted when the activator is clicked."},{"name":"focus","signature":"(event: FocusEvent): void","description":"Emitted when the activator receives focus."},{"name":"hidden","signature":"(): void","description":"Emitted once the options surface has finished closing."},{"name":"hide","signature":"(): void","description":"Emitted as soon as the options surface starts to close."},{"name":"inactive","signature":"(): void","description":"Emitted when focus moves outside the entire component after it was active."},{"name":"input","signature":"(event: Event): void","description":"Emitted on native input events from the search input."},{"name":"option:add","signature":"(text: string): void","description":"Emitted when the user types a new value and confirms it (Enter key) while\nwriting is enabled (i.e. `disableWriting` does not suppress the search\ninput for the current surface)."},{"name":"show","signature":"(): void","description":"Emitted as soon as the options surface starts to open (the popover, or the sheet on a phone)."},{"name":"shown","signature":"(): void","description":"Emitted once the options surface is open and its open transition has finished."},{"name":"update:modelValue","signature":"(value: any): void","description":"Emitted with the next selection value whenever selection changes."}],"slots":[{"name":"activator","type":"BbSelectPopoverActivatorSlotProps","fields":["clear: () => void","close: () => Promise<void>","focus: () => void","disabled: boolean","loading: boolean","open: () => Promise<void>","props: { ref: (reference: unknown) => void; }","query: string","readonly: boolean","selectedOptions: BbSelectResolvedOption<any>[]","shown: boolean","text: string","toggle: () => Promise<void>"],"description":"Replaces the default trigger element that opens the select popover."},{"name":"empty","type":"{ query: string; focus: () => void; error: unknown; }","description":"Content shown when no options match the query or the list is empty.\n`error` is what the latest failed load rejected with, untouched (an\n`Error`, a `Response`, anything thrown; a nullish rejection becomes an\n`Error`), and `null` when nothing failed — the rows are cleared on a\nfailure, so this slot is where it shows."},{"name":"footer","type":"BbSelectPopoverPanelSlotProps","fields":["close: () => Promise<void>","clear: () => void","focus: () => void","query: string","selectedOptions: BbSelectResolvedOption<any>[]"],"description":"Content pinned to the bottom of the panel, below the options list. Rendered in\nboth the desktop popover and the adaptive sheet."},{"name":"group","type":"BbSelectPopoverGroupSlotProps<Item>","fields":["disabled: boolean","index: number","item: Item","length: number","text: string"],"description":"Replaces the default group header rendered above grouped options."},{"name":"header","type":"BbSelectPopoverPanelSlotProps","fields":["close: () => Promise<void>","clear: () => void","focus: () => void","query: string","selectedOptions: BbSelectResolvedOption<any>[]"],"description":"Content pinned to the top of the panel, above the search field. Rendered in\nboth the desktop popover and the adaptive sheet."},{"name":"loading","type":"{ query: string; }","description":"Content shown inside the options dropdown while items are loading."},{"name":"option","type":"BbSelectPopoverOptionSlotProps<Item>","fields":["disabled: boolean","focused: boolean","index: number","item: Item","loading: boolean","selected: boolean","text: string","value: any","description: string"],"description":"Replaces the default rendering of each option row in the dropdown."}],"exposed":[],"models":[{"name":"modelValue","type":"any"}],"cssProps":[{"name":"--bg","value":"var(--bb-panel)","selector":".bb-listbox__outer-container"},{"name":"--min-size","value":"2.125rem","selector":".bb-select-popover__sheet-chip"},{"name":"--px","value":"0.75rem","selector":".bb-select-popover__sheet-chip"},{"name":"--clear-size","value":"1.25rem","selector":".bb-select-popover__sheet-chip"}],"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 options surface you see — the popover's painted bubble on desktop, the sheet itself on a phone."},{"name":"sheet","description":"The bottom sheet the surface becomes on a phone (the `BbOffCanvas` root) — never the desktop surface. Applied after `panel`, so it wins a conflict there."},{"name":"input","description":"The search field."},{"name":"clear","description":"The ✕ that empties the search field."},{"name":"list","description":"The `role=\"listbox\"` node that holds the options. Virtualised: its height is written inline and its rows are positioned by the list, which limits what a layout utility can do there. The listbox's groups and the chips are not parts."},{"name":"option","description":"One listbox option — a broadcast resolved per option. Also takes a per-item function, called with the option's raw item."},{"name":"itemText","description":"An option's label — resolved with that option's states. A custom `#option` slot replaces it. Also takes a per-item function."},{"name":"itemIcon","description":"An option's prepend / append icons (`itemProps`) — resolved with that option's states. Also takes a per-item function."},{"name":"itemDescription","description":"An option's second line (its description) — resolved with that option's states. A custom `#option` slot replaces it. Also takes a per-item function."},{"name":"header","description":"The flyout's header band."},{"name":"footer","description":"The flyout's footer band."}],"states":[{"name":"selected","description":"Per node, on `option` and its `item-*` parts: a chosen option."},{"name":"disabled","description":"Per node, on `option` and its `item-*` parts: an option that is disabled."},{"name":"open","description":"Component-wide: the options surface is showing."}]},"tree":{"bindings":[{"part":"input","target":"input.bb-select-popover__input"},{"part":"clear","target":"ClearableButton"},{"part":"panel","target":"CommonPopover"},{"part":"root","target":"CommonPopover"},{"part":"header","target":"div.bb-select-popover__header"},{"part":"footer","target":"div.bb-select-popover__footer"}],"forwards":[{"to":"BbOffCanvas","mapping":"{ header: 'header', footer: 'footer', panel: 'root', sheet: 'root' }"}],"nodes":[{"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","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":"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":"BbIcon","kind":"public","repeated":true,"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":"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":"CommonPopover","kind":"internal"},{"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":"ListBox","kind":"internal","children":[{"name":"FlatListBox","kind":"internal","vocabulary":"BbSelectPopover","bindings":[{"part":"list","target":"span.bb-listbox__list"},{"part":"option","target":"span.bb-listbox__option"},{"part":"itemIcon","target":"BbIcon"},{"part":"itemText","target":"span.bb-listbox__item-text"},{"part":"itemDescription","target":"span.bb-listbox__item-description"}],"children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]},{"name":"ErrorIcon","kind":"internal","repeated":true,"cssProps":[{"name":"--accent","documented":false,"readBy":["bb-error-icon"]}]}]},{"name":"GroupedListBox","kind":"internal","vocabulary":"BbSelectPopover","bindings":[{"part":"list","target":"span.bb-listbox__list"},{"part":"option","target":"span.bb-listbox__option"},{"part":"itemIcon","target":"BbIcon"},{"part":"itemText","target":"span.bb-listbox__item-text"},{"part":"itemDescription","target":"span.bb-listbox__item-description"}],"children":[{"name":"BbIcon","kind":"public","repeated":true,"cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]},{"name":"ErrorIcon","kind":"internal","repeated":true,"cssProps":[{"name":"--accent","documented":false,"readBy":["bb-error-icon"]}]}]}]},{"name":"BbSmoothHeight","kind":"public"}]},"css":{"classes":{"bb-listbox":["","--compact","--described","--empty","--grouped","--loading","--multiple","--open","__empty","__failed","__failed--divided","__failed-icon","__failed-text","__group","__group-header","__group-header-label","__inner-container","__item-description","__item-icon","__item-text","__list","__loading","__option","__option--disabled","__option--focused","__option--selected","__option-append-icon","__option-check","__option-content","__option-prepend-icon","__outer-container"],"bb-select-popover":["","--clearable-active","--errors","--loading","--reloading","--sheet","--warnings","__clear","__focus-proxy","__footer","__header","__input","__panel","__search-container","__search-error-icon","__search-icon","__search-strip","__search-warning-icon","__sheet","__sheet-chip","__sheet-chips","__sheet-selection"],"bb-select-popover-escape":[""],"bb-select-sheet-chip-attrs":[""]},"locals":["--bg","--close-size","--color-gray-200","--group-header-height","--option-font-size","--option-h","--option-height","--py","--transition-duration","--w"]},"removed":[{"name":"allowWriting","new":"disableWriting","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-select-popover.md","silent":true,"fix":{"kind":"invert","valueMap":{"not-mobile":"mobile"}}},{"name":"arrowPadding","new":null,"since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-select-popover.md","silent":true,"fix":{"kind":"remove"}},{"name":"flip","new":"disableFlip","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-select-popover.md","silent":true,"fix":{"kind":"invert"}},{"name":"hideArrow","new":null,"since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-select-popover.md","silent":true,"fix":{"kind":"remove"}},{"name":"showArrow","new":null,"since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-select-popover.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":"noDataText","new":"emptyText","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"no-data","new":"empty","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}}],"renamed":[{"from":"allowWriting","to":"disableWriting","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-select-popover.md","fix":{"kind":"invert","valueMap":{"not-mobile":"mobile"}}},{"from":"flip","to":"disableFlip","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-select-popover.md","fix":{"kind":"invert"}},{"from":"hasWarning","to":"hasWarnings","since":"3.0.0-beta.26","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"noDataText","to":"emptyText","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"no-data","to":"empty","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}}]},
|
|
491
491
|
{"name":"BbSlider","group":"Selection","description":"Selects numeric values across a bounded range.","referenceOnly":false,"hasGuide":true,"contract":"ai/BbSlider.md","source":"ai/source/BbSlider.md","props":[{"name":"autofocus","type":"Booleanish | undefined","required":false,"description":"Sets autofocus on page load."},{"name":"compact","type":"boolean | undefined","required":false,"default":"false","description":"Compact density. The track's height follows `--bb-input-h-compact` and the\nlabel gap `--bb-label-spacing-y-compact`, so a `--bb-input-h` or\n`--bb-label-spacing-y` you set on the component is ignored while\n`compact` is on: set the `-compact` tokens 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":"disableThumbTranslate","type":"boolean | undefined","required":false,"default":"false","description":"Disables the proportional thumb translation that keeps the thumb on\ntrack (enabled by default). Set it when displaying ticks so they align\nwith less effort."},{"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\" | \"inside\" | undefined","required":false,"description":"Label rendering mode.\nSliders do not support `floating` labels."},{"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":"max","type":"number | undefined","required":false,"default":"100","description":"Maximum value cap."},{"name":"maxPrecision","type":"number | undefined","required":false,"default":"2","description":"Maximum decimal places to retain in emitted values."},{"name":"min","type":"number | undefined","required":false,"default":"0","description":"Minimum value cap."},{"name":"modelValue","type":"number | number[] | null | undefined","required":false,"default":"0","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":"pt","type":"PtMap<BbSliderPtPart, BbSliderPtState> | undefined","required":false,"description":"Passthrough, object form: the same keys as the `pt:*` attributes\nwithout the prefix. See the `pt:<part>` row."},{"name":"pt:bar","type":"PtValue | undefined","required":false},{"name":"pt:bar:active","type":"PtValue | undefined","required":false},{"name":"pt:bar:disabled","type":"PtValue | undefined","required":false},{"name":"pt:bar:errors","type":"PtValue | undefined","required":false},{"name":"pt:bar:inRange","type":"PtValue | undefined","required":false},{"name":"pt:bar:readonly","type":"PtValue | undefined","required":false},{"name":"pt:bar:warnings","type":"PtValue | undefined","required":false},{"name":"pt:box","type":"PtValue | undefined","required":false},{"name":"pt:box:active","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:inRange","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:description","type":"PtValue | undefined","required":false},{"name":"pt:description:active","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:inRange","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:active","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:inRange","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:label","type":"PtValue | undefined","required":false},{"name":"pt:label:active","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:inRange","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:active","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:inRange","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:root","type":"PtValue | undefined","required":false},{"name":"pt:root:active","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:inRange","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:thumb","type":"PtValue | undefined","required":false},{"name":"pt:thumb:active","type":"PtValue | undefined","required":false},{"name":"pt:thumb:disabled","type":"PtValue | undefined","required":false},{"name":"pt:thumb:errors","type":"PtValue | undefined","required":false},{"name":"pt:thumb:inRange","type":"PtValue | undefined","required":false},{"name":"pt:thumb:readonly","type":"PtValue | undefined","required":false},{"name":"pt:thumb:warnings","type":"PtValue | undefined","required":false},{"name":"pt:tick","type":"PtValue | undefined","required":false},{"name":"pt:tick:active","type":"PtValue | undefined","required":false},{"name":"pt:tick:disabled","type":"PtValue | undefined","required":false},{"name":"pt:tick:errors","type":"PtValue | undefined","required":false},{"name":"pt:tick:inRange","type":"PtValue | undefined","required":false},{"name":"pt:tick:readonly","type":"PtValue | undefined","required":false},{"name":"pt:tick:warnings","type":"PtValue | undefined","required":false},{"name":"pt:ticks","type":"PtValue | undefined","required":false},{"name":"pt:ticks:active","type":"PtValue | undefined","required":false},{"name":"pt:ticks:disabled","type":"PtValue | undefined","required":false},{"name":"pt:ticks:errors","type":"PtValue | undefined","required":false},{"name":"pt:ticks:inRange","type":"PtValue | undefined","required":false},{"name":"pt:ticks:readonly","type":"PtValue | undefined","required":false},{"name":"pt:ticks:warnings","type":"PtValue | undefined","required":false},{"name":"pt:track","type":"PtValue | undefined","required":false},{"name":"pt:track:active","type":"PtValue | undefined","required":false},{"name":"pt:track:disabled","type":"PtValue | undefined","required":false},{"name":"pt:track:errors","type":"PtValue | undefined","required":false},{"name":"pt:track:inRange","type":"PtValue | undefined","required":false},{"name":"pt:track:readonly","type":"PtValue | undefined","required":false},{"name":"pt:track:warnings","type":"PtValue | undefined","required":false},{"name":"range","type":"boolean | undefined","required":false,"default":"false","description":"Set the input as range. modelValue must be an array."},{"name":"readonly","type":"boolean | undefined","required":false,"default":"false","description":"Sets the input in a readonly state."},{"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<number | number[] | null>","required":false,"description":"vee-validate rules for this field. Only inside a `BbForm`."},{"name":"step","type":"number | undefined","required":false,"default":"1","description":"The step attribute specifies the granularity that the value must adhere to."},{"name":"ticks","type":"boolean | undefined","required":false,"default":"false","description":"Displays ticks on step."},{"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":"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 slider gains focus and becomes interactive."},{"name":"focus","signature":"(event: FocusEvent): void","description":"Emitted when a thumb gains focus.\nForwards the original DOM `FocusEvent`."},{"name":"inactive","signature":"(): void","description":"Emitted when focus/click moves outside the slider after it was active."},{"name":"keydown","signature":"(event: KeyboardEvent): void","description":"Emitted for keyboard interaction on a thumb.\nForwards the original DOM `KeyboardEvent`."},{"name":"pointerdown","signature":"(event: PointerEvent): void","description":"Emitted when a pointer device is pressed on a thumb.\nForwards the original DOM `PointerEvent`."},{"name":"pointermove","signature":"(event: PointerEvent): void","description":"Emitted as a pointer device moves while dragging a thumb.\nForwards the original DOM `PointerEvent`."},{"name":"pointerup","signature":"(event: PointerEvent): void","description":"Emitted when a pointer device is released after dragging.\nForwards the original DOM `PointerEvent`."},{"name":"update:modelValue","signature":"(value: number | number[]): void","description":"Emitted with new value(s) whenever the slider position changes.\nSingle number for single slider, array for range mode."}],"slots":[{"name":"append","type":"BbSliderStepSlotProps","fields":["increase: () => void","decrease: () => void"],"description":"Content rendered after the slider track, typically used to add a max-value label or button."},{"name":"description","type":"BbSliderDescriptionSlotProps","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":"BbSliderLabelSlotProps","fields":["text: string","hasErrors: boolean","hasWarnings: boolean"],"description":"Replaces the default label text rendered above the slider."},{"name":"prepend","type":"BbSliderStepSlotProps","fields":["increase: () => void","decrease: () => void"],"description":"Content rendered before the slider track, typically used to add a min-value label or button."},{"name":"thumb","type":"BbSliderThumbSlotProps","fields":["value: number","percent: number","focused: boolean"],"description":"Fallback thumb used for non-range sliders (or inside `thumb:higher`/`thumb:lower` when not overridden separately)."},{"name":"thumb:higher","type":"BbSliderThumbSlotProps","fields":["value: number","percent: number","focused: boolean"],"description":"Replaces the default higher-value thumb in range mode (`range: true`)."},{"name":"thumb:lower","type":"BbSliderThumbSlotProps","fields":["value: number","percent: number","focused: boolean"],"description":"Replaces the default lower-value thumb in range mode (`range: true`)."},{"name":"tick","type":"BbSliderTickSlotProps","fields":["value: number","percent: number","active: boolean"],"description":"Replaces the default tick mark rendered at each step when ticks are enabled."}],"exposed":[],"models":[{"name":"modelValue","type":"number | number[] | null | undefined"}],"cssProps":[{"name":"--thumb","value":"12px","selector":".bb-slider__body","description":"thumb diameter (square, then `border-radius: 50%`)"},{"name":"--track","value":"4px","selector":".bb-slider__body","description":"rail thickness"},{"name":"--track-color","value":"var(--bb-track)","selector":".bb-slider__body","description":"The recessed rail surface — the same token the switch track reads, which is what design-tokens.md has always documented it as (\"switch/slider rails\"). It was `--bb-muted` (6% of text), a chrome wash so faint the unfilled rail barely read, and a theme that set `--bb-track` moved the switch and nothing else."},{"name":"--py","value":"calc((var(--thumb) - var(--track)) / 2)","selector":".bb-slider__body","description":"Room above and below the rail for the thumb's overhang."},{"name":"--control-h","value":"var(--bb-input-h)","selector":".bb-slider__body","description":"Row height; --compact swaps in the compact input height."},{"name":"--px","value":"0px","selector":".bb-slider__body","description":"inner left/right padding of the box"},{"name":"--track-inset","value":"0px","selector":".bb-slider__body","description":"How far the rail and the tick row are held off both ends."},{"name":"--inside-label-clearance","value":"0px","selector":".bb-slider__body","description":"height added for the label line"},{"name":"--inside-label-track-offset","value":"0px","selector":".bb-slider__body","description":"How far rail and thumbs drop from centre to clear that line."},{"name":"--bg","value":"transparent","selector":".bb-slider__body","description":"the box's fill"},{"name":"--bg-disabled","value":"transparent","selector":".bb-slider__body","description":"fill while disabled"},{"name":"--bw","value":"0px","selector":".bb-slider__body","description":"border width"},{"name":"--border-color","value":"var(--bb-field-border)","selector":".bb-slider__body","description":"resting border"},{"name":"--border-focus","value":"var(--bb-border)","selector":".bb-slider__body","description":"Border while a thumb is focused or held; the errors and warnings blocks below paint the resting border with it too."},{"name":"--elev","value":"0px 0px 0px 0px transparent","selector":".bb-slider__body","description":"resting lift of the box"},{"name":"--ring-size","value":"0px","selector":".bb-slider__body","description":"Width of the box's focus ring; its colour is --ring-color below. The thumb's halo keeps --bb-ring-size, so a bare slider still has one."},{"name":"--accent","value":"var(--bb-primary)","selector":".bb-slider__body","description":"The bar (`__bar`, the selected span, sized from JS), and the base of --ring-color below."},{"name":"--ring-color","value":"color-mix( in oklab, var(--accent) var(--bb-ring-opacity), transparent )","selector":".bb-slider__body","description":"Halo around the thumb on hover and focus; errors and warnings re-point it."},{"name":"--r","value":"var(--bb-radius)","selector":".bb-slider__body","description":"Rail rounding: all four corners of the rail, the leading pair on the selected span."},{"name":"--centre","value":"calc( (var(--control-h) + var(--inside-label-clearance)) / 2 - var(--bw) + var(--inside-label-track-offset) )","selector":".bb-slider__box","description":"The rail's centre line, from the top of the box's padding box: the middle of the control row. A fixed offset, not 50%, so the rail and the thumbs stay put when the tick row below grows the box. Declared here, on the box, so a --bw or --control-h set through pt:box is the one it reads."},{"name":"--bg","value":"var(--bb-panel)","selector":".bb-slider__thumb"},{"name":"--elev","value":"var(--bb-elev-sm)","selector":".bb-slider__thumb","description":"Small-chrome resting lift, DECLARED here so it is sealed: an ancestor that sets `--elev` for its own plate must not reach in and lift this. Same tier and same name as the checkbox and radio glyphs."},{"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 slider's container: the label, the track and the lines under them."},{"name":"label","description":"The label text (the `label` prop)."},{"name":"description","description":"The muted line under the label (the `description` prop)."},{"name":"message","description":"The errors / warnings line. A node of its own: it can show at the same time as `hint`."},{"name":"hint","description":"The helper line (the `hint` prop)."},{"name":"box","description":"The box around the rail, ticks and thumbs: bare by default, the bordered field look in inside-label mode. The slider's look locals (`--accent`, `--track-color`, `--thumb`, `--track`, `--bg`, `--bw`, …) set here reach everything inside."},{"name":"track","description":"The rail the thumbs slide on: its full length, painted with `--track-color`."},{"name":"bar","description":"The coloured bar on the rail: from the start to the value, or between the two thumbs in `range` mode. Painted with `--accent`; its size and position are set from the value (the same word as BbProgress's fill)."},{"name":"ticks","description":"The row that holds the tick marks (`ticks` prop)."},{"name":"tick","description":"Every tick mark; a broadcast, resolved per tick with its own `inRange`. Its content is the `tick` slot."},{"name":"thumb","description":"Every handle — one, or two in `range` mode; a broadcast."}],"states":[{"name":"inRange","description":"Per node, on `tick`: the tick sits inside the selected span (under the `bar`)."},{"name":"readonly","description":"Component-wide: the slider is `readonly`."},{"name":"disabled","description":"Component-wide: the slider is `disabled`."},{"name":"warnings","description":"Component-wide: the slider shows warnings and no errors."},{"name":"errors","description":"Component-wide: the slider shows errors."},{"name":"active","description":"Component-wide: the slider is engaged — a thumb focused or dragged, until focus and pointer leave it."}]},"tree":{"bindings":[{"part":"box","target":"span.bb-slider__box"},{"part":"ticks","target":"span.bb-slider__ticks"},{"part":"tick","target":"span.bb-slider__tick"},{"part":"track","target":"span.bb-slider__track"},{"part":"bar","target":"span"},{"part":"thumb","target":"span.bb-slider__thumb"}],"nodes":[{"name":"CommonField","kind":"internal","vocabulary":"BbSlider","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"}]}]},"css":{"classes":{"bb-slider":["","__bar","__body","__body--compact","__body--disabled","__body--errors","__body--readonly","__body--warnings","__box","__thumb","__thumb--focused","__thumb--higher","__thumb--lower","__thumb-container","__tick","__tick--in-range","__ticks","__track"]},"locals":["--accent","--bg","--bg-disabled","--border-color","--border-focus","--bw","--centre","--color-gray-200","--control-h","--elev","--hit","--inside-label-clearance","--inside-label-track-offset","--px","--py","--r","--ring-color","--ring-size","--thumb","--track","--track-color","--track-inset"]},"attrTargets":["div"],"removed":[{"name":"color","new":null,"since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-slider.md","silent":true,"fix":{"kind":"manual"}},{"name":"thumbTranslate","new":"disableThumbTranslate","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-slider.md","silent":true,"fix":{"kind":"invert"}},{"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-slider.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":"required","new":null,"hint":"a slider's role cannot carry `required`, so it carries none (like BbCheckboxGroup / BbSwitchGroup). Delete the prop; inside a BbForm a `required` rule or the schema still validates it and shows the asterisk","since":"3.0.0-beta.42","migration":"ai/guides/migration/components/bb-slider.md","silent":true,"fix":{"kind":"manual"}}],"renamed":[{"from":"thumbTranslate","to":"disableThumbTranslate","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-slider.md","fix":{"kind":"invert"}},{"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-slider.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"}}]},
|
|
492
492
|
{"name":"BbSmoothHeight","group":"Layout & Utility","description":"Animates height transitions for dynamic content.","referenceOnly":false,"hasGuide":true,"contract":"ai/BbSmoothHeight.md","source":"ai/source/BbSmoothHeight.md","props":[{"name":"disabled","type":"boolean | undefined","required":false,"default":"false","description":"Disable smooth-height behavior and allow natural content height."},{"name":"mutationOptions","type":"MutationObserverInit | undefined","required":false,"default":"{ childList: true }","description":"Options to pass to the MutationObserver."},{"name":"pt","type":"PtMap<\"root\", never> | undefined","required":false,"description":"Passthrough, object form: the same keys as the `pt:*` attributes\nwithout the prefix. See the `pt:<part>` row."},{"name":"pt:root","type":"PtValue | undefined","required":false},{"name":"resizeOptions","type":"ResizeObserverOptions | undefined","required":false,"description":"Options to pass to the ResizeObserver."},{"name":"strategy","type":"\"resize\" | \"mutation\" | undefined","required":false,"default":"\"resize\"","description":"Define which strategy to use. By default `'resize'` is used, which means the\ncomponent will update on resizing. You can also define `'mutation'` to use a MutationObserver."},{"name":"tag","type":"LayoutTag | undefined","required":false,"default":"\"div\"","values":["div","span"],"description":"Element rendered as the component's wrapper."},{"name":"transitionDuration","type":"number | undefined","required":false,"default":"250","description":"How long the transition has to last in milliseconds"}],"events":[],"slots":[{"name":"default","type":"object","description":"Content whose height changes are animated with a smooth transition."}],"exposed":[],"models":[],"pt":{"parts":[{"name":"root","description":"The box whose height animates."}],"states":[]},"css":{"classes":{"bb-smooth-height":["","--disabled","__content"]},"locals":["--color-gray-200","--transition-duration"]}},
|
|
493
493
|
{"name":"BbSpinner","group":"Feedback","description":"Indicates ongoing loading or pending operations.","referenceOnly":false,"hasGuide":true,"contract":"ai/BbSpinner.md","source":"ai/source/BbSpinner.md","props":[{"name":"label","type":"string | undefined","required":false,"description":"Accessible loading announcement. When set, the spinner is wrapped in a\n`role=\"status\"` element containing this text rendered `bb-sr-only`, so\nscreen readers announce the loading state. When omitted the markup is\nunchanged and the spinner is purely decorative."},{"name":"pt","type":"PtMap<\"root\", never> | undefined","required":false,"description":"Passthrough, object form: the same keys as the `pt:*` attributes\nwithout the prefix. See the `pt:<part>` row."},{"name":"pt:root","type":"PtValue | undefined","required":false},{"name":"size","type":"number | CssSize | keyof Sizes | undefined","required":false,"default":"\"md\"","description":"Defines the component size.\n\nAccepted values:\n- A key from the provided size map (`keyof T`), e.g. `'sm' | 'md' | 'lg'`\n- A custom CSS size string (e.g. `'20px'`, `'1.5rem'`, `'2em'`)\n- A number, typically interpreted as pixels by size parsers"}],"events":[],"slots":[],"exposed":[],"models":[],"pt":{"parts":[{"name":"root","description":"The spinning glyph. With a `label`, the status wrapper around it is not a part."}],"states":[]},"tree":{"nodes":[{"name":"BbIcon","kind":"public","cssProps":[{"name":"--w","documented":true,"readBy":["bb-icon"]},{"name":"--size","documented":false,"readBy":["bb-icon"]}]}]},"css":{"classes":{"bb-spinner":["","__circle","__circle--1","__circle--10","__circle--11","__circle--2","__circle--3","__circle--4","__circle--5","__circle--6","__circle--7","__circle--8","__circle--9"]},"locals":["--color-gray-200","--size"]},"attrTargets":["svg"],"removed":[{"name":"color","new":null,"since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-spinner.md","silent":true,"fix":{"kind":"manual"}}]},
|
|
494
494
|
{"name":"BbSwitch","group":"Selection","description":"Toggles two-state values with switch semantics.","referenceOnly":false,"hasGuide":true,"contract":"ai/BbSwitch.md","source":"ai/source/BbSwitch.md","props":[{"name":"autofocus","type":"Booleanish | undefined","required":false,"description":"Sets autofocus on page load."},{"name":"checked","type":"boolean | undefined","required":false,"default":"undefined","description":"Defines the input as checked."},{"name":"compact","type":"boolean | undefined","required":false,"default":"false","description":"Compact density. Swaps `--bb-label-spacing-y` for\n`--bb-label-spacing-y-compact`, so tune a compact field's label gap with\nthe `-compact` token, not the base one. The same meaning as on the\ncheckbox, radio and switch groups."},{"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":"falseValue","type":"any","required":false,"description":"Value of the input when unchecked. It handles any kind of serializable object."},{"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":"indeterminate","type":"boolean | undefined","required":false,"default":"false","description":"Sets the input in an indeterminate state."},{"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":"inputPosition","type":"\"left\" | \"center\" | \"right\" | undefined","required":false,"default":"\"left\"","description":"Sets the alignment of the input. Since inputs are inline block they can be aligned just as text can."},{"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":"labelPosition","type":"\"left\" | \"center\" | \"right\" | undefined","required":false,"description":"Sets the text alignment of the label."},{"name":"layout","type":"FieldLayout | undefined","required":false,"default":"\"auto\"","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":"modelValue","type":"any","required":false,"description":"Used by v-model. Can be any serializable type."},{"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":"pt","type":"PtMap<TogglePtPart, CheckablePtState> | undefined","required":false,"description":"Passthrough, object form: the same keys as the `pt:*` attributes\nwithout the prefix. See the `pt:<part>` row."},{"name":"pt:description","type":"PtValue | undefined","required":false},{"name":"pt:description:checked","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:focused","type":"PtValue | undefined","required":false},{"name":"pt:description:focusVisible","type":"PtValue | undefined","required":false},{"name":"pt:description:indeterminate","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:checked","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:focused","type":"PtValue | undefined","required":false},{"name":"pt:hint:focusVisible","type":"PtValue | undefined","required":false},{"name":"pt:hint:indeterminate","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:checked","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:focused","type":"PtValue | undefined","required":false},{"name":"pt:icon:focusVisible","type":"PtValue | undefined","required":false},{"name":"pt:icon:indeterminate","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:label","type":"PtValue | undefined","required":false},{"name":"pt:label:checked","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:focused","type":"PtValue | undefined","required":false},{"name":"pt:label:focusVisible","type":"PtValue | undefined","required":false},{"name":"pt:label:indeterminate","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:checked","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:focused","type":"PtValue | undefined","required":false},{"name":"pt:message:focusVisible","type":"PtValue | undefined","required":false},{"name":"pt:message:indeterminate","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:root","type":"PtValue | undefined","required":false},{"name":"pt:root:checked","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:focused","type":"PtValue | undefined","required":false},{"name":"pt:root:focusVisible","type":"PtValue | undefined","required":false},{"name":"pt:root:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:root:readonly","type":"PtValue | undefined","required":false},{"name":"pt:root: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: in every direction the order of the label and the\ninput is swapped from the standard arrangement."},{"name":"rules","type":"RuleExpression<any>","required":false,"description":"vee-validate rules for this field. Only inside a `BbForm`."},{"name":"submitWhenFalse","type":"boolean | undefined","required":false,"default":"false","description":"Will submit \"falseValue\" if the input is not checked. Otherwise \"trueValue\" will be submitted."},{"name":"trueValue","type":"any","required":false,"description":"Value of the input when checked. It handles any kind of serializable object."},{"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":"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 checkbox checked state changes.\nForwards the original DOM `Event` from the input."},{"name":"click","signature":"(event: MouseEvent): void","description":"Emitted when the input receives a click interaction.\nForwards the original DOM `MouseEvent`."},{"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 checkbox input.\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":"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":"update:modelValue","signature":"(value: any): void","description":"Emitted on checked-state changes with the effective model value:\n- `trueValue` when checked\n- `falseValue` when unchecked"}],"slots":[{"name":"description","type":"BbSwitchDescriptionSlotProps","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":"icon","type":"BbCheckboxIconSlotProps","fields":["checked: boolean","disabled: boolean","indeterminate?: boolean","falseValue: any","focused: boolean","focusVisible: boolean","hasErrors: boolean","hasWarnings: boolean","id: string","name: string","parsedValue: string","readonly: boolean","trueValue: any","value: any","text: string"],"description":"Replaces the default toggle track visual inside the switch. Receives the\nswitch state plus the label text."},{"name":"label","type":"BbSwitchLabelSlotProps","fields":["text: string","hasErrors: boolean","hasWarnings: boolean"],"description":"Replaces the default label text rendered next to the switch."}],"exposed":[],"models":[{"name":"modelValue","type":"any"}],"pt":{"parts":[{"name":"root","description":"The toggle's container: the glyph, the label and the lines under them."},{"name":"label","description":"The label text beside the glyph (the `label` prop)."},{"name":"description","description":"The muted line under the label (the `description` prop)."},{"name":"message","description":"The errors / warnings line. 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":"icon","description":"The drawn glyph — the box, the dot or the switch track. The default one: a consumer `icon` slot replaces it. The hidden native input is not a part."}],"states":[{"name":"checked","description":"Component-wide: the toggle is on."},{"name":"indeterminate","description":"Component-wide: the mixed state (the `indeterminate` prop) — neither on nor off."},{"name":"readonly","description":"Component-wide: the toggle is `readonly` — focusable, cannot change."},{"name":"disabled","description":"Component-wide: the toggle is `disabled`."},{"name":"warnings","description":"Component-wide: the toggle shows warnings and no errors."},{"name":"errors","description":"Component-wide: the toggle shows errors — the glyph and the message line turn red."},{"name":"focused","description":"Component-wide: the native input has focus — any focus, mouse included, like the `focused` slot prop."},{"name":"focusVisible","description":"Component-wide: that focus is keyboard-visible — where a focus ring belongs."}]},"tree":{"bindings":[{"part":"icon","target":"BbBaseSwitchIcon"}],"nodes":[{"name":"CommonField","kind":"internal","vocabulary":"BbSwitch","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":"BbBaseSwitchIcon","kind":"public","cssProps":[{"name":"--accent","documented":true,"readBy":["bb-base-switch-icon","bb-base-switch-icon--errors","bb-base-switch-icon--checked","bb-base-switch-icon--indeterminate","bb-base-switch-icon--warnings","bb-base-switch-icon--disabled"]},{"name":"--bg","documented":true,"readBy":["bb-base-switch-icon"]},{"name":"--ring-color","documented":true,"readBy":["bb-base-switch-icon--focus-visible"]},{"name":"--r","documented":true,"readBy":["bb-base-switch-icon","bb-base-switch-icon__thumb"]},{"name":"--bw","documented":true,"readBy":["bb-base-switch-icon","bb-base-switch-icon__thumb"]},{"name":"--h","documented":true,"readBy":["bb-base-switch-icon"]},{"name":"--w","documented":true,"readBy":["bb-base-switch-icon"]},{"name":"--thumb","documented":true,"readBy":["bb-base-switch-icon","bb-base-switch-icon__thumb"]},{"name":"--inset","documented":true,"readBy":["bb-base-switch-icon","bb-base-switch-icon__thumb"]},{"name":"--travel","documented":true,"readBy":["bb-base-switch-icon__thumb"]}]}]},"css":{"classes":{"bb-switch":[""]},"locals":["--color-gray-200"]},"attrTargets":["div"],"removed":[{"name":"color","new":null,"since":"3.0.0-beta.15","migration":"ai/guides/migration/components/bb-checkbox.md","silent":true,"fix":{"kind":"manual"}},{"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":"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":"validateOn","to":"validationMode","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"manual"}}]},
|
|
495
495
|
{"name":"BbSwitchGroup","group":"Selection","description":"Manages grouped switch options with shared behavior.","referenceOnly":false,"hasGuide":true,"contract":"ai/BbSwitchGroup.md","source":"ai/source/BbSwitchGroup.md","props":[{"name":"autofocus","type":"Booleanish | undefined","required":false,"description":"Sets autofocus on page load."},{"name":"compact","type":"boolean | undefined","required":false,"default":"false","description":"Compact density. Swaps `--bb-label-spacing-y` for\n`--bb-label-spacing-y-compact`, so tune a compact group's label gap with\nthe `-compact` token, not the base one."},{"name":"dependencies","type":"unknown[] | undefined","required":false,"description":"Defines an array of dependencies that will trigger actions in the component upon change."},{"name":"depsDebounceTime","type":"number | undefined","required":false,"description":"Timeout used to debounce response to changes to dependencies."},{"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":"emptyText","type":"string | undefined","required":false,"description":"String displayed when there are no items to display."},{"name":"enforceCoherence","type":"boolean | undefined","required":false,"default":"false","description":"If coherence is enforced the input cannot have a modelValue that is incoherent with its current items.\n\ne.g. You cannot set v-model to a user that is not present in the items passed.\n\nmodelValue will be reset upon incoherence.\n\nChecked after every applied, successful load (an empty one included);\na failed load never prunes."},{"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":"failedText","type":"string | undefined","required":false,"default":"the localized `common.failedText` (\"Couldn't load items\")","description":"String displayed in the empty state while the latest load FAILED (the\n`items` provider threw): the twin of `emptyText` for that case."},{"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 each option's label text (the text rendered next to every\ninput) while keeping it accessible to screen readers.\nDoes not affect the fieldset legend — use `hideLegend` for that."},{"name":"hideLegend","type":"boolean | undefined","required":false,"default":"false","description":"Visually hides the legend of the fieldset 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":"Prefix for the ids of each option's input and of the label, description\nand message. 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":"inputPosition","type":"\"left\" | \"center\" | \"right\" | undefined","required":false,"default":"\"left\"","description":"Sets the alignment of the input. Since inputs are inline block they can be aligned just as text can."},{"name":"itemInputAlign","type":"FieldCrossAlign | undefined","required":false,"values":["top","center","bottom"],"description":"Vertical position of each option's control in its row; `'center'` is\nthe middle of the label plus its description. Omitted, it sits on the\nlabel's first line."},{"name":"itemLabelAlign","type":"FieldCrossAlign | undefined","required":false,"values":["top","center","bottom"],"description":"Vertical position of each option's label in its row. Omitted, it stays\nas it is."},{"name":"itemLayout","type":"FieldLayout | undefined","required":false,"default":"'auto'","description":"How each row's input and label sit together — the keywords of `layout`:\n`'auto'`, `'vertical'` (the input above the label), `'horizontal'`\n(50/50), `'label-fill'` (the label takes the row's free space — pair it\nwith `list-layout=\"vertical-stretch\"` and `item-reverse` for a settings\nlist), `'input-fill'`, or a two-word ratio pattern like `'xx xxxxx'`,\nread in on-screen order."},{"name":"itemProps","type":"BbOptionGroupItemProps<T> | undefined","required":false,"description":"ADDITIONAL row fields resolved from each item — never its text or value\n(those stay on `itemText` / `itemValue`). Option groups accept one field:\n\n- `description` — a muted line under the option label, beside the control;\n it may wrap.\n\nEither an object with a path or getter per field\n(`{ description: 'email' }`) or a function returning the fields\n(`(item) => ({ description: item.email })`). Without it no field renders —\nan item's own `description` is never read implicitly — and an empty value\nrenders nothing for that item. The description is announced as the\noption's description, never part of its name. To disable individual\noptions use `selectable`."},{"name":"itemReverse","type":"boolean | undefined","required":false,"default":"false","description":"Swaps each row's input and label from their natural order (input first),\nin every `item-layout`. `reverse` swaps the legend and the options instead."},{"name":"items","type":"T[] | ((context: BbCheckboxGroupItemsContext) => T[] | Promise<T[]>)","required":true,"description":"The options: an array, or a provider function called with ONE context\nobject and returning the rows, sync or async. The context carries:\n- `reason` — why this call happened: `'initial'` (the first load, on\n mount), `'dependencies'` (a `dependencies` entry or the `items`\n function changed; a retry arrives this way) or `'model'` (the model\n changed from outside and the options cannot resolve it). The group has\n no search field, so it never passes `query`;\n- `modelValue` — the `v-model` as-is;\n- `signal` — an `AbortSignal`, aborted when a newer call starts or the\n group is disposed; pass it to every request.\n\nA provider signals a failure by THROWING, never by returning `[]`: the\nrows are cleared, nothing is pruned, and `#empty` receives the `error`\n(`failed-text` is shown). Zero-argument providers keep working. Annotate\nthe parameter `BbCheckboxGroupItemsContext` (`BbSwitchGroupItemsContext`\non a switch group, the same shape)."},{"name":"itemText","type":"ItemAccessor<T, string> | undefined","required":false,"default":"JSON.stringify(item)","description":"Defines a path that returns a property of the object to use as text or a function that returns a string."},{"name":"itemValue","type":"ItemAccessor<T> | undefined","required":false,"default":"the whole item","description":"Defines a path that returns a property of the object to use as value or a function that returns any value."},{"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":"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":"legend","type":"string","required":true,"description":"Text content of the legend."},{"name":"legendMode","type":"\"outside\" | \"inside\" | undefined","required":false,"description":"Legend rendering mode. `'outside'` renders the legend above the fieldset in the normal flow;\n`'inside'` overlays the legend inside the fieldset border.\nFloating mode is not supported for option groups (checkbox, radio or\nswitch) — there is no single field for the legend to float against."},{"name":"legendPosition","type":"\"left\" | \"center\" | \"right\" | undefined","required":false,"description":"Sets the text alignment of the label."},{"name":"listLayout","type":"ListLayout | undefined","required":false,"default":"'horizontal'","values":["horizontal","vertical","vertical-stretch","tiles"],"description":"How the rows sit inside the list: `'horizontal'` (on a line, wrapping,\neach row its own size), `'vertical'` (stacked, each row its own size),\n`'vertical-stretch'` (stacked, each row as wide as the list) or\n`'tiles'` (equal-size boxes, wrapping onto new lines as the field\nnarrows; `--tile-min-width` on `pt:list` sets how narrow a tile gets)."},{"name":"loadingText","type":"string | undefined","required":false,"description":"String displayed while items are being loaded."},{"name":"max","type":"number | undefined","required":false,"description":"Maximum number of selected items."},{"name":"modelValue","type":"any","required":false,"description":"Used by v-model. Can be an array of any serializable type."},{"name":"modelValueDebounceTime","type":"number | undefined","required":false,"description":"Timeout used to debounce response to changes to modelValue."},{"name":"multiple","type":"boolean | undefined","required":false,"default":"true","description":"Enables multi-selection behavior.\nWhen true, `modelValue` must be an array.\nWhen false, `modelValue` should be a single value."},{"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":"pt","type":"GroupPtMap<T> | undefined","required":false,"description":"Passthrough, object form: the same keys as the `pt:*` attributes\nwithout the prefix. See the `pt:<part>` row."},{"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 | ((ctx: PtItemCtx<T, GroupPtState>) => PtItemResult) | undefined","required":false},{"name":"pt:icon:checked","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:focused","type":"PtValue | undefined","required":false},{"name":"pt:icon:focusVisible","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:item","type":"PtValue | ((ctx: PtItemCtx<T, GroupPtState>) => PtItemResult) | undefined","required":false},{"name":"pt:item:checked","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:focused","type":"PtValue | undefined","required":false},{"name":"pt:item:focusVisible","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:readonly","type":"PtValue | undefined","required":false},{"name":"pt:item:warnings","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription","type":"PtValue | ((ctx: PtItemCtx<T, GroupPtState>) => PtItemResult) | undefined","required":false},{"name":"pt:itemDescription:checked","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:disabled","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:errors","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:focused","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:focusVisible","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:loading","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:readonly","type":"PtValue | undefined","required":false},{"name":"pt:itemDescription:warnings","type":"PtValue | undefined","required":false},{"name":"pt:label","type":"PtValue | ((ctx: PtItemCtx<T, GroupPtState>) => PtItemResult) | undefined","required":false},{"name":"pt:label:checked","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:focused","type":"PtValue | undefined","required":false},{"name":"pt:label:focusVisible","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:legend","type":"PtValue | undefined","required":false},{"name":"pt:legend:disabled","type":"PtValue | undefined","required":false},{"name":"pt:legend:errors","type":"PtValue | undefined","required":false},{"name":"pt:legend:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:legend:loading","type":"PtValue | undefined","required":false},{"name":"pt:legend:readonly","type":"PtValue | undefined","required":false},{"name":"pt:legend:warnings","type":"PtValue | undefined","required":false},{"name":"pt:list","type":"PtValue | undefined","required":false},{"name":"pt:list:disabled","type":"PtValue | undefined","required":false},{"name":"pt:list:errors","type":"PtValue | undefined","required":false},{"name":"pt:list:hasValue","type":"PtValue | undefined","required":false},{"name":"pt:list:loading","type":"PtValue | undefined","required":false},{"name":"pt:list:readonly","type":"PtValue | undefined","required":false},{"name":"pt:list: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: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":"readonly","type":"boolean | undefined","required":false,"default":"false","description":"Sets the input in a readonly state."},{"name":"reverse","type":"boolean | undefined","required":false,"default":"false","description":"Reverses the layout. Applicable in every direction the order of the label and the input is swapped."},{"name":"rules","type":"RuleExpression<any>","required":false,"description":"vee-validate rules for this field. Only inside a `BbForm`."},{"name":"selectable","type":"boolean | ((item: T) => boolean) | undefined","required":false,"default":"true","description":"Defines whether options are selectable.\nCan be a global boolean that affects all options or a function\nthat accepts an item and returns a boolean that only affects that item.\nNon-selectable options are rendered disabled."},{"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":"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 group becomes active (focus/click enters it)."},{"name":"blur","signature":"(event: FocusEvent): void","description":"Emitted when one of the generated checkbox inputs loses focus.\nForwards the original DOM `FocusEvent`."},{"name":"change","signature":"(event: Event): void","description":"Emitted when an option is toggled.\nForwards the original DOM `Event` from the checkbox input."},{"name":"click","signature":"(event: MouseEvent): void","description":"Emitted when one of the generated checkbox inputs is clicked.\nForwards the original DOM `MouseEvent`."},{"name":"focus","signature":"(event: FocusEvent): void","description":"Emitted when one of the generated checkbox inputs receives focus.\nForwards the original DOM `FocusEvent`."},{"name":"inactive","signature":"(): void","description":"Emitted when focus/click moves outside the group after it was active.\nUseful for validation-on-blur flows at group level."},{"name":"input","signature":"(event: Event): void","description":"Emitted on native input events from generated checkbox inputs.\nForwards the original DOM `Event`."},{"name":"keydown","signature":"(event: KeyboardEvent): void","description":"Emitted for keyboard interaction on generated checkbox inputs.\nForwards the original DOM `KeyboardEvent`."},{"name":"mousedown","signature":"(event: MouseEvent): void","description":"Emitted when a pointing device button is pressed over a checkbox input.\nForwards the original DOM `MouseEvent`."},{"name":"mouseup","signature":"(event: MouseEvent): void","description":"Emitted when a pointing device button is released over a checkbox input.\nForwards the original DOM `MouseEvent`."},{"name":"update:modelValue","signature":"(value: any): void","description":"Emitted with the coherent next selection array whenever selection changes."}],"slots":[{"name":"append","type":"object","description":"Content rendered after the last option, inside the options container."},{"name":"description","type":"BbSwitchGroupDescriptionSlotProps","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":"empty","type":"{ error: unknown; }","description":"Content shown when no options are available (replaces the default \"no\ndata\" text). `error` is what the latest failed load rejected with,\nuntouched, and `null` when nothing failed — a failed load clears the\nrows, so this slot is where it shows."},{"name":"icon","type":"BbSwitchGroupIconSlotProps<T>","fields":["disabled: boolean","readonly: boolean","checked: boolean","indeterminate?: boolean","focused: boolean","focusVisible: boolean","id: string","name: string","falseValue: any","hasErrors: boolean","hasWarnings: boolean","parsedValue: string","trueValue: any","value: any","item: T","text: string"],"description":"Replaces the default switch track visual for each option. Receives the\nswitch state plus the source item and its display text."},{"name":"label","type":"BbSwitchGroupLabelSlotProps<T>","fields":["item: T","text: string","checked: boolean","description: string"],"description":"Replaces the default label text for each option."},{"name":"legend","type":"BbSwitchGroupLegendSlotProps","fields":["text: string","hasErrors: boolean","hasWarnings: boolean"],"description":"Replaces the default fieldset legend text for the group."},{"name":"loading","type":"object","description":"Content shown while options are loading (replaces the default loading text)."},{"name":"prepend","type":"object","description":"Content rendered before the first option, inside the options container."}],"exposed":[],"models":[{"name":"modelValue","type":"any"}],"cssProps":[{"name":"--gap","value":"24px","selector":".bb-switch-group__list","description":"Space between rows on one line."},{"name":"--row-gap","value":"10px","selector":".bb-switch-group__list","description":"Space between wrapped lines."},{"name":"--tile-min-width","value":"96px","selector":".bb-switch-group__list","description":"How narrow a tile may get before the tiles wrap (`tiles` only)."}],"pt":{"parts":[{"name":"root","description":"The group's container (the fieldset)."},{"name":"legend","description":"The group's heading — the fieldset `<legend>` (the `legend` prop)."},{"name":"description","description":"The muted line under the legend (the `description` prop)."},{"name":"message","description":"The errors / warnings line. 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":"list","description":"The node that lays the rows out (flex + wrap, gaps on `--gap` / `--row-gap`): `pt:list=\"grid grid-cols-3\"` re-lays them, `pt:list=\"[--gap:8px]\"` tightens them. Takes the group-wide states only."},{"name":"item","description":"One option row — a broadcast, resolved per option with its own `checked` / `disabled` / focus. Takes a per-item function."},{"name":"icon","description":"One row's drawn glyph — the default one: a consumer `icon` slot replaces it. Takes a per-item function."},{"name":"label","description":"One option's label text (the `label` slot's default). Takes a per-item function."},{"name":"itemDescription","description":"One option's muted second line, its description. Takes a per-item function."}],"states":[{"name":"hasValue","description":"Component-wide: at least one option is chosen."},{"name":"checked","description":"Per row, on `item`, `icon`, `label` and `itemDescription`: that option is chosen. Never on a field part."},{"name":"readonly","description":"Component-wide: the group is `readonly`."},{"name":"disabled","description":"Component-wide while the group is `disabled`; also per row, on the row parts of an option that is disabled on its own."},{"name":"warnings","description":"Component-wide: the group shows warnings and no errors."},{"name":"errors","description":"Component-wide: the group shows errors."},{"name":"focused","description":"Per row, on the row parts: that option's input has focus — any focus, mouse included."},{"name":"focusVisible","description":"Per row, on the row parts: that option's focus is keyboard-visible — where a focus ring belongs."},{"name":"loading","description":"Component-wide: the items are being fetched."}]},"tree":{"bindings":[{"part":"icon","target":"BbBaseSwitchIcon"}],"nodes":[{"name":"CommonField","kind":"internal","vocabulary":"BbSwitchGroup","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":"OptionsContainer","kind":"internal","vocabulary":"BbSwitchGroup","bindings":[{"part":"list","target":"span"},{"part":"item","target":"label"},{"part":"label","target":"span"},{"part":"itemDescription","target":"span"}]},{"name":"BbBaseSwitchIcon","kind":"public","cssProps":[{"name":"--accent","documented":true,"readBy":["bb-base-switch-icon","bb-base-switch-icon--errors","bb-base-switch-icon--checked","bb-base-switch-icon--indeterminate","bb-base-switch-icon--warnings","bb-base-switch-icon--disabled"]},{"name":"--bg","documented":true,"readBy":["bb-base-switch-icon"]},{"name":"--ring-color","documented":true,"readBy":["bb-base-switch-icon--focus-visible"]},{"name":"--r","documented":true,"readBy":["bb-base-switch-icon","bb-base-switch-icon__thumb"]},{"name":"--bw","documented":true,"readBy":["bb-base-switch-icon","bb-base-switch-icon__thumb"]},{"name":"--h","documented":true,"readBy":["bb-base-switch-icon"]},{"name":"--w","documented":true,"readBy":["bb-base-switch-icon"]},{"name":"--thumb","documented":true,"readBy":["bb-base-switch-icon","bb-base-switch-icon__thumb"]},{"name":"--inset","documented":true,"readBy":["bb-base-switch-icon","bb-base-switch-icon__thumb"]},{"name":"--travel","documented":true,"readBy":["bb-base-switch-icon__thumb"]}]}]},"css":{"classes":{"bb-switch-group":["","__empty","__item","__item--*","__item--aligned","__item--description","__item--disabled","__item--focus-visible","__item--focused","__item--input-align-*","__item--input-align-bottom","__item--input-align-center","__item--input-align-top","__item--label-align-*","__item--label-align-bottom","__item--label-align-center","__item--label-align-top","__item--reverse","__item--selected","__item--vertical","__item-description","__label","__list","__list--*","__list--errors","__list--tiles","__list--warnings","__loading"]},"locals":["--color-gray-200","--gap","--h","--hit","--row-gap","--tap-row-gap","--tile-min-width"]},"attrTargets":["div"],"removed":[{"name":"color","new":null,"since":"3.0.0-beta.15","migration":"ai/guides/migration/components/bb-checkbox-group.md","silent":true,"fix":{"kind":"manual"}},{"name":"labelPosition","new":"legendPosition","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-checkbox-group.md","silent":true,"fix":{"kind":"rename"}},{"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":"inputDirection","new":"listLayout","since":"3.0.0-beta.33","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename","valueMap":{"horizontal":"horizontal","vertical":"vertical-stretch"}}},{"name":"noDataText","new":"emptyText","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"no-data","new":"empty","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":"labelPosition","to":"legendPosition","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-checkbox-group.md","fix":{"kind":"rename"}},{"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":"inputDirection","to":"listLayout","since":"3.0.0-beta.33","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename","valueMap":{"horizontal":"horizontal","vertical":"vertical-stretch"}}},{"from":"noDataText","to":"emptyText","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"no-data","to":"empty","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"}}]},
|
|
496
|
-
{"name":"BbTable","group":"Data Display","description":"Displays tabular data, configurable columns and data mapper.","referenceOnly":false,"hasGuide":true,"contract":"ai/BbTable.md","source":"ai/source/BbTable.md","props":[{"name":"accessibleLabel","type":"((columns: MappedCell[], item: any) => string) | undefined","required":false,"description":"Function that accepts the columns and the current item as\narguments and returns a label to be used for accessibility purposes.\nThe cells arrive in RENDER order (they follow `order`, so the\nlabel reads like the row) — look a cell up by `key`, never by position."},{"name":"actionsText","type":"string | undefined","required":false,"description":"Label used in the header of the actions column."},{"name":"align","type":"\"left\" | \"center\" | \"right\" | undefined","required":false,"default":"\"left\"","description":"Text alignment of the columns."},{"name":"caption","type":"string | undefined","required":false,"description":"Caption that describes the content of the table. Used for accessibility purposes."},{"name":"columns","type":"BbTableColumn<T>[] | undefined","required":false,"default":"[]","description":"Array of definitions of how the columns should be rendered."},{"name":"compact","type":"boolean | undefined","required":false,"default":"false","description":"Adds a CSS class that applies a compact style to the component."},{"name":"dependencies","type":"unknown[] | undefined","required":false,"default":"[]","description":"Defines an array of dependencies that will trigger actions in the component upon change."},{"name":"depsDebounceTime","type":"number | undefined","required":false,"default":"0","description":"Timeout used to debounce response to changes to dependencies."},{"name":"disabled","type":"boolean | undefined","required":false,"default":"false","description":"Disables the component"},{"name":"disableSelectAll","type":"boolean | undefined","required":false,"default":"false","description":"Hides the \"Select all\" checkbox that selectable multi-row tables\ndisplay by default."},{"name":"displayCaption","type":"boolean | undefined","required":false,"default":"false","description":"Shows the caption as a visible title. Off by default: the caption is\nvisually hidden but still read by screen readers."},{"name":"emptyText","type":"string | undefined","required":false,"default":"the localized `common.emptyText` (\"No data to display\")","description":"String displayed when there are no items to display."},{"name":"enforceCoherence","type":"boolean | undefined","required":false,"default":"false","description":"After every load (initial, `dependencies` refetch or a change of the\n`items` array) prunes the row-keyed models of values whose row is no\nlonger in the result set: `modelValue`, `unselected-items`,\n`highlighted` and `expanded-items`. Values whose rows are still present\nsurvive. Single-value models (`modelValue` without `multiple`, and\n`highlighted`, which is always single) reset to `null`.\n\nDo **not** enable it on a provider-paginated table (`items` is a\nfunction): a page change always refetches, so state held on rows of\nother pages (the `select-all` + `unselected-items` pattern, cross-page\nselections) would be pruned. Reconcile in the items provider instead."},{"name":"expandedItems","type":"any[] | undefined","required":false,"default":"[]","description":"Used by `v-model:expandedItems`. Array of the currently expanded items —\ntoggled by the row expand control and by external writes (mirrors the\n`highlighted`/`sort` v-model surfaces). Drives the `#expand` slot rows and\ntheir `aria-expanded`/`aria-controls` wiring."},{"name":"failedText","type":"string | undefined","required":false,"default":"the localized `common.failedText` (\"Couldn't load items\")","description":"String displayed in the empty state while the latest load FAILED (the\n`items` provider threw): the twin of `emptyText` for that case."},{"name":"fixed","type":"boolean | undefined","required":false,"default":"false","description":"Splits the width equally among the columns that declare no `width`\n(each undeclared column becomes a `minmax(0, 1fr)` track)\nmaking each column take up the same amount of space."},{"name":"fixedActions","type":"boolean | undefined","required":false,"default":"false","description":"Pins the actions column (the one the `#actions` slot creates) to the\nright edge, `position: sticky`, in place. Data columns pin through\n`column.fixed`; this is the same feature for the structural column that\nhas no definition to carry it. No effect without an `#actions` slot."},{"name":"fixedFirst","type":"boolean | undefined","required":false,"default":"false","description":"Sticks the `#<key>:first` row to the top of the scrollport (under a\nstuck header)."},{"name":"fixedHeaders","type":"boolean | undefined","required":false,"default":"false","description":"Boolean that sets the headers as sticky to the top of the table."},{"name":"fixedLast","type":"boolean | undefined","required":false,"default":"false","description":"Sticks the `#<key>:last` row (a totals row) to the bottom of the\nscrollport."},{"name":"fixedSelect","type":"boolean | undefined","required":false,"default":"false","description":"Pins the selection column to the left edge, `position: sticky`, in\nplace. Data columns pin through `column.fixed`; this is the same feature\nfor the structural column that has no definition to carry it. No effect\nunless the table is `selectable`."},{"name":"headerRowClass","type":"Classes | undefined","required":false,"description":"Defines the classes to be passed to the header row."},{"name":"highlighted","type":"any","required":false,"default":"undefined","description":"Used by `v-model:highlighted`. A parallel, UI-intent state to selection —\ntypically \"the row whose details are open\". A single item value (or\n`null`) — highlight is single by design.\n\n**Opt-in, and `undefined` is the opt-out.** Leave it unbound and the whole\nmechanic is off: clicking a row emits `click:row` and nothing else — no\nclass, no `aria-current`, no internal state. Bind it and clicking a row\ntoggles it. The value itself is the switch: `undefined` means \"never\ninitialised\", `null` means \"initialised and currently empty\", so bind\n`ref(null)` rather than `ref()` — a bound-but-`undefined` model warns in\ndev and stays off. A value seeded through\n`useBbTableContext(id, { highlighted })` counts as bound the same way.\n\nA highlighted row gets `aria-current=\"true\"` and the\n`bb-table__row--highlighted` class, which the shipped stylesheet\npaints with a neutral fill plus a brand accent bar; override the whole\nlook with `rowClass`.\nHighlight: a parallel, UI-intent state to selection (\"the row whose details\nare open\"). Always a single value or `null`. Purely\nmechanical — highlighted rows only get a class and `aria-current`, no\nshipped styling."},{"name":"id","type":"string | undefined","required":false,"description":"Stable id for this table's width context. When omitted a unique id is\ngenerated. Nested tables use the nearest ancestor id to inherit widths."},{"name":"inheritColumnWidths","type":"string | boolean | undefined","required":false,"description":"Opt a nested table into inheriting its column widths from an ancestor\ntable's matching tracks (accounting for `select`/`actions` columns). This\nalso makes the parent's tracks authoritative, so it is **off by default** — a nested\ntable renders independently unless you ask for alignment.\n- `false` (the default): do not inherit; size independently.\n- `true`: inherit from the nearest ancestor table.\n- a table id (string): inherit from the specific ancestor in the chain with\n that id rather than the immediate parent. Use this when an intermediate\n table has a different column count, so the extra columns would otherwise\n misalign against it."},{"name":"interactiveWhileLoading","type":"boolean | undefined","required":false,"default":"false","description":"Keeps the table interactive while it is loading. The header and the rows are\n`inert` while loading by default — a refetch is about to replace the rows,\nso editing, selecting or sorting them races the incoming data. This escape\nhatch exists for tables that must stay usable during background refreshes\n(e.g. a poll that must not interrupt an open editor).\n\nThe loading announcement is never inert, so the busy state is always\nconveyed."},{"name":"items","type":"Item[] | ((context: BbTableItemsContext) => Item[] | Promise<Item[]>)","required":true,"default":"[]","description":"Rows to render: an array, or a provider function called with ONE\ncontext object and returning the rows, sync or async. The context\ncarries:\n- `reason` — why this call happened: `'initial'` (the first load, on\n mount), `'dependencies'` (a `dependencies` entry or the `items`\n function changed; a retry arrives this way) or `'pagination'` (the\n shared page or page size moved). The table has no search field, so it\n never passes `query`;\n- `modelValue` — the selection as-is (an array when `multiple`, the\n single value or `null` otherwise, `undefined` before any);\n- `signal` — an `AbortSignal`, aborted when a newer call starts or the\n table is disposed; pass it to every request.\n\nA provider signals a failure by THROWING, never by returning `[]`: the\nrows are cleared, nothing is pruned, and `#empty` receives the `error`\n(`failed-text` is shown). Zero-argument providers keep working. Return\nthe page as it is: a table provider never merges the selection in.\nAnnotate the parameter `BbTableItemsContext`."},{"name":"itemValue","type":"ItemAccessor<Item> | undefined","required":false,"description":"Defines a path that returns a property of the row to use as its value (the\nselection, `expandedItems` and row keys compare by it) or a function that\nreturns any value."},{"name":"keyboardNavigation","type":"boolean | undefined","required":false,"default":"false","description":"Opt-in keyboard navigation: the table becomes an ARIA `grid` (the WAI-ARIA\nAPG data grid) — or a `treegrid` when an `#expand` slot is present — with\nONE tab stop and a roving focus over its cells, the default header row\nincluded. Arrows move one cell, Home/End go to the row's first/last cell,\nCtrl+Home/End to the first/last row, PageUp/PageDown ten rows. Enter on a\ncell holding controls moves into them (F2 too; Escape or F2 comes back);\notherwise Enter/Space activate the row through the same path as a mouse\nclick (highlight toggle + `click:row`). Shift+Space toggles the row's\nselection, Ctrl/Cmd+A selects all. A treegrid's rows take focus as well:\nRight expands a collapsed row (else enters its cells), Left collapses it.\nControls inside cells leave the tab order while it is on. Cells are\n`gridcell`, selectable rows carry `aria-selected`. Ignored (the table stays\n`role=\"table\"`) with a `#tbody` slot, whose rows are yours. Focus and\nhighlight stay independent — moving does not highlight until committed."},{"name":"legend","type":"string | undefined","required":false,"description":"Text content of the `<legend>` a `selectable` table renders (it becomes\na `<fieldset>`, and the legend is that fieldset's accessible name).\nOmit it and the table falls back to `caption`, then to a localized\ndefault — the fieldset always ends up with SOME accessible name — but\na specific `legend` describes the selection better than either fallback."},{"name":"loading","type":"boolean | undefined","required":false,"default":"false","description":"Sets the component in a loading state, usually triggering some visual styles.\n\nWith no rows yet this renders skeletons; over existing rows the rows stay\non screen (dimmed, with an indeterminate bar) rather than being replaced —\na refetch should not blank a table the user is reading."},{"name":"loadingText","type":"string | undefined","required":false,"default":"the localized `common.loadingText` (\"Loading...\")","description":"Screen-reader announcement for the loading row's `aria-live` status.\nVisually hidden — the skeleton (or the `#loading` slot) is the visible\nsignal."},{"name":"max","type":"number | undefined","required":false,"default":"Infinity","description":"Maximum number of items that can be selected."},{"name":"modelValue","type":"any","required":false,"default":"[]","description":"Used by v-model. Can be any serializable type."},{"name":"multiple","type":"boolean | undefined","required":false,"default":"true","description":"Allows the selection of multiple items."},{"name":"name","type":"string | undefined","required":false,"description":"Defines the name of the input."},{"name":"order","type":"string[] | undefined","required":false,"default":"[]","description":"Used by `v-model:order`. Ordered array of column keys — the render\norder of the data columns. Keys listed here render first, in this order;\ndeclared columns it omits follow, in declaration order (so a column added\nto `columns` later renders last); a `hidden` column keeps its slot\nwithout rendering, and keys that match no declared column render\nnothing but are PRESERVED in place on every write. The header drag /\nkeyboard reorder of `reorderable` writes it back complete (every\ndeclared key present, hidden ones included, duplicates dropped — first\noccurrence wins) with exactly the moved column relocated: every other\nkey keeps its relative order, and a drop that changes nothing emits\nnothing. Works uncontrolled when unbound, exactly like `sort`. The\n`select` and `actions` columns are structural and never part of it."},{"name":"page","type":"string | number | undefined","required":false,"description":"Doesn't slice `items` — pass the current page's rows:\n`const rows = computed(() => all.value.slice((page.value - 1) *\nperPage.value, page.value * perPage.value))`.\nCurrent page number starting from 1, used for accessibility purposes.\nAlso flows into the shared table context, so a `BbPagination` paired\nthrough `id` reads it as the current page. Numeric strings are coerced\n(server pagination fields often arrive as strings), exactly like\n`BbPagination`'s equivalent props."},{"name":"perPage","type":"string | number | undefined","required":false,"description":"Doesn't slice `items` — pass the current page's rows (the `page` prop\nshows the `computed`).\nNumber of items per page, used for accessibility purposes. Also flows\ninto the shared table context read by a `BbPagination` paired through\n`id`. When omitted, an array `items` table infers it from\n`items.length`; an explicit value (or a context write) always wins over\nthat inference. Numeric strings are coerced, exactly like\n`BbPagination`'s `per-page`."},{"name":"pt","type":"PtItemMap<BbTablePtPart, \"row\", BbTablePtState, Item> | undefined","required":false,"description":"Passthrough, object form: the same keys as the `pt:*` attributes\nwithout the prefix. See the `pt:<part>` row."},{"name":"pt:body","type":"PtValue | undefined","required":false},{"name":"pt:body:disabled","type":"PtValue | undefined","required":false},{"name":"pt:body:empty","type":"PtValue | undefined","required":false},{"name":"pt:body:expanded","type":"PtValue | undefined","required":false},{"name":"pt:body:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:body:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:body:loading","type":"PtValue | undefined","required":false},{"name":"pt:body:selected","type":"PtValue | undefined","required":false},{"name":"pt:body:sorted","type":"PtValue | undefined","required":false},{"name":"pt:body:sortedDesc","type":"PtValue | undefined","required":false},{"name":"pt:caption","type":"PtValue | undefined","required":false},{"name":"pt:caption:disabled","type":"PtValue | undefined","required":false},{"name":"pt:caption:empty","type":"PtValue | undefined","required":false},{"name":"pt:caption:expanded","type":"PtValue | undefined","required":false},{"name":"pt:caption:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:caption:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:caption:loading","type":"PtValue | undefined","required":false},{"name":"pt:caption:selected","type":"PtValue | undefined","required":false},{"name":"pt:caption:sorted","type":"PtValue | undefined","required":false},{"name":"pt:caption:sortedDesc","type":"PtValue | undefined","required":false},{"name":"pt:cell","type":"PtValue | undefined","required":false},{"name":"pt:cell:disabled","type":"PtValue | undefined","required":false},{"name":"pt:cell:empty","type":"PtValue | undefined","required":false},{"name":"pt:cell:expanded","type":"PtValue | undefined","required":false},{"name":"pt:cell:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:cell:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:cell:loading","type":"PtValue | undefined","required":false},{"name":"pt:cell:selected","type":"PtValue | undefined","required":false},{"name":"pt:cell:sorted","type":"PtValue | undefined","required":false},{"name":"pt:cell:sortedDesc","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:empty","type":"PtValue | undefined","required":false},{"name":"pt:cellColumnHeader:expanded","type":"PtValue | undefined","required":false},{"name":"pt:cellColumnHeader:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:cellColumnHeader:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:cellColumnHeader:loading","type":"PtValue | undefined","required":false},{"name":"pt:cellColumnHeader:selected","type":"PtValue | undefined","required":false},{"name":"pt:cellColumnHeader:sorted","type":"PtValue | undefined","required":false},{"name":"pt:cellColumnHeader:sortedDesc","type":"PtValue | undefined","required":false},{"name":"pt:dragIcon","type":"PtValue | undefined","required":false},{"name":"pt:dragIcon:disabled","type":"PtValue | undefined","required":false},{"name":"pt:dragIcon:empty","type":"PtValue | undefined","required":false},{"name":"pt:dragIcon:expanded","type":"PtValue | undefined","required":false},{"name":"pt:dragIcon:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:dragIcon:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:dragIcon:loading","type":"PtValue | undefined","required":false},{"name":"pt:dragIcon:selected","type":"PtValue | undefined","required":false},{"name":"pt:dragIcon:sorted","type":"PtValue | undefined","required":false},{"name":"pt:dragIcon:sortedDesc","type":"PtValue | undefined","required":false},{"name":"pt:firstRow","type":"PtValue | undefined","required":false},{"name":"pt:firstRow:disabled","type":"PtValue | undefined","required":false},{"name":"pt:firstRow:empty","type":"PtValue | undefined","required":false},{"name":"pt:firstRow:expanded","type":"PtValue | undefined","required":false},{"name":"pt:firstRow:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:firstRow:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:firstRow:loading","type":"PtValue | undefined","required":false},{"name":"pt:firstRow:selected","type":"PtValue | undefined","required":false},{"name":"pt:firstRow:sorted","type":"PtValue | undefined","required":false},{"name":"pt:firstRow:sortedDesc","type":"PtValue | undefined","required":false},{"name":"pt:foot","type":"PtValue | undefined","required":false},{"name":"pt:foot:disabled","type":"PtValue | undefined","required":false},{"name":"pt:foot:empty","type":"PtValue | undefined","required":false},{"name":"pt:foot:expanded","type":"PtValue | undefined","required":false},{"name":"pt:foot:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:foot:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:foot:loading","type":"PtValue | undefined","required":false},{"name":"pt:foot:selected","type":"PtValue | undefined","required":false},{"name":"pt:foot:sorted","type":"PtValue | undefined","required":false},{"name":"pt:foot:sortedDesc","type":"PtValue | undefined","required":false},{"name":"pt:head","type":"PtValue | undefined","required":false},{"name":"pt:head:disabled","type":"PtValue | undefined","required":false},{"name":"pt:head:empty","type":"PtValue | undefined","required":false},{"name":"pt:head:expanded","type":"PtValue | undefined","required":false},{"name":"pt:head:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:head:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:head:loading","type":"PtValue | undefined","required":false},{"name":"pt:head:selected","type":"PtValue | undefined","required":false},{"name":"pt:head:sorted","type":"PtValue | undefined","required":false},{"name":"pt:head:sortedDesc","type":"PtValue | undefined","required":false},{"name":"pt:headerRow","type":"PtValue | undefined","required":false},{"name":"pt:headerRow:disabled","type":"PtValue | undefined","required":false},{"name":"pt:headerRow:empty","type":"PtValue | undefined","required":false},{"name":"pt:headerRow:expanded","type":"PtValue | undefined","required":false},{"name":"pt:headerRow:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:headerRow:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:headerRow:loading","type":"PtValue | undefined","required":false},{"name":"pt:headerRow:selected","type":"PtValue | undefined","required":false},{"name":"pt:headerRow:sorted","type":"PtValue | undefined","required":false},{"name":"pt:headerRow:sortedDesc","type":"PtValue | undefined","required":false},{"name":"pt:lastRow","type":"PtValue | undefined","required":false},{"name":"pt:lastRow:disabled","type":"PtValue | undefined","required":false},{"name":"pt:lastRow:empty","type":"PtValue | undefined","required":false},{"name":"pt:lastRow:expanded","type":"PtValue | undefined","required":false},{"name":"pt:lastRow:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:lastRow:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:lastRow:loading","type":"PtValue | undefined","required":false},{"name":"pt:lastRow:selected","type":"PtValue | undefined","required":false},{"name":"pt:lastRow:sorted","type":"PtValue | undefined","required":false},{"name":"pt:lastRow:sortedDesc","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:empty","type":"PtValue | undefined","required":false},{"name":"pt:root:expanded","type":"PtValue | undefined","required":false},{"name":"pt:root:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:root:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:root:loading","type":"PtValue | undefined","required":false},{"name":"pt:root:selected","type":"PtValue | undefined","required":false},{"name":"pt:root:sorted","type":"PtValue | undefined","required":false},{"name":"pt:root:sortedDesc","type":"PtValue | undefined","required":false},{"name":"pt:row","type":"PtValue | ((ctx: PtItemCtx<Item, BbTablePtState>) => PtItemResult) | undefined","required":false},{"name":"pt:row:disabled","type":"PtValue | undefined","required":false},{"name":"pt:row:empty","type":"PtValue | undefined","required":false},{"name":"pt:row:expanded","type":"PtValue | undefined","required":false},{"name":"pt:row:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:row:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:row:loading","type":"PtValue | undefined","required":false},{"name":"pt:row:selected","type":"PtValue | undefined","required":false},{"name":"pt:row:sorted","type":"PtValue | undefined","required":false},{"name":"pt:row:sortedDesc","type":"PtValue | undefined","required":false},{"name":"pt:selectIcon","type":"PtValue | undefined","required":false},{"name":"pt:selectIcon:disabled","type":"PtValue | undefined","required":false},{"name":"pt:selectIcon:empty","type":"PtValue | undefined","required":false},{"name":"pt:selectIcon:expanded","type":"PtValue | undefined","required":false},{"name":"pt:selectIcon:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:selectIcon:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:selectIcon:loading","type":"PtValue | undefined","required":false},{"name":"pt:selectIcon:selected","type":"PtValue | undefined","required":false},{"name":"pt:selectIcon:sorted","type":"PtValue | undefined","required":false},{"name":"pt:selectIcon:sortedDesc","type":"PtValue | undefined","required":false},{"name":"pt:sortIcon","type":"PtValue | undefined","required":false},{"name":"pt:sortIcon:disabled","type":"PtValue | undefined","required":false},{"name":"pt:sortIcon:empty","type":"PtValue | undefined","required":false},{"name":"pt:sortIcon:expanded","type":"PtValue | undefined","required":false},{"name":"pt:sortIcon:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:sortIcon:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:sortIcon:loading","type":"PtValue | undefined","required":false},{"name":"pt:sortIcon:selected","type":"PtValue | undefined","required":false},{"name":"pt:sortIcon:sorted","type":"PtValue | undefined","required":false},{"name":"pt:sortIcon:sortedDesc","type":"PtValue | undefined","required":false},{"name":"pt:table","type":"PtValue | undefined","required":false},{"name":"pt:table:disabled","type":"PtValue | undefined","required":false},{"name":"pt:table:empty","type":"PtValue | undefined","required":false},{"name":"pt:table:expanded","type":"PtValue | undefined","required":false},{"name":"pt:table:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:table:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:table:loading","type":"PtValue | undefined","required":false},{"name":"pt:table:selected","type":"PtValue | undefined","required":false},{"name":"pt:table:sorted","type":"PtValue | undefined","required":false},{"name":"pt:table:sortedDesc","type":"PtValue | undefined","required":false},{"name":"readonly","type":"boolean | undefined","required":false,"default":"false","description":"Sets the input in a readonly state."},{"name":"reorderable","type":"boolean | undefined","required":false,"default":"false","description":"Lets the user reorder the data columns: drag a header cell (AG Grid style —\nthe column moves live under the pointer and a chip with its label follows)\nor, from the keyboard, use each header's reorder handle (ArrowLeft /\nArrowRight move the column one slot, Home / End to the ends). Every move\nwrites `v-model:order`. Not needed by an external control (a column\npanel) that only writes `order`. The `select` / `actions` columns and\na custom `#thead` are never draggable."},{"name":"resizable","type":"boolean | undefined","required":false,"default":"false","description":"Lets the user resize the data columns of a root table: drag the handle on\na header's trailing edge (the column follows live, the width commits on\nrelease), or press Alt + ArrowLeft / ArrowRight on the focused header;\ndouble-click the handle to go back to the declared width. Each commit\nfires `resize:column(key, width)` once. `column.width` stays the single declared\ntruth: a resized width is an override the table keeps until that\ncolumn's `width` changes — write the reported width back into your\ncolumn definition to persist it. Ignored on a table that inherits its\nwidths from a parent."},{"name":"rowClass","type":"BbTableRowClasses<Item> | undefined","required":false,"description":"Defines the classes to be passed to each data row. Can also be a\nfunction of the row's item for dynamic values."},{"name":"selectable","type":"boolean | ((item: Item) => boolean) | undefined","required":false,"description":"Defines whether the table is selectable.\nCan be a global boolean that affects all rows or a function\nthat accepts an item and returns a boolean that only affects that item."},{"name":"selectAll","type":"boolean | undefined","required":false,"default":"false","description":"Defines whether the \"Select all\" checkbox is checked."},{"name":"selectAllLabel","type":"string | undefined","required":false,"description":"Text of the label used by the \"Select all\" boolean."},{"name":"selectText","type":"string | undefined","required":false,"description":"Text of the header used for the radio inputs when the table is not `multiple`."},{"name":"sort","type":"BbTableSortEntry[] | undefined","required":false,"default":"[]","description":"Doesn't sort `items` — apply the model to your own data (or your server\nquery).\nUsed by `v-model:sort`. Ordered array of `[columnKey, direction]`\nentries, one per actively sorted column. Bidirectional: the header\nbuttons of `sortable` columns update it, and external writes update the\nheader indicators. The table does not sort its items — apply the model\nto your own data source."},{"name":"tdClass","type":"ColumnClasses<Item> | undefined","required":false,"description":"Defines the classes to be passed to every data cell. Can also be a function for dynamic values."},{"name":"thClass","type":"Classes | undefined","required":false,"description":"Defines the classes to be passed to every header cell."},{"name":"totalItems","type":"string | number | undefined","required":false,"description":"Total number of items there is. Also flows into the shared table\ncontext, where a `BbPagination` paired through `id` derives its page\ncount from it. When omitted, an array `items` table infers it from\n`items.length`; an explicit value (or a context write) always wins over\nthat inference. Numeric strings are coerced, exactly like\n`BbPagination`'s `total-items`."},{"name":"totalPages","type":"string | number | undefined","required":false,"description":"Seeds the page count shown by a `BbPagination` paired through `id`. A\nshortcut for when the server reports a page count rather than a row\ncount: the table renders nothing from it, it only flows into the shared\ntable context. A known total always wins — when `totalItems` (or a\ncontext write) provides one, the page count is derived from it and this\nseed is ignored. Numeric strings are coerced, exactly like\n`BbPagination`'s `total-pages`."},{"name":"unselectedItems","type":"any[] | undefined","required":false,"default":"[]","description":"Items that are not selected."},{"name":"virtual","type":"boolean | undefined","required":false,"default":"false","description":"Windows the body: only the rows in (and just around) the vertical\nscrollport are mounted, so a client-side dataset of any size scrolls at\na constant cost. The table itself is the scroller as soon as you bound\nits height (`max-height` / `height`, or a flex item with\n`min-height: 0`); left unbounded, the nearest scrolling ancestor or the\npage scrolls it. The header sticks to that scroller. Column widths are\nmeasured once from the first rendered batch and then hold — later rows\nnever widen them. Expand rows and nested tables stay fully rendered\ninside their row (a nested table is never windowed); the row that owns\nfocus stays mounted even when scrolled out of view. Ignored by a table\nthat inherits its widths from a parent, and under a `#tbody` slot."}],"events":[{"name":"click:row","signature":"(event: MouseEvent, item: any): void","description":"A body row was clicked, or activated with Enter/Space under\n`keyboardNavigation`. Carries the DOM `MouseEvent` and the raw record."},{"name":"contextmenu:row","signature":"(event: MouseEvent, item: any): void","description":"A body row was right-clicked. Carries the DOM `MouseEvent` and the raw record."},{"name":"dblclick:row","signature":"(event: MouseEvent, item: any): void","description":"A body row was double-clicked. Carries the DOM `MouseEvent` and the raw record."},{"name":"hide:column","signature":"(key: string): void","description":"A column was hidden from its header (a `#<key>:header` /\n`#<key>:header:append` control calling the slot's `hideColumn()`). Fired once;\nthe table keeps the column hidden for the mount, or until the column's\n`hidden` flag changes — write `hidden: true` into the definition to\npersist it, `hidden: false` (a column panel) to show it again."},{"name":"item:selected","signature":"(value: any): void","description":"The user selected one row. Carries the row's value (read through\n`itemValue`, the same value the selection v-model holds)."},{"name":"item:unselected","signature":"(value: any): void","description":"The user unselected one row. Carries the row's value, like `item:selected`."},{"name":"resize:column","signature":"(key: string, width: number | null): void","description":"A column was resized by the user (`resizable`): the new width in\npx, or `null` when the handle was double-clicked to reset the column to\nits declared width."},{"name":"update:expandedItems","signature":"(value: any[]): void","description":"Emitted with the new value whenever `v-model:expandedItems` changes."},{"name":"update:highlighted","signature":"(value: any): void","description":"Emitted with the new value whenever `v-model:highlighted` changes."},{"name":"update:modelValue","signature":"(value: any): void","description":"Emitted with the new value whenever `v-model` changes."},{"name":"update:order","signature":"(value: string[]): void","description":"Emitted with the new value whenever `v-model:order` changes."},{"name":"update:selectAll","signature":"(value: boolean): void","description":"Emitted with the new value whenever `v-model:selectAll` changes."},{"name":"update:sort","signature":"(value: BbTableSortEntry[]): void","description":"Emitted with the new value whenever `v-model:sort` changes."},{"name":"update:unselectedItems","signature":"(value: any[]): void","description":"Emitted with the new value whenever `v-model:unselectedItems` changes."}],"slots":[{"name":"actions","type":"{ expanded?: boolean | undefined; expandProps?: ExpandControllerProps | undefined; toggleExpanded?: (() => void) | undefined; highlighted?: boolean | undefined; toggleHighlighted?: (() => void) | undefined; selected?: boolean | undefined; toggleSelected?: (() => void) | undefined; item: Item; value: any; }","description":"Content rendered in the actions cell for each row. Providing this slot\nis what CREATES the actions column (there is no prop): the header cell\n(labelled by `actions-text`, replaceable through `#actions:header`) and\none cell per row appear with it, and go away with it. Pin it with\n`fixed-actions`."},{"name":"actions:header","type":"{ text: string; }","description":"Replaces the default actions header cell content."},{"name":"empty","type":"{ error: unknown; }","description":"Content shown when the items list is empty and not loading. It fills the\ntable's own full-width empty-state cell (it already spans the\nselection/actions columns), so provide the *content* — a message, an\nillustration, a \"clear filters\" button — never a row/cell of your own.\n`error` is what the latest failed load rejected with, untouched (an\n`Error`, a `Response`, anything thrown; a nullish rejection becomes an\n`Error`), and `null` when nothing failed — a failed load clears the\nrows, so this slot is where it shows."},{"name":"expand","type":"{ expanded: boolean; expandProps?: ExpandControllerProps | undefined; toggleExpanded: () => void; highlighted?: boolean | undefined; toggleHighlighted?: (() => void) | undefined; selected?: boolean | undefined; toggleSelected?: (() => void) | undefined; item: Item; value: any; }","description":"Full-width expandable content row rendered below each main row when expanded."},{"name":"header:append","type":"BbTableHeaderAffixSlotProps<Item>","fields":["classes?: Classes","columnKey: string","items?: Item[]","label?: string","sortable?: boolean","sortOrder?: \"asc\" | \"desc\" | null","toggleSort?: (() => void)","hideColumn?: (() => void)"],"description":"Content rendered after every data column's header cell content — the\nlabel + sort control, or the column's own `<key>:header` replacement.\nA column's `<key>:header:append` slot wins over this one for that\ncolumn; they never stack. Branch on `columnKey` for per-column output."},{"name":"header:prepend","type":"BbTableHeaderAffixSlotProps<Item>","fields":["classes?: Classes","columnKey: string","items?: Item[]","label?: string","sortable?: boolean","sortOrder?: \"asc\" | \"desc\" | null","toggleSort?: (() => void)","hideColumn?: (() => void)"],"description":"Content rendered before every data column's header cell content — the\nlabel + sort control, or the column's own `<key>:header` replacement.\nA column's `<key>:header:prepend` slot wins over this one for that\ncolumn; they never stack. Branch on `columnKey` for per-column output."},{"name":"loading","type":"{ items: Item[]; }","description":"Content shown while table rows are loading (replaces the skeleton rows)."},{"name":"select","type":"{ item: Item; value: any; checked: boolean; disabled: boolean; inputName: string; readonly: boolean; toggleSelected?: (() => void) | undefined; }","description":"Replaces the default checkbox/radio in the selection cell for each row."},{"name":"select:header","type":"{ multiple: boolean; selectAll: boolean; text: string; }","description":"Replaces the default selection header cell content (checkbox or radio label)."},{"name":"tbody","type":"object","description":"Replaces the content of the body row group (`.bb-table__body`). Use when\nyou need full control over the body markup. Provide role-complete rows —\n`<div role=\"row\">` holding one `<div role=\"cell\">` per column — never a\n`<tr>`/`<td>`. A full-width cell spans with `grid-column: 1 / -1`."},{"name":"tfoot","type":"{ columnCount: number; }","description":"Fills the footer row group (`.bb-table__foot`). Use when you need a\nfooter. Provide role-complete rows — `<div role=\"row\">` holding\n`<div role=\"cell\">` elements — never a `<tr>`/`<td>`."},{"name":"thead","type":"object","description":"Replaces the content of the header row group (`.bb-table__head`). Use when\nyou need full control over the header markup. The table is a CSS grid,\nnot a `<table>`: provide role-complete rows — `<div role=\"row\">` holding\none `<div role=\"columnheader\">` per column — and never a `<tr>`/`<th>`.\nRows are subgrid rows, so each cell lands on the matching column track."},{"name":"<key>","type":"object","description":"One column's body cell in every row, by the column `key` through `slotKey`. Scope: `{ item, value, content, selected, expanded, highlighted, classes, sortOrder, toggleSelected, toggleExpanded, toggleHighlighted, expandProps }`.","dynamic":true},{"name":"<key>:header","type":"object","description":"One column's header content, replacing its label and the built-in sort button. Scope: `{ label, items, sortable, sortOrder, toggleSort, hideColumn, classes }`.","dynamic":true},{"name":"<key>:header:prepend","type":"BbTableHeaderAffixSlotProps<Item>","description":"Content before one column's header, keeping the sort button; beats `header:prepend` (they never stack).","dynamic":true},{"name":"<key>:header:append","type":"BbTableHeaderAffixSlotProps<Item>","description":"Content after one column's header, keeping the sort button; beats `header:append` (they never stack).","dynamic":true},{"name":"<key>:first","type":"BbTableEdgeCellSlotProps<Item>","description":"One column's cell in a row before the data rows; any such slot creates the row, aligned with the columns. Only over rows.","dynamic":true},{"name":"<key>:last","type":"BbTableEdgeCellSlotProps<Item>","description":"One column's cell in a row after the data rows (a totals row); any such slot creates that row, aligned like `<key>:first`.","dynamic":true}],"exposed":[],"models":[{"name":"expandedItems","type":"any[] | undefined"},{"name":"highlighted","type":"any"},{"name":"modelValue","type":"any"},{"name":"order","type":"string[] | undefined"},{"name":"selectAll","type":"boolean | undefined"},{"name":"sort","type":"BbTableSortEntry[] | undefined"},{"name":"unselectedItems","type":"any[] | undefined"}],"cssProps":[{"name":"--bg","value":"var(--bb-panel)","selector":".bb-table","description":"The table's surface colour. Cells are transparent at rest so the row can tint them, but anything that sticks over scrolled content — the stuck head band and pinned (`column.fixed`) cells — must be opaque, and paints this. Set it on the table (`.my-table { --bg: … }`) when the table sits on a surface that is not `--bb-panel`; a nested table re-declares its own."},{"name":"--px","value":"12px","selector":".bb-table"},{"name":"--cell-h","value":"36px","selector":".bb-table"},{"name":"--py","value":"6px","selector":".bb-table"},{"name":"--actions-spacing","value":"8px","selector":".bb-table"},{"name":"--offset-start","value":"0px","selector":".bb-table","description":"Raw structural edge offset measured by the component (the parent's select/actions track width). Default 0 keeps every calc at its base."},{"name":"--offset-end","value":"0px","selector":".bb-table"},{"name":"--offset-internal-start","value":"var(--offset-start)","selector":".bb-table","description":"Routing of that offset. By default it is \"internal\": added to the first/last cell padding and folded into the first/last column width. Swap internal↔external (set internal to 0 and external to the raw offset) to pad the whole table instead of the edge cells."},{"name":"--offset-internal-end","value":"var(--offset-end)","selector":".bb-table"},{"name":"--offset-external-start","value":"0px","selector":".bb-table"},{"name":"--offset-external-end","value":"0px","selector":".bb-table"},{"name":"--pin-l","value":"0px","selector":".bb-table","description":"Re-declared on every table: a nested table must not inherit its parent's fade or pinned edge."},{"name":"--pin-r","value":"0px","selector":".bb-table"},{"name":"--fade-l","value":"0px","selector":".bb-table"},{"name":"--fade-r","value":"0px","selector":".bb-table"},{"name":"--fade-a-l","value":"1","selector":".bb-table"},{"name":"--fade-a-r","value":"1","selector":".bb-table"}],"pt":{"parts":[{"name":"root","description":"The table's container."},{"name":"caption","description":"The visible caption (`caption` with `displayCaption`)."},{"name":"table","description":"The grid root: `role=\"table\"`, or `role=\"grid\"` with `keyboardNavigation` (`role=\"treegrid\"` with an `#expand` slot too)."},{"name":"head","description":"The header row group."},{"name":"headerRow","description":"The header row."},{"name":"cellColumnHeader","description":"Every column header cell (`role=\"columnheader\"`), the select and actions headers included — a broadcast resolved per header. Not a `<th>`: the grid is `div`s with ARIA roles."},{"name":"sortIcon","description":"A sortable column's sort arrow, resolved per header."},{"name":"body","description":"The body row group."},{"name":"row","description":"Every DATA row — a broadcast resolved per row. Expand rows and the skeleton are not parts. Also takes a per-item function, called with the row's raw item, once per rendered row: keep it cheap."},{"name":"cell","description":"Every data cell, the select and actions cells included — a broadcast resolved with its row's states (`role=\"cell\"`, `gridcell` under `keyboardNavigation`) — and the cells of the `firstRow` / `lastRow`, with no row state. Takes no function: use `tdClass` for a per-cell hook."},{"name":"firstRow","description":"The row of `#<key>:first` cells, before the data rows."},{"name":"lastRow","description":"The row of `#<key>:last` cells, after the data rows (a totals row: `pt:lastRow=\"font-semibold\"`)."},{"name":"selectIcon","description":"The selection glyph: each row's checkbox (radio with single selection) and the select-all checkbox — resolved per node. Not rendered when the `select` / `select:header` slots replace them."},{"name":"dragIcon","description":"The move glyph on the chip that follows a column drag (`reorderable`)."},{"name":"foot","description":"The footer row group (the `tfoot` slot's container)."}],"states":[{"name":"empty","description":"Component-wide: there are no rows (`bb-table--empty`)."},{"name":"sorted","description":"Per node, on `cellColumnHeader` and `sortIcon`: the column is sorted, either direction (`bb-table__cell-column-header--sorted`)."},{"name":"sortedDesc","description":"Per node, on `cellColumnHeader` and `sortIcon`: sorted descending (`bb-table__cell-column-header--sorted-desc`). Ascending is `sorted` alone."},{"name":"selected","description":"Per node, on `row`, its cells and its `selectIcon`: a checked row; on the select-all glyph, every row is selected."},{"name":"indeterminate","description":"Per node, on the select-all `selectIcon`: some rows are selected, not all."},{"name":"disabled","description":"Per node, on `row`, its cells and its `selectIcon`: the row cannot be SELECTED — `selectable` rejects it, or the table is `disabled` (`bb-table__row--disabled`). It still clicks, highlights and expands. Never on a table without selection. The select-all glyph takes it from the table's `disabled`."},{"name":"expanded","description":"Per node, on `row` and its cells: the row's expand row is open (`bb-table__row--expanded`)."},{"name":"highlighted","description":"Per node, on `row` and its cells: the highlighted row."},{"name":"loading","description":"Component-wide: the table is `loading`."}]},"tree":{"bindings":[{"part":"caption","target":"div.bb-table__caption"},{"part":"dragIcon","target":"svg.bb-table__drag-icon"},{"part":"table","target":"div"},{"part":"head","target":"div.bb-table__head"},{"part":"headerRow","target":"div.bb-table__header-row"},{"part":"cellColumnHeader","target":"div.bb-table__cell-column-header"},{"part":"selectIcon","target":"BbBaseCheckboxIcon"},{"part":"sortIcon","target":"svg.bb-table__sort-icon"},{"part":"body","target":"div.bb-table__body"},{"part":"foot","target":"div.bb-table__foot"}],"nodes":[{"name":"BbBaseCheckboxIcon","kind":"public","cssProps":[{"name":"--accent","documented":false,"readBy":["bb-base-checkbox-icon","bb-base-checkbox-icon--errors","bb-base-checkbox-icon--warnings","bb-base-checkbox-icon--checked","bb-base-checkbox-icon--indeterminate"]},{"name":"--check-color","documented":false,"readBy":["bb-base-checkbox-icon__check","bb-base-checkbox-icon__indeterminate"]},{"name":"--size","documented":false,"readBy":["bb-base-checkbox-icon"]},{"name":"--r","documented":true,"readBy":["bb-base-checkbox-icon"]},{"name":"--ring-color","documented":true,"readBy":["bb-base-checkbox-icon","bb-base-checkbox-icon--focus-visible"]},{"name":"--elev","documented":true,"readBy":["bb-base-checkbox-icon","bb-base-checkbox-icon--focus-visible"]},{"name":"--bg","documented":true,"readBy":["bb-base-checkbox-icon"]},{"name":"--border-color","documented":false,"readBy":["bb-base-checkbox-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"}]}]},"css":{"classes":{"bb-sr-only":[""],"bb-table":["","--align-*","--compact","--empty","--fixed","--fixed-header","--inherit-widths","--loading","--overflow-left","--overflow-right","--reorderable","--resizable","--selectable","--virtual","--virtual-flat","__body","__caption","__cell","__cell--*","__cell--actions","__cell--clip","__cell--edge-end","__cell--edge-start","__cell--fluid","__cell--nowrap","__cell--resized","__cell--select","__cell-column-header","__cell-column-header--*","__cell-column-header--actions","__cell-column-header--clip","__cell-column-header--dragging","__cell-column-header--edge-end","__cell-column-header--edge-start","__cell-column-header--floored","__cell-column-header--locked","__cell-column-header--resizing","__cell-column-header--select","__cell-column-header--sortable","__cell-column-header--sorted","__cell-column-header--sorted-desc","__drag-icon","__edge-row","__edge-row--*","__edge-row--first","__edge-row--fixed","__edge-row--last","__foot","__head","__head--dragging","__head--resizing","__header-row","__reorder-status","__row","__row--disabled","__row--expanded","__row--highlighted","__select-icon","__sort-icon","__table"],"bb-table-check":["","__label","__label--disabled","__label-text"],"bb-table-column-drag":[""],"bb-table-column-ghost":[""],"bb-table-empty":["__cell","__row","__text"],"bb-table-expand":["__cell","__row","__row--highlighted"],"bb-table-header":["__content","__resizer"],"bb-table-loading":["__text"],"bb-table-placeholder":["__row","__row--pending"],"bb-table-radio":["","__label","__label--disabled","__label-text"],"bb-table-resizing":[""],"bb-table-skeleton":["__avatar","__avatar-text","__badge","__cell","__cell--*","__cell--actions","__cell--select","__cell-content","__image","__line","__placeholder","__row"],"bb-table-sort":["","--asc","--desc"],"bb-table-spacer":["__row"]},"locals":["--actions-spacing","--arrow-preview","--bg","--cell-h","--color-gray-200","--drop","--fade-a-l","--fade-a-r","--fade-l","--fade-r","--floor","--line","--offset-end","--offset-external-end","--offset-external-start","--offset-internal-end","--offset-internal-start","--offset-start","--pin-l","--pin-r","--placeholder-bars","--px","--py","--row-bg","--row-h","--stuck-head-h","--stuck-outer","--stuck-top","--virtual-row-tracks"]},"removed":[{"name":"allowSelectAll","new":"disableSelectAll","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-table.md","silent":true,"fix":{"kind":"invert"}},{"name":"enabledWhileLoading","new":"interactiveWhileLoading","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-table.md","silent":true,"fix":{"kind":"rename"}},{"name":"actions","new":null,"since":"3.0.0-beta.21","migration":"ai/guides/migration/components/bb-table.md","silent":true,"fix":{"kind":"remove"}},{"name":"fixedColumns","new":null,"since":"3.0.0-beta.21","migration":"ai/guides/migration/components/bb-table.md","silent":true,"fix":{"kind":"manual"}},{"name":"noDataText","new":"emptyText","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"no-data","new":"empty","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"header:select","new":"select:header","surface":"slot","migration":"ai/guides/migration/components/bb-table.md","silent":true,"fix":{"kind":"rename"}},{"name":"header:actions","new":"actions:header","surface":"slot","migration":"ai/guides/migration/components/bb-table.md","silent":true,"fix":{"kind":"rename"}},{"name":"header:<x>:prepend","new":"<x>:header:prepend","surface":"slot","migration":"ai/guides/migration/components/bb-table.md","silent":true,"fix":{"kind":"rename"}},{"name":"header:<x>:append","new":"<x>:header:append","surface":"slot","migration":"ai/guides/migration/components/bb-table.md","silent":true,"fix":{"kind":"rename"}},{"name":"header:<x>","new":"<x>:header","surface":"slot","migration":"ai/guides/migration/components/bb-table.md","silent":true,"fix":{"kind":"rename"}}],"renamed":[{"from":"allowSelectAll","to":"disableSelectAll","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-table.md","fix":{"kind":"invert"}},{"from":"enabledWhileLoading","to":"interactiveWhileLoading","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-table.md","fix":{"kind":"rename"}},{"from":"noDataText","to":"emptyText","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"no-data","to":"empty","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"header:select","to":"select:header","surface":"slot","migration":"ai/guides/migration/components/bb-table.md","fix":{"kind":"rename"}},{"from":"header:actions","to":"actions:header","surface":"slot","migration":"ai/guides/migration/components/bb-table.md","fix":{"kind":"rename"}},{"from":"header:<x>:prepend","to":"<x>:header:prepend","surface":"slot","migration":"ai/guides/migration/components/bb-table.md","fix":{"kind":"rename"}},{"from":"header:<x>:append","to":"<x>:header:append","surface":"slot","migration":"ai/guides/migration/components/bb-table.md","fix":{"kind":"rename"}},{"from":"header:<x>","to":"<x>:header","surface":"slot","migration":"ai/guides/migration/components/bb-table.md","fix":{"kind":"rename"}}]},
|
|
496
|
+
{"name":"BbTable","group":"Data Display","description":"Displays tabular data, configurable columns and data mapper.","referenceOnly":false,"hasGuide":true,"contract":"ai/BbTable.md","source":"ai/source/BbTable.md","props":[{"name":"accessibleLabel","type":"((columns: MappedCell[], item: any) => string) | undefined","required":false,"description":"Function that accepts the columns and the current item as\narguments and returns a label to be used for accessibility purposes.\nThe cells arrive in RENDER order (they follow `order`, so the\nlabel reads like the row) — look a cell up by `key`, never by position."},{"name":"actionsText","type":"string | undefined","required":false,"description":"Label used in the header of the actions column."},{"name":"align","type":"\"left\" | \"center\" | \"right\" | undefined","required":false,"default":"\"left\"","description":"Text alignment of the columns."},{"name":"caption","type":"string | undefined","required":false,"description":"Caption that describes the content of the table. Used for accessibility purposes."},{"name":"columns","type":"BbTableColumn<T>[] | undefined","required":false,"default":"[]","description":"Array of definitions of how the columns should be rendered."},{"name":"compact","type":"boolean | undefined","required":false,"default":"false","description":"Adds a CSS class that applies a compact style to the component."},{"name":"dependencies","type":"unknown[] | undefined","required":false,"default":"[]","description":"Defines an array of dependencies that will trigger actions in the component upon change."},{"name":"depsDebounceTime","type":"number | undefined","required":false,"default":"0","description":"Timeout used to debounce response to changes to dependencies."},{"name":"disabled","type":"boolean | undefined","required":false,"default":"false","description":"Disables the component"},{"name":"disableSelectAll","type":"boolean | undefined","required":false,"default":"false","description":"Hides the \"Select all\" checkbox that selectable multi-row tables\ndisplay by default."},{"name":"displayCaption","type":"boolean | undefined","required":false,"default":"false","description":"Shows the caption as a visible title. Off by default: the caption is\nvisually hidden but still read by screen readers."},{"name":"emptyText","type":"string | undefined","required":false,"default":"the localized `common.emptyText` (\"No data to display\")","description":"String displayed when there are no items to display."},{"name":"enforceCoherence","type":"boolean | undefined","required":false,"default":"false","description":"After every load (initial, `dependencies` refetch or a change of the\n`items` array) prunes the row-keyed models of values whose row is no\nlonger in the result set: `modelValue`, `unselected-items`,\n`highlighted` and `expanded-items`. Values whose rows are still present\nsurvive. Single-value models (`modelValue` without `multiple`, and\n`highlighted`, which is always single) reset to `null`.\n\nDo **not** enable it on a provider-paginated table (`items` is a\nfunction): a page change always refetches, so state held on rows of\nother pages (the `select-all` + `unselected-items` pattern, cross-page\nselections) would be pruned. Reconcile in the items provider instead."},{"name":"expandedItems","type":"any[] | undefined","required":false,"default":"[]","description":"Used by `v-model:expandedItems`. Array of the currently expanded items —\ntoggled by the row expand control and by external writes (mirrors the\n`highlighted`/`sort` v-model surfaces). Drives the `#expand` slot rows and\ntheir `aria-expanded`/`aria-controls` wiring."},{"name":"failedText","type":"string | undefined","required":false,"default":"the localized `common.failedText` (\"Couldn't load items\")","description":"String displayed in the empty state while the latest load FAILED (the\n`items` provider threw): the twin of `emptyText` for that case."},{"name":"fixed","type":"boolean | undefined","required":false,"default":"false","description":"Splits the width equally among the columns that declare no `width`\n(each undeclared column becomes a `minmax(0, 1fr)` track)\nmaking each column take up the same amount of space."},{"name":"fixedActions","type":"boolean | undefined","required":false,"default":"false","description":"Pins the actions column (the one the `#actions` slot creates) to the\nright edge, `position: sticky`, in place. Data columns pin through\n`column.fixed`; this is the same feature for the structural column that\nhas no definition to carry it. No effect without an `#actions` slot."},{"name":"fixedFirst","type":"boolean | undefined","required":false,"default":"false","description":"Sticks the `#<key>:first` row to the top of the scrollport (under a\nstuck header)."},{"name":"fixedHeaders","type":"boolean | undefined","required":false,"default":"false","description":"Boolean that sets the headers as sticky to the top of the table."},{"name":"fixedLast","type":"boolean | undefined","required":false,"default":"false","description":"Sticks the `#<key>:last` row (a totals row) to the bottom of the\nscrollport."},{"name":"fixedSelect","type":"boolean | undefined","required":false,"default":"false","description":"Pins the selection column to the left edge, `position: sticky`, in\nplace. Data columns pin through `column.fixed`; this is the same feature\nfor the structural column that has no definition to carry it. No effect\nunless the table is `selectable`."},{"name":"headerRowClass","type":"Classes | undefined","required":false,"description":"Defines the classes to be passed to the header row."},{"name":"highlighted","type":"any","required":false,"default":"undefined","description":"Used by `v-model:highlighted`. A parallel, UI-intent state to selection —\ntypically \"the row whose details are open\". A single item value (or\n`null`) — highlight is single by design.\n\n**Opt-in, and `undefined` is the opt-out.** Leave it unbound and the whole\nmechanic is off: clicking a row emits `click:row` and nothing else — no\nclass, no `aria-current`, no internal state. Bind it and clicking a row\ntoggles it. The value itself is the switch: `undefined` means \"never\ninitialised\", `null` means \"initialised and currently empty\", so bind\n`ref(null)` rather than `ref()` — a bound-but-`undefined` model warns in\ndev and stays off. A value seeded through\n`useBbTableContext(id, { highlighted })` counts as bound the same way.\n\nA highlighted row gets `aria-current=\"true\"` and the\n`bb-table__row--highlighted` class, which the shipped stylesheet\npaints with a neutral fill plus a brand accent bar; override the whole\nlook with `rowClass`.\nHighlight: a parallel, UI-intent state to selection (\"the row whose details\nare open\"). Always a single value or `null`. Purely\nmechanical — highlighted rows only get a class and `aria-current`, no\nshipped styling."},{"name":"id","type":"string | undefined","required":false,"description":"Stable id for this table's width context. When omitted a unique id is\ngenerated. Nested tables use the nearest ancestor id to inherit widths."},{"name":"inheritColumnWidths","type":"string | boolean | undefined","required":false,"description":"Opt a nested table into inheriting its column widths from an ancestor\ntable's matching tracks (accounting for `select`/`actions` columns). This\nalso makes the parent's tracks authoritative, so it is **off by default** — a nested\ntable renders independently unless you ask for alignment.\n- `false` (the default): do not inherit; size independently.\n- `true`: inherit from the nearest ancestor table.\n- a table id (string): inherit from the specific ancestor in the chain with\n that id rather than the immediate parent. Use this when an intermediate\n table has a different column count, so the extra columns would otherwise\n misalign against it."},{"name":"interactiveWhileLoading","type":"boolean | undefined","required":false,"default":"false","description":"Keeps the table interactive while it is loading. The header and the rows are\n`inert` while loading by default — a refetch is about to replace the rows,\nso editing, selecting or sorting them races the incoming data. This escape\nhatch exists for tables that must stay usable during background refreshes\n(e.g. a poll that must not interrupt an open editor).\n\nThe loading announcement is never inert, so the busy state is always\nconveyed."},{"name":"items","type":"Item[] | ((context: BbTableItemsContext) => Item[] | Promise<Item[]>)","required":true,"default":"[]","description":"Rows to render: an array, or a provider function called with ONE\ncontext object and returning the rows, sync or async. The context\ncarries:\n- `reason` — why this call happened: `'initial'` (the first load, on\n mount), `'dependencies'` (a `dependencies` entry or the `items`\n function changed; a retry arrives this way) or `'pagination'` (the\n shared page or page size moved). The table has no search field, so it\n never passes `query`;\n- `modelValue` — the selection as-is (an array when `multiple`, the\n single value or `null` otherwise, `undefined` before any);\n- `signal` — an `AbortSignal`, aborted when a newer call starts or the\n table is disposed; pass it to every request.\n\nA provider signals a failure by THROWING, never by returning `[]`: the\nrows are cleared, nothing is pruned, and `#empty` receives the `error`\n(`failed-text` is shown). Zero-argument providers keep working. Return\nthe page as it is: a table provider never merges the selection in.\nAnnotate the parameter `BbTableItemsContext`."},{"name":"itemValue","type":"ItemAccessor<Item> | undefined","required":false,"description":"Defines a path that returns a property of the row to use as its value (the\nselection, `expandedItems` and row keys compare by it) or a function that\nreturns any value."},{"name":"keyboardNavigation","type":"boolean | undefined","required":false,"default":"false","description":"Opt-in keyboard navigation: the table becomes an ARIA `grid` (the WAI-ARIA\nAPG data grid) — or a `treegrid` when an `#expand` slot is present — with\nONE tab stop and a roving focus over its cells, the default header row\nincluded. Arrows move one cell, Home/End go to the row's first/last cell,\nCtrl+Home/End to the first/last row, PageUp/PageDown ten rows. Enter on a\ncell holding controls moves into them (F2 too; Escape or F2 comes back);\notherwise Enter/Space activate the row through the same path as a mouse\nclick (highlight toggle + `click:row`). Shift+Space toggles the row's\nselection, Ctrl/Cmd+A selects all. A treegrid's rows take focus as well:\nRight expands a collapsed row (else enters its cells), Left collapses it.\nControls inside cells leave the tab order while it is on. Cells are\n`gridcell`, selectable rows carry `aria-selected`. Ignored (the table stays\n`role=\"table\"`) with a `#tbody` slot, whose rows are yours. Focus and\nhighlight stay independent — moving does not highlight until committed."},{"name":"legend","type":"string | undefined","required":false,"description":"Text content of the `<legend>` a `selectable` table renders (it becomes\na `<fieldset>`, and the legend is that fieldset's accessible name).\nOmit it and the table falls back to `caption`, then to a localized\ndefault — the fieldset always ends up with SOME accessible name — but\na specific `legend` describes the selection better than either fallback."},{"name":"loading","type":"boolean | undefined","required":false,"default":"false","description":"Sets the component in a loading state, usually triggering some visual styles.\n\nWith no rows yet this renders skeletons; over existing rows the rows stay\non screen (dimmed, with an indeterminate bar) rather than being replaced —\na refetch should not blank a table the user is reading."},{"name":"loadingText","type":"string | undefined","required":false,"default":"the localized `common.loadingText` (\"Loading...\")","description":"Screen-reader announcement for the loading row's `aria-live` status.\nVisually hidden — the skeleton (or the `#loading` slot) is the visible\nsignal."},{"name":"max","type":"number | undefined","required":false,"default":"Infinity","description":"Maximum number of items that can be selected."},{"name":"modelValue","type":"any","required":false,"default":"[]","description":"Used by v-model. Can be any serializable type."},{"name":"multiple","type":"boolean | undefined","required":false,"default":"true","description":"Allows the selection of multiple items."},{"name":"name","type":"string | undefined","required":false,"description":"Defines the name of the input."},{"name":"order","type":"string[] | undefined","required":false,"default":"[]","description":"Used by `v-model:order`. Ordered array of column keys — the render\norder of the data columns. Keys listed here render first, in this order;\ndeclared columns it omits follow, in declaration order (so a column added\nto `columns` later renders last); a `hidden` column keeps its slot\nwithout rendering, and keys that match no declared column render\nnothing but are PRESERVED in place on every write. The header drag /\nkeyboard reorder of `reorderable` writes it back complete (every\ndeclared key present, hidden ones included, duplicates dropped — first\noccurrence wins) with exactly the moved column relocated: every other\nkey keeps its relative order, and a drop that changes nothing emits\nnothing. Works uncontrolled when unbound, exactly like `sort`. The\n`select` and `actions` columns are structural and never part of it."},{"name":"page","type":"string | number | undefined","required":false,"description":"Doesn't slice `items` — pass the current page's rows:\n`const rows = computed(() => all.value.slice((page.value - 1) *\nperPage.value, page.value * perPage.value))`.\nCurrent page number starting from 1, used for accessibility purposes.\nAlso flows into the shared table context, so a `BbPagination` paired\nthrough `id` reads it as the current page. Numeric strings are coerced\n(server pagination fields often arrive as strings), exactly like\n`BbPagination`'s equivalent props."},{"name":"perPage","type":"string | number | undefined","required":false,"description":"Doesn't slice `items` — pass the current page's rows (the `page` prop\nshows the `computed`).\nNumber of items per page, used for accessibility purposes. Also flows\ninto the shared table context read by a `BbPagination` paired through\n`id`. When omitted, an array `items` table infers it from\n`items.length`; an explicit value (or a context write) always wins over\nthat inference. Numeric strings are coerced, exactly like\n`BbPagination`'s `per-page`."},{"name":"pt","type":"PtItemMap<BbTablePtPart, \"row\", BbTablePtState, Item> | undefined","required":false,"description":"Passthrough, object form: the same keys as the `pt:*` attributes\nwithout the prefix. See the `pt:<part>` row."},{"name":"pt:body","type":"PtValue | undefined","required":false},{"name":"pt:body:disabled","type":"PtValue | undefined","required":false},{"name":"pt:body:empty","type":"PtValue | undefined","required":false},{"name":"pt:body:expanded","type":"PtValue | undefined","required":false},{"name":"pt:body:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:body:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:body:loading","type":"PtValue | undefined","required":false},{"name":"pt:body:selected","type":"PtValue | undefined","required":false},{"name":"pt:body:sorted","type":"PtValue | undefined","required":false},{"name":"pt:body:sortedDesc","type":"PtValue | undefined","required":false},{"name":"pt:caption","type":"PtValue | undefined","required":false},{"name":"pt:caption:disabled","type":"PtValue | undefined","required":false},{"name":"pt:caption:empty","type":"PtValue | undefined","required":false},{"name":"pt:caption:expanded","type":"PtValue | undefined","required":false},{"name":"pt:caption:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:caption:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:caption:loading","type":"PtValue | undefined","required":false},{"name":"pt:caption:selected","type":"PtValue | undefined","required":false},{"name":"pt:caption:sorted","type":"PtValue | undefined","required":false},{"name":"pt:caption:sortedDesc","type":"PtValue | undefined","required":false},{"name":"pt:cell","type":"PtValue | undefined","required":false},{"name":"pt:cell:disabled","type":"PtValue | undefined","required":false},{"name":"pt:cell:empty","type":"PtValue | undefined","required":false},{"name":"pt:cell:expanded","type":"PtValue | undefined","required":false},{"name":"pt:cell:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:cell:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:cell:loading","type":"PtValue | undefined","required":false},{"name":"pt:cell:selected","type":"PtValue | undefined","required":false},{"name":"pt:cell:sorted","type":"PtValue | undefined","required":false},{"name":"pt:cell:sortedDesc","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:empty","type":"PtValue | undefined","required":false},{"name":"pt:cellColumnHeader:expanded","type":"PtValue | undefined","required":false},{"name":"pt:cellColumnHeader:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:cellColumnHeader:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:cellColumnHeader:loading","type":"PtValue | undefined","required":false},{"name":"pt:cellColumnHeader:selected","type":"PtValue | undefined","required":false},{"name":"pt:cellColumnHeader:sorted","type":"PtValue | undefined","required":false},{"name":"pt:cellColumnHeader:sortedDesc","type":"PtValue | undefined","required":false},{"name":"pt:dragIcon","type":"PtValue | undefined","required":false},{"name":"pt:dragIcon:disabled","type":"PtValue | undefined","required":false},{"name":"pt:dragIcon:empty","type":"PtValue | undefined","required":false},{"name":"pt:dragIcon:expanded","type":"PtValue | undefined","required":false},{"name":"pt:dragIcon:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:dragIcon:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:dragIcon:loading","type":"PtValue | undefined","required":false},{"name":"pt:dragIcon:selected","type":"PtValue | undefined","required":false},{"name":"pt:dragIcon:sorted","type":"PtValue | undefined","required":false},{"name":"pt:dragIcon:sortedDesc","type":"PtValue | undefined","required":false},{"name":"pt:firstRow","type":"PtValue | undefined","required":false},{"name":"pt:firstRow:disabled","type":"PtValue | undefined","required":false},{"name":"pt:firstRow:empty","type":"PtValue | undefined","required":false},{"name":"pt:firstRow:expanded","type":"PtValue | undefined","required":false},{"name":"pt:firstRow:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:firstRow:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:firstRow:loading","type":"PtValue | undefined","required":false},{"name":"pt:firstRow:selected","type":"PtValue | undefined","required":false},{"name":"pt:firstRow:sorted","type":"PtValue | undefined","required":false},{"name":"pt:firstRow:sortedDesc","type":"PtValue | undefined","required":false},{"name":"pt:foot","type":"PtValue | undefined","required":false},{"name":"pt:foot:disabled","type":"PtValue | undefined","required":false},{"name":"pt:foot:empty","type":"PtValue | undefined","required":false},{"name":"pt:foot:expanded","type":"PtValue | undefined","required":false},{"name":"pt:foot:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:foot:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:foot:loading","type":"PtValue | undefined","required":false},{"name":"pt:foot:selected","type":"PtValue | undefined","required":false},{"name":"pt:foot:sorted","type":"PtValue | undefined","required":false},{"name":"pt:foot:sortedDesc","type":"PtValue | undefined","required":false},{"name":"pt:head","type":"PtValue | undefined","required":false},{"name":"pt:head:disabled","type":"PtValue | undefined","required":false},{"name":"pt:head:empty","type":"PtValue | undefined","required":false},{"name":"pt:head:expanded","type":"PtValue | undefined","required":false},{"name":"pt:head:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:head:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:head:loading","type":"PtValue | undefined","required":false},{"name":"pt:head:selected","type":"PtValue | undefined","required":false},{"name":"pt:head:sorted","type":"PtValue | undefined","required":false},{"name":"pt:head:sortedDesc","type":"PtValue | undefined","required":false},{"name":"pt:headerRow","type":"PtValue | undefined","required":false},{"name":"pt:headerRow:disabled","type":"PtValue | undefined","required":false},{"name":"pt:headerRow:empty","type":"PtValue | undefined","required":false},{"name":"pt:headerRow:expanded","type":"PtValue | undefined","required":false},{"name":"pt:headerRow:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:headerRow:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:headerRow:loading","type":"PtValue | undefined","required":false},{"name":"pt:headerRow:selected","type":"PtValue | undefined","required":false},{"name":"pt:headerRow:sorted","type":"PtValue | undefined","required":false},{"name":"pt:headerRow:sortedDesc","type":"PtValue | undefined","required":false},{"name":"pt:lastRow","type":"PtValue | undefined","required":false},{"name":"pt:lastRow:disabled","type":"PtValue | undefined","required":false},{"name":"pt:lastRow:empty","type":"PtValue | undefined","required":false},{"name":"pt:lastRow:expanded","type":"PtValue | undefined","required":false},{"name":"pt:lastRow:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:lastRow:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:lastRow:loading","type":"PtValue | undefined","required":false},{"name":"pt:lastRow:selected","type":"PtValue | undefined","required":false},{"name":"pt:lastRow:sorted","type":"PtValue | undefined","required":false},{"name":"pt:lastRow:sortedDesc","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:empty","type":"PtValue | undefined","required":false},{"name":"pt:root:expanded","type":"PtValue | undefined","required":false},{"name":"pt:root:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:root:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:root:loading","type":"PtValue | undefined","required":false},{"name":"pt:root:selected","type":"PtValue | undefined","required":false},{"name":"pt:root:sorted","type":"PtValue | undefined","required":false},{"name":"pt:root:sortedDesc","type":"PtValue | undefined","required":false},{"name":"pt:row","type":"PtValue | ((ctx: PtItemCtx<Item, BbTablePtState>) => PtItemResult) | undefined","required":false},{"name":"pt:row:disabled","type":"PtValue | undefined","required":false},{"name":"pt:row:empty","type":"PtValue | undefined","required":false},{"name":"pt:row:expanded","type":"PtValue | undefined","required":false},{"name":"pt:row:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:row:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:row:loading","type":"PtValue | undefined","required":false},{"name":"pt:row:selected","type":"PtValue | undefined","required":false},{"name":"pt:row:sorted","type":"PtValue | undefined","required":false},{"name":"pt:row:sortedDesc","type":"PtValue | undefined","required":false},{"name":"pt:selectIcon","type":"PtValue | undefined","required":false},{"name":"pt:selectIcon:disabled","type":"PtValue | undefined","required":false},{"name":"pt:selectIcon:empty","type":"PtValue | undefined","required":false},{"name":"pt:selectIcon:expanded","type":"PtValue | undefined","required":false},{"name":"pt:selectIcon:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:selectIcon:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:selectIcon:loading","type":"PtValue | undefined","required":false},{"name":"pt:selectIcon:selected","type":"PtValue | undefined","required":false},{"name":"pt:selectIcon:sorted","type":"PtValue | undefined","required":false},{"name":"pt:selectIcon:sortedDesc","type":"PtValue | undefined","required":false},{"name":"pt:sortIcon","type":"PtValue | undefined","required":false},{"name":"pt:sortIcon:disabled","type":"PtValue | undefined","required":false},{"name":"pt:sortIcon:empty","type":"PtValue | undefined","required":false},{"name":"pt:sortIcon:expanded","type":"PtValue | undefined","required":false},{"name":"pt:sortIcon:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:sortIcon:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:sortIcon:loading","type":"PtValue | undefined","required":false},{"name":"pt:sortIcon:selected","type":"PtValue | undefined","required":false},{"name":"pt:sortIcon:sorted","type":"PtValue | undefined","required":false},{"name":"pt:sortIcon:sortedDesc","type":"PtValue | undefined","required":false},{"name":"pt:table","type":"PtValue | undefined","required":false},{"name":"pt:table:disabled","type":"PtValue | undefined","required":false},{"name":"pt:table:empty","type":"PtValue | undefined","required":false},{"name":"pt:table:expanded","type":"PtValue | undefined","required":false},{"name":"pt:table:highlighted","type":"PtValue | undefined","required":false},{"name":"pt:table:indeterminate","type":"PtValue | undefined","required":false},{"name":"pt:table:loading","type":"PtValue | undefined","required":false},{"name":"pt:table:selected","type":"PtValue | undefined","required":false},{"name":"pt:table:sorted","type":"PtValue | undefined","required":false},{"name":"pt:table:sortedDesc","type":"PtValue | undefined","required":false},{"name":"readonly","type":"boolean | undefined","required":false,"default":"false","description":"Sets the input in a readonly state."},{"name":"reorderable","type":"boolean | undefined","required":false,"default":"false","description":"Lets the user reorder the data columns: drag a header cell (AG Grid style —\nthe column moves live under the pointer and a chip with its label follows)\nor, from the keyboard, use each header's reorder handle (ArrowLeft /\nArrowRight move the column one slot, Home / End to the ends). Every move\nwrites `v-model:order`. Not needed by an external control (a column\npanel) that only writes `order`. The `select` / `actions` columns and\na custom `#thead` are never draggable."},{"name":"resizable","type":"boolean | undefined","required":false,"default":"false","description":"Lets the user resize the data columns of a root table: drag the handle on\na header's trailing edge (the column follows live, the width commits on\nrelease), or press Alt + ArrowLeft / ArrowRight on the focused header;\ndouble-click the handle to go back to the declared width. Each commit\nfires `resize:column(key, width)` once. `column.width` stays the single declared\ntruth: a resized width is an override the table keeps until that\ncolumn's `width` changes — write the reported width back into your\ncolumn definition to persist it. Ignored on a table that inherits its\nwidths from a parent."},{"name":"rowClass","type":"BbTableRowClasses<Item> | undefined","required":false,"description":"Defines the classes to be passed to each data row. Can also be a\nfunction of the row's item for dynamic values."},{"name":"selectable","type":"boolean | ((item: Item) => boolean) | undefined","required":false,"description":"Defines whether the table is selectable.\nCan be a global boolean that affects all rows or a function\nthat accepts an item and returns a boolean that only affects that item."},{"name":"selectAll","type":"boolean | undefined","required":false,"default":"false","description":"Defines whether the \"Select all\" checkbox is checked."},{"name":"selectAllLabel","type":"string | undefined","required":false,"description":"Text of the label used by the \"Select all\" boolean."},{"name":"selectText","type":"string | undefined","required":false,"description":"Text of the header used for the radio inputs when the table is not `multiple`."},{"name":"sort","type":"BbTableSortEntry[] | undefined","required":false,"default":"[]","description":"Doesn't sort `items` — apply the model to your own data (or your server\nquery).\nUsed by `v-model:sort`. Ordered array of `[columnKey, direction]`\nentries, one per actively sorted column. Bidirectional: the header\nbuttons of `sortable` columns update it, and external writes update the\nheader indicators. The table does not sort its items — apply the model\nto your own data source."},{"name":"tdClass","type":"ColumnClasses<Item> | undefined","required":false,"description":"Defines the classes to be passed to every data cell. Can also be a function for dynamic values."},{"name":"thClass","type":"Classes | undefined","required":false,"description":"Defines the classes to be passed to every header cell."},{"name":"totalItems","type":"string | number | undefined","required":false,"description":"Total number of items there is. Also flows into the shared table\ncontext, where a `BbPagination` paired through `id` derives its page\ncount from it. When omitted, an array `items` table infers it from\n`items.length`; an explicit value (or a context write) always wins over\nthat inference. Numeric strings are coerced, exactly like\n`BbPagination`'s `total-items`."},{"name":"totalPages","type":"string | number | undefined","required":false,"description":"Seeds the page count shown by a `BbPagination` paired through `id`. A\nshortcut for when the server reports a page count rather than a row\ncount: the table renders nothing from it, it only flows into the shared\ntable context. A known total always wins — when `totalItems` (or a\ncontext write) provides one, the page count is derived from it and this\nseed is ignored. Numeric strings are coerced, exactly like\n`BbPagination`'s `total-pages`."},{"name":"unselectedItems","type":"any[] | undefined","required":false,"default":"[]","description":"Items that are not selected."},{"name":"virtual","type":"boolean | undefined","required":false,"default":"false","description":"Windows the body: only the rows in (and just around) the vertical\nscrollport are mounted, so a client-side dataset of any size scrolls at\na constant cost. The table itself is the scroller as soon as you bound\nits height (`max-height` / `height`, or a flex item with\n`min-height: 0`); left unbounded, the nearest scrolling ancestor or the\npage scrolls it. The header sticks to that scroller. Column widths are\nmeasured once from the first rendered batch and then hold — later rows\nnever widen them. Expand rows and nested tables stay fully rendered\ninside their row (a nested table is never windowed); the row that owns\nfocus stays mounted even when scrolled out of view. Ignored by a table\nthat inherits its widths from a parent, and under a `#tbody` slot."}],"events":[{"name":"click:row","signature":"(event: MouseEvent, item: any): void","description":"A body row was clicked, or activated with Enter/Space under\n`keyboardNavigation`. Carries the DOM `MouseEvent` and the raw record."},{"name":"contextmenu:row","signature":"(event: MouseEvent, item: any): void","description":"A body row was right-clicked. Carries the DOM `MouseEvent` and the raw record."},{"name":"dblclick:row","signature":"(event: MouseEvent, item: any): void","description":"A body row was double-clicked. Carries the DOM `MouseEvent` and the raw record."},{"name":"hide:column","signature":"(key: string): void","description":"A column was hidden from its header (a `#<key>:header` /\n`#<key>:header:append` control calling the slot's `hideColumn()`). Fired once;\nthe table keeps the column hidden for the mount, or until the column's\n`hidden` flag changes — write `hidden: true` into the definition to\npersist it, `hidden: false` (a column panel) to show it again."},{"name":"item:selected","signature":"(value: any): void","description":"The user selected one row. Carries the row's value (read through\n`itemValue`, the same value the selection v-model holds)."},{"name":"item:unselected","signature":"(value: any): void","description":"The user unselected one row. Carries the row's value, like `item:selected`."},{"name":"resize:column","signature":"(key: string, width: number | null): void","description":"A column was resized by the user (`resizable`): the new width in\npx, or `null` when the handle was double-clicked to reset the column to\nits declared width."},{"name":"update:expandedItems","signature":"(value: any[]): void","description":"Emitted with the new value whenever `v-model:expandedItems` changes."},{"name":"update:highlighted","signature":"(value: any): void","description":"Emitted with the new value whenever `v-model:highlighted` changes."},{"name":"update:modelValue","signature":"(value: any): void","description":"Emitted with the new value whenever `v-model` changes."},{"name":"update:order","signature":"(value: string[]): void","description":"Emitted with the new value whenever `v-model:order` changes."},{"name":"update:selectAll","signature":"(value: boolean): void","description":"Emitted with the new value whenever `v-model:selectAll` changes."},{"name":"update:sort","signature":"(value: BbTableSortEntry[]): void","description":"Emitted with the new value whenever `v-model:sort` changes."},{"name":"update:unselectedItems","signature":"(value: any[]): void","description":"Emitted with the new value whenever `v-model:unselectedItems` changes."}],"slots":[{"name":"actions","type":"{ expanded?: boolean | undefined; expandProps?: ExpandControllerProps | undefined; toggleExpanded?: (() => void) | undefined; highlighted?: boolean | undefined; toggleHighlighted?: (() => void) | undefined; selected?: boolean | undefined; toggleSelected?: (() => void) | undefined; item: Item; value: any; }","description":"Content rendered in the actions cell for each row. Providing this slot\nis what CREATES the actions column (there is no prop): the header cell\n(labelled by `actions-text`, replaceable through `#actions:header`) and\none cell per row appear with it, and go away with it. Pin it with\n`fixed-actions`."},{"name":"actions:header","type":"{ text: string; }","description":"Replaces the default actions header cell content."},{"name":"empty","type":"{ error: unknown; }","description":"Content shown when the items list is empty and not loading. It fills the\ntable's own full-width empty-state cell (it already spans the\nselection/actions columns), so provide the *content* — a message, an\nillustration, a \"clear filters\" button — never a row/cell of your own.\n`error` is what the latest failed load rejected with, untouched (an\n`Error`, a `Response`, anything thrown; a nullish rejection becomes an\n`Error`), and `null` when nothing failed — a failed load clears the\nrows, so this slot is where it shows."},{"name":"expand","type":"{ expanded: boolean; expandProps?: ExpandControllerProps | undefined; toggleExpanded: () => void; highlighted?: boolean | undefined; toggleHighlighted?: (() => void) | undefined; selected?: boolean | undefined; toggleSelected?: (() => void) | undefined; item: Item; value: any; }","description":"Full-width expandable content row rendered below each main row when expanded."},{"name":"header:append","type":"BbTableHeaderAffixSlotProps<Item>","fields":["classes?: Classes","columnKey: string","items?: Item[]","label?: string","sortable?: boolean","sortOrder?: \"asc\" | \"desc\" | null","toggleSort?: (() => void)","hideColumn?: (() => void)"],"description":"Content rendered after every data column's header cell content — the\nlabel + sort control, or the column's own `<key>:header` replacement.\nA column's `<key>:header:append` slot wins over this one for that\ncolumn; they never stack. Branch on `columnKey` for per-column output."},{"name":"header:prepend","type":"BbTableHeaderAffixSlotProps<Item>","fields":["classes?: Classes","columnKey: string","items?: Item[]","label?: string","sortable?: boolean","sortOrder?: \"asc\" | \"desc\" | null","toggleSort?: (() => void)","hideColumn?: (() => void)"],"description":"Content rendered before every data column's header cell content — the\nlabel + sort control, or the column's own `<key>:header` replacement.\nA column's `<key>:header:prepend` slot wins over this one for that\ncolumn; they never stack. Branch on `columnKey` for per-column output."},{"name":"loading","type":"{ items: Item[]; }","description":"Content shown while table rows are loading (replaces the skeleton rows)."},{"name":"select","type":"{ item: Item; value: any; checked: boolean; disabled: boolean; inputName: string; readonly: boolean; toggleSelected?: (() => void) | undefined; }","description":"Replaces the default checkbox/radio in the selection cell for each row."},{"name":"select:header","type":"{ multiple: boolean; selectAll: boolean; text: string; }","description":"Replaces the default selection header cell content (checkbox or radio label)."},{"name":"tbody","type":"object","description":"Replaces the content of the body row group (`.bb-table__body`). Use when\nyou need full control over the body markup. Provide role-complete rows —\n`<div role=\"row\">` holding one `<div role=\"cell\">` per column — never a\n`<tr>`/`<td>`. A full-width cell spans with `grid-column: 1 / -1`."},{"name":"tfoot","type":"{ columnCount: number; }","description":"Fills the footer row group (`.bb-table__foot`). Use when you need a\nfooter. Provide role-complete rows — `<div role=\"row\">` holding\n`<div role=\"cell\">` elements — never a `<tr>`/`<td>`."},{"name":"thead","type":"object","description":"Replaces the content of the header row group (`.bb-table__head`). Use when\nyou need full control over the header markup. The table is a CSS grid,\nnot a `<table>`: provide role-complete rows — `<div role=\"row\">` holding\none `<div role=\"columnheader\">` per column — and never a `<tr>`/`<th>`.\nRows are subgrid rows, so each cell lands on the matching column track."},{"name":"<key>","type":"object","description":"One column's body cell in every row, by the column `key` through `slotKey`. Scope: `{ item, value, content, selected, expanded, highlighted, classes, sortOrder, toggleSelected, toggleExpanded, toggleHighlighted, expandProps }`.","dynamic":true},{"name":"<key>:header","type":"object","description":"One column's header content, replacing its label and the built-in sort button. Scope: `{ label, items, sortable, sortOrder, toggleSort, hideColumn, classes }`.","dynamic":true},{"name":"<key>:header:prepend","type":"BbTableHeaderAffixSlotProps<Item>","description":"Content before one column's header, keeping the sort button; beats `header:prepend` (they never stack).","dynamic":true},{"name":"<key>:header:append","type":"BbTableHeaderAffixSlotProps<Item>","description":"Content after one column's header, keeping the sort button; beats `header:append` (they never stack).","dynamic":true},{"name":"<key>:first","type":"BbTableEdgeCellSlotProps<Item>","description":"One column's cell in a row before the data rows; any such slot creates the row, aligned with the columns. Only over rows.","dynamic":true},{"name":"<key>:last","type":"BbTableEdgeCellSlotProps<Item>","description":"One column's cell in a row after the data rows (a totals row); any such slot creates that row, aligned like `<key>:first`.","dynamic":true}],"exposed":[],"models":[{"name":"expandedItems","type":"any[] | undefined"},{"name":"highlighted","type":"any"},{"name":"modelValue","type":"any"},{"name":"order","type":"string[] | undefined"},{"name":"selectAll","type":"boolean | undefined"},{"name":"sort","type":"BbTableSortEntry[] | undefined"},{"name":"unselectedItems","type":"any[] | undefined"}],"cssProps":[{"name":"--bg","value":"var(--bb-panel)","selector":".bb-table","description":"The table's surface colour. Cells are transparent at rest so the row can tint them, but anything that sticks over scrolled content — the stuck head band and pinned (`column.fixed`) cells — must be opaque, and paints this. Set it on the table (`.my-table { --bg: … }`) when the table sits on a surface that is not `--bb-panel`; a nested table re-declares its own."},{"name":"--px","value":"12px","selector":".bb-table"},{"name":"--cell-h","value":"36px","selector":".bb-table"},{"name":"--py","value":"6px","selector":".bb-table"},{"name":"--actions-spacing","value":"8px","selector":".bb-table"},{"name":"--offset-start","value":"0px","selector":".bb-table","description":"Raw structural edge offset measured by the component (the parent's select/actions track width). Default 0 keeps every calc at its base."},{"name":"--offset-end","value":"0px","selector":".bb-table"},{"name":"--offset-internal-start","value":"var(--offset-start)","selector":".bb-table","description":"Routing of that offset. By default it is \"internal\": added to the first/last cell padding and folded into the first/last column width. Swap internal↔external (set internal to 0 and external to the raw offset) to pad the whole table instead of the edge cells."},{"name":"--offset-internal-end","value":"var(--offset-end)","selector":".bb-table"},{"name":"--offset-external-start","value":"0px","selector":".bb-table"},{"name":"--offset-external-end","value":"0px","selector":".bb-table"},{"name":"--pin-l","value":"0px","selector":".bb-table","description":"Re-declared on every table: a nested table must not inherit its parent's fade or pinned edge."},{"name":"--pin-r","value":"0px","selector":".bb-table"},{"name":"--fade-l","value":"0px","selector":".bb-table"},{"name":"--fade-r","value":"0px","selector":".bb-table"},{"name":"--fade-a-l","value":"1","selector":".bb-table"},{"name":"--fade-a-r","value":"1","selector":".bb-table"},{"name":"--cue-l","value":"0px","selector":".bb-table"},{"name":"--cue-r","value":"0px","selector":".bb-table"},{"name":"--cue-w","value":"8px","selector":".bb-table"},{"name":"--cue","value":"rgb(0 0 0 / 0.1)","selector":".bb-table"}],"pt":{"parts":[{"name":"root","description":"The table's container."},{"name":"caption","description":"The visible caption (`caption` with `displayCaption`)."},{"name":"table","description":"The grid root: `role=\"table\"`, or `role=\"grid\"` with `keyboardNavigation` (`role=\"treegrid\"` with an `#expand` slot too)."},{"name":"head","description":"The header row group."},{"name":"headerRow","description":"The header row."},{"name":"cellColumnHeader","description":"Every column header cell (`role=\"columnheader\"`), the select and actions headers included — a broadcast resolved per header. Not a `<th>`: the grid is `div`s with ARIA roles."},{"name":"sortIcon","description":"A sortable column's sort arrow, resolved per header."},{"name":"body","description":"The body row group."},{"name":"row","description":"Every DATA row — a broadcast resolved per row. Expand rows and the skeleton are not parts. Also takes a per-item function, called with the row's raw item, once per rendered row: keep it cheap."},{"name":"cell","description":"Every data cell, the select and actions cells included — a broadcast resolved with its row's states (`role=\"cell\"`, `gridcell` under `keyboardNavigation`) — and the cells of the `firstRow` / `lastRow`, with no row state. Takes no function: use `tdClass` for a per-cell hook."},{"name":"firstRow","description":"The row of `#<key>:first` cells, before the data rows."},{"name":"lastRow","description":"The row of `#<key>:last` cells, after the data rows (a totals row: `pt:lastRow=\"font-semibold\"`)."},{"name":"selectIcon","description":"The selection glyph: each row's checkbox (radio with single selection) and the select-all checkbox — resolved per node. Not rendered when the `select` / `select:header` slots replace them."},{"name":"dragIcon","description":"The move glyph on the chip that follows a column drag (`reorderable`)."},{"name":"foot","description":"The footer row group (the `tfoot` slot's container)."}],"states":[{"name":"empty","description":"Component-wide: there are no rows (`bb-table--empty`)."},{"name":"sorted","description":"Per node, on `cellColumnHeader` and `sortIcon`: the column is sorted, either direction (`bb-table__cell-column-header--sorted`)."},{"name":"sortedDesc","description":"Per node, on `cellColumnHeader` and `sortIcon`: sorted descending (`bb-table__cell-column-header--sorted-desc`). Ascending is `sorted` alone."},{"name":"selected","description":"Per node, on `row`, its cells and its `selectIcon`: a checked row; on the select-all glyph, every row is selected."},{"name":"indeterminate","description":"Per node, on the select-all `selectIcon`: some rows are selected, not all."},{"name":"disabled","description":"Per node, on `row`, its cells and its `selectIcon`: the row cannot be SELECTED — `selectable` rejects it, or the table is `disabled` (`bb-table__row--disabled`). It still clicks, highlights and expands. Never on a table without selection. The select-all glyph takes it from the table's `disabled`."},{"name":"expanded","description":"Per node, on `row` and its cells: the row's expand row is open (`bb-table__row--expanded`)."},{"name":"highlighted","description":"Per node, on `row` and its cells: the highlighted row."},{"name":"loading","description":"Component-wide: the table is `loading`."}]},"tree":{"bindings":[{"part":"caption","target":"div.bb-table__caption"},{"part":"dragIcon","target":"svg.bb-table__drag-icon"},{"part":"table","target":"div"},{"part":"head","target":"div.bb-table__head"},{"part":"headerRow","target":"div.bb-table__header-row"},{"part":"cellColumnHeader","target":"div.bb-table__cell-column-header"},{"part":"selectIcon","target":"BbBaseCheckboxIcon"},{"part":"sortIcon","target":"svg.bb-table__sort-icon"},{"part":"body","target":"div.bb-table__body"},{"part":"foot","target":"div.bb-table__foot"}],"nodes":[{"name":"BbBaseCheckboxIcon","kind":"public","cssProps":[{"name":"--accent","documented":false,"readBy":["bb-base-checkbox-icon","bb-base-checkbox-icon--errors","bb-base-checkbox-icon--warnings","bb-base-checkbox-icon--checked","bb-base-checkbox-icon--indeterminate"]},{"name":"--check-color","documented":false,"readBy":["bb-base-checkbox-icon__check","bb-base-checkbox-icon__indeterminate"]},{"name":"--size","documented":false,"readBy":["bb-base-checkbox-icon"]},{"name":"--r","documented":true,"readBy":["bb-base-checkbox-icon"]},{"name":"--ring-color","documented":true,"readBy":["bb-base-checkbox-icon","bb-base-checkbox-icon--focus-visible"]},{"name":"--elev","documented":true,"readBy":["bb-base-checkbox-icon","bb-base-checkbox-icon--focus-visible"]},{"name":"--bg","documented":true,"readBy":["bb-base-checkbox-icon"]},{"name":"--border-color","documented":false,"readBy":["bb-base-checkbox-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"}]}]},"css":{"classes":{"bb-sr-only":[""],"bb-table":["","--align-*","--compact","--empty","--fixed","--fixed-header","--inherit-widths","--loading","--overflow-left","--overflow-right","--pinned-left","--pinned-right","--reorderable","--resizable","--selectable","--virtual","--virtual-flat","__body","__caption","__cell","__cell--*","__cell--actions","__cell--clip","__cell--edge-end","__cell--edge-start","__cell--fluid","__cell--nowrap","__cell--resized","__cell--select","__cell-column-header","__cell-column-header--*","__cell-column-header--actions","__cell-column-header--clip","__cell-column-header--dragging","__cell-column-header--edge-end","__cell-column-header--edge-start","__cell-column-header--floored","__cell-column-header--locked","__cell-column-header--resizing","__cell-column-header--select","__cell-column-header--sortable","__cell-column-header--sorted","__cell-column-header--sorted-desc","__drag-icon","__edge-row","__edge-row--*","__edge-row--first","__edge-row--fixed","__edge-row--last","__foot","__head","__head--dragging","__head--resizing","__header-row","__reorder-status","__row","__row--disabled","__row--expanded","__row--highlighted","__select-icon","__sort-icon","__table"],"bb-table-check":["","__label","__label--disabled","__label-text"],"bb-table-column-drag":[""],"bb-table-column-ghost":[""],"bb-table-empty":["__cell","__row","__text"],"bb-table-expand":["__cell","__row","__row--highlighted"],"bb-table-header":["__content","__resizer"],"bb-table-loading":["__text"],"bb-table-placeholder":["__row","__row--pending"],"bb-table-radio":["","__label","__label--disabled","__label-text"],"bb-table-resizing":[""],"bb-table-skeleton":["__avatar","__avatar-text","__badge","__cell","__cell--*","__cell--actions","__cell--select","__cell-content","__image","__line","__placeholder","__row"],"bb-table-sort":["","--asc","--desc"],"bb-table-spacer":["__row"]},"locals":["--actions-spacing","--arrow-preview","--bg","--cell-h","--color-gray-200","--cue","--cue-l","--cue-r","--cue-w","--drop","--fade-a-l","--fade-a-r","--fade-l","--fade-r","--floor","--line","--offset-end","--offset-external-end","--offset-external-start","--offset-internal-end","--offset-internal-start","--offset-start","--pin-l","--pin-r","--placeholder-bars","--px","--py","--row-bg","--row-h","--stuck-head-h","--stuck-outer","--stuck-top","--virtual-row-tracks"]},"removed":[{"name":"allowSelectAll","new":"disableSelectAll","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-table.md","silent":true,"fix":{"kind":"invert"}},{"name":"enabledWhileLoading","new":"interactiveWhileLoading","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-table.md","silent":true,"fix":{"kind":"rename"}},{"name":"actions","new":null,"since":"3.0.0-beta.21","migration":"ai/guides/migration/components/bb-table.md","silent":true,"fix":{"kind":"remove"}},{"name":"fixedColumns","new":null,"since":"3.0.0-beta.21","migration":"ai/guides/migration/components/bb-table.md","silent":true,"fix":{"kind":"manual"}},{"name":"noDataText","new":"emptyText","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"no-data","new":"empty","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","silent":true,"fix":{"kind":"rename"}},{"name":"header:select","new":"select:header","surface":"slot","migration":"ai/guides/migration/components/bb-table.md","silent":true,"fix":{"kind":"rename"}},{"name":"header:actions","new":"actions:header","surface":"slot","migration":"ai/guides/migration/components/bb-table.md","silent":true,"fix":{"kind":"rename"}},{"name":"header:<x>:prepend","new":"<x>:header:prepend","surface":"slot","migration":"ai/guides/migration/components/bb-table.md","silent":true,"fix":{"kind":"rename"}},{"name":"header:<x>:append","new":"<x>:header:append","surface":"slot","migration":"ai/guides/migration/components/bb-table.md","silent":true,"fix":{"kind":"rename"}},{"name":"header:<x>","new":"<x>:header","surface":"slot","migration":"ai/guides/migration/components/bb-table.md","silent":true,"fix":{"kind":"rename"}}],"renamed":[{"from":"allowSelectAll","to":"disableSelectAll","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-table.md","fix":{"kind":"invert"}},{"from":"enabledWhileLoading","to":"interactiveWhileLoading","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-table.md","fix":{"kind":"rename"}},{"from":"noDataText","to":"emptyText","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"no-data","to":"empty","surface":"slot","since":"3.0.0-beta.41","migration":"ai/guides/migration/v2-to-v3.md","fix":{"kind":"rename"}},{"from":"header:select","to":"select:header","surface":"slot","migration":"ai/guides/migration/components/bb-table.md","fix":{"kind":"rename"}},{"from":"header:actions","to":"actions:header","surface":"slot","migration":"ai/guides/migration/components/bb-table.md","fix":{"kind":"rename"}},{"from":"header:<x>:prepend","to":"<x>:header:prepend","surface":"slot","migration":"ai/guides/migration/components/bb-table.md","fix":{"kind":"rename"}},{"from":"header:<x>:append","to":"<x>:header:append","surface":"slot","migration":"ai/guides/migration/components/bb-table.md","fix":{"kind":"rename"}},{"from":"header:<x>","to":"<x>:header","surface":"slot","migration":"ai/guides/migration/components/bb-table.md","fix":{"kind":"rename"}}]},
|
|
497
497
|
{"name":"BbTabs","group":"Navigation","description":"Switches between views of one page from a row of tabs. For the tabs and their panels in different places of the layout, use BbTabsRoot with BbTabsList and BbTabsPanels.","referenceOnly":false,"hasGuide":true,"contract":"ai/BbTabs.md","source":"ai/source/BbTabs.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":"pt","type":"PtItemMap<BbTabsPtPart, \"item\", BbTabsPtState, BbTabsItem<K>> | undefined","required":false,"description":"Passthrough, object form: the same keys as the `pt:*` attributes\nwithout the prefix. See the `pt:<part>` row."},{"name":"pt:indicator","type":"PtValue | undefined","required":false},{"name":"pt:indicator:active","type":"PtValue | undefined","required":false},{"name":"pt:indicator:disabled","type":"PtValue | undefined","required":false},{"name":"pt:item","type":"PtValue | ((ctx: PtItemCtx<BbTabsItem<K>, BbTabsPtState>) => PtItemResult) | undefined","required":false},{"name":"pt:item:active","type":"PtValue | undefined","required":false},{"name":"pt:item:disabled","type":"PtValue | undefined","required":false},{"name":"pt:list","type":"PtValue | undefined","required":false},{"name":"pt:list:active","type":"PtValue | undefined","required":false},{"name":"pt:list:disabled","type":"PtValue | undefined","required":false},{"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:panels","type":"PtValue | undefined","required":false},{"name":"pt:panels:active","type":"PtValue | undefined","required":false},{"name":"pt:panels: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},{"name":"pt:wrapper","type":"PtValue | undefined","required":false},{"name":"pt:wrapper:active","type":"PtValue | undefined","required":false},{"name":"pt:wrapper:disabled","type":"PtValue | undefined","required":false},{"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":"label","type":"BbTabsSlotProps<K>","fields":["current: K | null","currentIndex: number","disabled: boolean","isFirst: boolean","isLast: boolean","selected: boolean","text: string","value: K","goTo: (target: \"first\" | \"previous\" | \"next\" | \"last\") => void"],"description":"Fallback slot used for all tab labels when no per-tab `<key>:label` slot is provided."},{"name":"wrapper:append","type":"BbTabsScrollSlotProps","fields":["isScrolling: boolean","canScrollLeft: boolean","canScrollRight: boolean","scroll: (direction: \"left\" | \"right\") => void"],"description":"Content rendered after the scrollable tab label list (e.g. a right scroll arrow)."},{"name":"wrapper:prepend","type":"BbTabsScrollSlotProps","fields":["isScrolling: boolean","canScrollLeft: boolean","canScrollRight: boolean","scroll: (direction: \"left\" | \"right\") => void"],"description":"Content rendered before the scrollable tab label list (e.g. a left scroll arrow)."},{"name":"<key>","type":"BbTabsSlotProps<K>","description":"One tab's content panel, by the tab `key` through `slotKey`; no fallback (an empty panel).","dynamic":true},{"name":"<key>:label","type":"BbTabsSlotProps<K>","description":"One tab trigger's label, by the tab `key` through `slotKey`; beats `label`, which beats the item's `label` text.","dynamic":true}],"exposed":[],"models":[{"name":"modelValue","type":"K | null | undefined"}],"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 tabs' outer element, around the strip and the panels."},{"name":"wrapper","description":"The strip's outer element: the `wrapper:prepend` slot, the triggers, the `wrapper:append` slot. `BbTabsList`'s root in a split layout."},{"name":"list","description":"The `role=\"tablist\"` row the triggers sit in — it scrolls when they overflow, and the indicator slides inside it."},{"name":"item","description":"One tab trigger — a broadcast resolved per tab with its own `active` / `disabled`. Also takes a per-item function, called with the tab's descriptor."},{"name":"indicator","description":"The marker sliding under the active trigger: the pill, or the bar of the `line` variant. Its position and size are measured."},{"name":"panels","description":"The element around the panels. `BbTabsPanels`'s root in a split layout."},{"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."}]},"tree":{"forwards":[{"to":"BbTabsList","mapping":"passthrough.forwardInstance(LIST_PARTS)"},{"to":"BbTabsPanels","mapping":"passthrough.forwardInstance(PANELS_PARTS)"}],"nodes":[{"name":"BbTabsList","kind":"public","vocabulary":"BbTabs","bindings":[{"part":"list","target":"ul.bb-tabs-list__list"},{"part":"indicator","target":"li.bb-tabs-list__indicator"},{"part":"item","target":"BbBaseButton"}],"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":"BbTabsPanels","kind":"public","vocabulary":"BbTabs","bindings":[{"part":"panel","target":"section.bb-tabs__panel"}]}]},"css":{"classes":{"bb-tabs":["","--*","--block","--compact","--disabled","--vertical","__panel","__panel--shown","__trigger-content","__trigger-label"]},"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"],"removed":[{"name":"animateX","new":"disableAnimateX","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-tabs.md","silent":true,"fix":{"kind":"invert"}},{"name":"animateY","new":"disableAnimateY","since":"3.0.0-alpha.1","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":"header:prepend","new":"wrapper:prepend","surface":"slot","since":"3.0.0-beta.36","migration":"ai/guides/migration/v3-beta-css-classes.md","silent":true,"fix":{"kind":"rename"}},{"name":"header:append","new":"wrapper:append","surface":"slot","since":"3.0.0-beta.36","migration":"ai/guides/migration/v3-beta-css-classes.md","silent":true,"fix":{"kind":"rename"}},{"name":"label:<x>","new":"<x>:label","surface":"slot","migration":"ai/guides/migration/components/bb-tabs.md","silent":true,"fix":{"kind":"rename"}}],"renamed":[{"from":"animateX","to":"disableAnimateX","since":"3.0.0-alpha.1","migration":"ai/guides/migration/components/bb-tabs.md","fix":{"kind":"invert"}},{"from":"animateY","to":"disableAnimateY","since":"3.0.0-alpha.1","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"}},{"from":"header:prepend","to":"wrapper:prepend","surface":"slot","since":"3.0.0-beta.36","migration":"ai/guides/migration/v3-beta-css-classes.md","fix":{"kind":"rename"}},{"from":"header:append","to":"wrapper:append","surface":"slot","since":"3.0.0-beta.36","migration":"ai/guides/migration/v3-beta-css-classes.md","fix":{"kind":"rename"}},{"from":"label:<x>","to":"<x>:label","surface":"slot","migration":"ai/guides/migration/components/bb-tabs.md","fix":{"kind":"rename"}}]},
|
|
498
498
|
{"name":"BbTabsList","group":"Navigation","description":"The trigger strip of a split BbTabsRoot layout (renders the tab buttons only).","referenceOnly":false,"hasGuide":false,"contract":"ai/BbTabsList.md","source":"ai/source/BbTabsList.md","props":[{"name":"pt","type":"PtItemMap<BbTabsListPtPart, \"item\", BbTabsPtState, BbTabsItem<string>> | undefined","required":false,"description":"Passthrough, object form: the same keys as the `pt:*` attributes\nwithout the prefix. See the `pt:<part>` row."},{"name":"pt:indicator","type":"PtValue | undefined","required":false},{"name":"pt:indicator:active","type":"PtValue | undefined","required":false},{"name":"pt:indicator:disabled","type":"PtValue | undefined","required":false},{"name":"pt:item","type":"PtValue | ((ctx: PtItemCtx<BbTabsItem<string>, BbTabsPtState>) => PtItemResult) | undefined","required":false},{"name":"pt:item:active","type":"PtValue | undefined","required":false},{"name":"pt:item:disabled","type":"PtValue | undefined","required":false},{"name":"pt:list","type":"PtValue | undefined","required":false},{"name":"pt:list:active","type":"PtValue | undefined","required":false},{"name":"pt:list: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},{"name":"variant","type":"keyof TabsVariantRegistry | undefined","required":false,"values":["none","pill","line"],"description":"Look of this strip — the `variant` of the owning `BbTabs` / `BbTabsRoot`\nunless set here. See `BbTabsProps.variant` for the values."}],"events":[],"slots":[{"name":"label","type":"BbTabsSlotProps<string>","fields":["current: K | null","currentIndex: number","disabled: boolean","isFirst: boolean","isLast: boolean","selected: boolean","text: string","value: K","goTo: (target: \"first\" | \"previous\" | \"next\" | \"last\") => void"],"description":"Fallback slot used for all tab labels when no per-tab `<key>:label` slot is provided."},{"name":"wrapper:append","type":"BbTabsScrollSlotProps","fields":["isScrolling: boolean","canScrollLeft: boolean","canScrollRight: boolean","scroll: (direction: \"left\" | \"right\") => void"],"description":"Content rendered after the scrollable tab label list (e.g. a right scroll arrow)."},{"name":"wrapper:prepend","type":"BbTabsScrollSlotProps","fields":["isScrolling: boolean","canScrollLeft: boolean","canScrollRight: boolean","scroll: (direction: \"left\" | \"right\") => void"],"description":"Content rendered before the scrollable tab label list (e.g. a left scroll arrow)."},{"name":"<key>:label","type":"BbTabsSlotProps<K>","description":"One tab trigger's label, by the tab `key` through `slotKey`; beats `label`, which beats the item's `label` text.","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 strip's outer element: the `wrapper:prepend` slot, the triggers, the `wrapper:append` slot (`BbTabs`'s `wrapper`)."},{"name":"list","description":"The `role=\"tablist\"` row the triggers sit in."},{"name":"item","description":"One tab trigger, per tab with its own `active` / `disabled`. Also takes a per-item function, called with the tab's descriptor."},{"name":"indicator","description":"The marker sliding under the active trigger."}],"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."}]},"tree":{"bindings":[{"part":"list","target":"ul.bb-tabs-list__list"},{"part":"indicator","target":"li.bb-tabs-list__indicator"},{"part":"item","target":"BbBaseButton"}],"nodes":[{"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-tabs-list":["","--*","--block","--compact","--disabled","--line","--none","--vertical","__append","__indicator","__item","__item--active","__list","__list--measuring","__list--no-transition","__prepend"]},"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"],"removed":[{"name":"header:prepend","new":"wrapper:prepend","surface":"slot","since":"3.0.0-beta.36","migration":"ai/guides/migration/v3-beta-css-classes.md","silent":true,"fix":{"kind":"rename"}},{"name":"header:append","new":"wrapper:append","surface":"slot","since":"3.0.0-beta.36","migration":"ai/guides/migration/v3-beta-css-classes.md","silent":true,"fix":{"kind":"rename"}},{"name":"label:<x>","new":"<x>:label","surface":"slot","migration":"ai/guides/migration/components/bb-tabs.md","silent":true,"fix":{"kind":"rename"}}],"renamed":[{"from":"header:prepend","to":"wrapper:prepend","surface":"slot","since":"3.0.0-beta.36","migration":"ai/guides/migration/v3-beta-css-classes.md","fix":{"kind":"rename"}},{"from":"header:append","to":"wrapper:append","surface":"slot","since":"3.0.0-beta.36","migration":"ai/guides/migration/v3-beta-css-classes.md","fix":{"kind":"rename"}},{"from":"label:<x>","to":"<x>:label","surface":"slot","migration":"ai/guides/migration/components/bb-tabs.md","fix":{"kind":"rename"}}]},
|
|
499
499
|
{"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"]},
|