bitboss-ui 3.0.0-beta.52 → 3.0.0-beta.53
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/bin/bitboss-ui-mcp.mjs +16 -8
- package/dist/ai/BbBadge.md +3 -2
- package/dist/ai/BbColorPalette.md +4 -3
- package/dist/ai/BbDatePicker.md +1 -1
- package/dist/ai/BbDropdown.md +6 -2
- package/dist/ai/BbForm.md +25 -17
- package/dist/ai/BbHoverCard.md +1 -1
- package/dist/ai/BbPopover.md +5 -3
- package/dist/ai/BbSelectPopover.md +1 -1
- package/dist/ai/BbTable.md +120 -28
- package/dist/ai/BbTimePicker.md +1 -1
- package/dist/ai/BbTooltip.md +1 -1
- package/dist/ai/CommonPopover.md +1 -1
- package/dist/ai/changelog.json +52 -3
- package/dist/ai/components.json +14 -14
- package/dist/ai/guides/component-picker.md +1 -1
- package/dist/ai/guides/migration/from-async-validator.md +60 -46
- package/dist/ai/guides/migration/v2-to-v3.md +24 -0
- package/dist/ai/guides/options-items-playbook.md +5 -5
- package/dist/ai/guides/validated-forms.md +19 -8
- package/dist/ai/helpers/inertia/manifest.json +1 -1
- package/dist/ai/manifest/components/BbBadge.json +1 -1
- package/dist/ai/manifest/components/BbColorPalette.json +1 -1
- package/dist/ai/manifest/components/BbDatePicker.json +1 -1
- package/dist/ai/manifest/components/BbDropdown.json +1 -1
- package/dist/ai/manifest/components/BbHoverCard.json +1 -1
- package/dist/ai/manifest/components/BbPopover.json +1 -1
- package/dist/ai/manifest/components/BbSelectPopover.json +1 -1
- package/dist/ai/manifest/components/BbTable.json +4 -4
- package/dist/ai/manifest/components/BbTable.tree.json +18 -0
- package/dist/ai/manifest/components/BbTimePicker.json +1 -1
- package/dist/ai/manifest/components/BbTooltip.json +1 -1
- package/dist/ai/manifest/components/CommonPopover.json +1 -1
- package/dist/ai/manifest/index.json +2 -2
- package/dist/ai/manifest/types.api.json +1 -1
- package/dist/ai/recipes/inertia/approvals-inbox.md +1 -1
- package/dist/ai/recipes/nuxt/approvals-inbox.md +1 -1
- package/dist/ai/recipes/vue/approvals-inbox.md +1 -1
- package/dist/ai/source/BbBadge.md +3 -4
- package/dist/ai/source/BbBadgeButton.md +3 -4
- package/dist/ai/source/BbColorPalette.md +3 -1
- package/dist/ai/source/BbDatePicker.md +4 -1
- package/dist/ai/source/BbDropdown.md +5 -3
- package/dist/ai/source/BbDropdownGroup.md +5 -3
- package/dist/ai/source/BbHoverCard.md +3 -2
- package/dist/ai/source/BbHoverCardPortal.md +3 -2
- package/dist/ai/source/BbPopover.md +3 -2
- package/dist/ai/source/BbPopoverPortal.md +3 -2
- package/dist/ai/source/BbSelectPopover.md +3 -1
- package/dist/ai/source/BbTable.md +315 -59
- package/dist/ai/source/BbTimePicker.md +4 -1
- package/dist/ai/source/BbTooltip.md +3 -2
- package/dist/ai/source/CommonPopover.md +11 -8
- package/dist/components/BbBadge/types.d.ts +3 -4
- package/dist/components/BbColorPalette/types.d.ts +3 -1
- package/dist/components/BbDatePicker/types.d.ts +4 -1
- package/dist/components/BbDropdown/types.d.ts +5 -3
- package/dist/components/BbHoverCard/types.d.ts +3 -2
- package/dist/components/BbPopover/types.d.ts +3 -2
- package/dist/components/BbSelectPopover/types.d.ts +3 -1
- package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +931 -891
- package/dist/components/BbTable/BbTableDataRow.js +76 -78
- package/dist/components/BbTable/types.d.ts +21 -6
- package/dist/components/BbTable/useRowReorder.js +217 -195
- package/dist/components/BbTable/utils.d.ts +21 -0
- package/dist/components/BbTable/utils.js +19 -16
- package/dist/components/BbTable/warroom/harness.d.ts +7 -0
- package/dist/components/BbTimePicker/types.d.ts +4 -1
- package/dist/components/BbTooltip/types.d.ts +3 -2
- package/dist/components/CommonPopover/CommonPopover.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/CommonPopover/types.d.ts +4 -4
- package/dist/composables/useBaseOptions.d.ts +3 -3
- package/dist/composables/useBaseOptions.js +11 -11
- package/dist/composables/useItemText.d.ts +5 -0
- package/dist/composables/useItemText.js +14 -14
- package/dist/composables/useItemValue.js +9 -9
- package/dist/composables/useItemsGetter.js +55 -51
- package/dist/composables/useSegmentedFields.js +6 -1
- package/dist/composables/useTableWidthContext.d.ts +6 -0
- package/dist/composables/useTableWidthContext.js +2 -1
- package/dist/llms-full.txt +281 -124
- package/dist/llms-medium.txt +1 -1
- package/dist/styles.css +2 -2
- package/dist/utils/versionCheck.js +1 -1
- package/package.json +2 -1
- package/scripts/lib/hand-roll-hints.mjs +11 -2
|
@@ -243,7 +243,7 @@ compose it or write it yourself.
|
|
|
243
243
|
| ------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
244
244
|
| `BbColumnManager` — show/hide/reorder columns | Does not exist as a component. Order is `v-model:order` on `BbTable` (an array of keys any panel can write; `reorderable` adds the built-in header drag + keyboard handle); visibility is `hidden: true` on the column definition (the column stays declared and keeps its slot in the order; header slots get a `hideColumn()` that fires `hide:column`). Compose the panel from `BbPopover` + `BbCheckbox`. |
|
|
245
245
|
| `BbKanban` / drag-and-drop board | Does not exist. There is no reusable DnD primitive in the library (`BbTable`'s header drag and row drag are internal to the table) — compose the board from `BbTable` (a table/list view of the same data) or hand-roll the drag-and-drop interaction yourself. |
|
|
246
|
-
| `BbSortableList` / drag rows to reorder | [BbTable](../BbTable.md) with `reorderable-rows`: a
|
|
246
|
+
| `BbSortableList` / drag rows to reorder | [BbTable](../BbTable.md) with `reorderable-rows`: a drag handle per row (mouse, pen, touch, keyboard), and `reorder:rows` reports `{ item, from, to }` — the table never reorders `items`, your handler splices it. A list without columns is a one-column table. |
|
|
247
247
|
| `BbModal` | It is [BbDialog](../BbDialog.md). |
|
|
248
248
|
| `BbDrawer` / `BbSheet` | It is [BbOffCanvas](../BbOffCanvas.md). |
|
|
249
249
|
| `BbCombobox` / `BbAutocomplete` | It is [BbSelect](../BbSelect.md) / [BbSelectPopover](../BbSelectPopover.md) — search is built in, see `disable-writing`. |
|
|
@@ -594,32 +594,37 @@ function isEmailFree(email: string): Promise<boolean> {
|
|
|
594
594
|
return answer;
|
|
595
595
|
}
|
|
596
596
|
|
|
597
|
-
const
|
|
598
|
-
.object({
|
|
599
|
-
|
|
600
|
-
name
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
email
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
597
|
+
const teamFields = z.object({
|
|
598
|
+
company: z.object({
|
|
599
|
+
name: z
|
|
600
|
+
.string('Enter the company name')
|
|
601
|
+
.trim()
|
|
602
|
+
.min(1, 'Enter the company name'),
|
|
603
|
+
// Optional: absent or null passes, anything typed must match.
|
|
604
|
+
vat: z
|
|
605
|
+
.string()
|
|
606
|
+
.regex(/^IT\d{11}$/, 'IT and 11 digits')
|
|
607
|
+
.nullish(),
|
|
608
|
+
}),
|
|
609
|
+
email: z
|
|
610
|
+
.email('Enter a valid email')
|
|
611
|
+
.refine(isEmailFree, 'This email already has an account'),
|
|
612
|
+
password: z.string('Choose a password').min(8, 'At least 8 characters'),
|
|
613
|
+
confirm: z.string('Repeat the password'),
|
|
614
|
+
plan: z.enum(['starter', 'team'], 'Pick a plan'),
|
|
615
|
+
members: z.array(z.object({ email: z.email('Enter a valid email') })),
|
|
616
|
+
terms: z.literal(true, 'Accept the terms'),
|
|
617
|
+
});
|
|
618
|
+
|
|
619
|
+
// `when`: the mismatch shows while other fields still fail (zod otherwise
|
|
620
|
+
// skips an object refinement until the whole object parses).
|
|
621
|
+
const team = teamFields.refine((values) => values.password === values.confirm, {
|
|
622
|
+
message: 'The passwords do not match',
|
|
623
|
+
path: ['confirm'],
|
|
624
|
+
when: (payload) =>
|
|
625
|
+
teamFields.pick({ password: true, confirm: true }).safeParse(payload.value)
|
|
626
|
+
.success,
|
|
627
|
+
});
|
|
623
628
|
|
|
624
629
|
const plans = [
|
|
625
630
|
{ label: 'Starter', value: 'starter' },
|
|
@@ -1102,28 +1107,37 @@ function isUsernameFree(username: string): Promise<boolean> {
|
|
|
1102
1107
|
|
|
1103
1108
|
const text = (message: string) => z.string(message).trim().min(1, message);
|
|
1104
1109
|
|
|
1105
|
-
const
|
|
1106
|
-
.object({
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1110
|
+
const profileFields = z.object({
|
|
1111
|
+
account: z.object({
|
|
1112
|
+
username: text('Username is required')
|
|
1113
|
+
.min(3, '3 to 20 characters')
|
|
1114
|
+
.max(20, '3 to 20 characters')
|
|
1115
|
+
.refine(isUsernameFree, 'That username is taken'),
|
|
1116
|
+
email: z.email('Email is not a valid email'),
|
|
1117
|
+
}),
|
|
1118
|
+
password: z.string('Password is required').min(8, 'At least 8 characters'),
|
|
1119
|
+
confirm: z.string('Repeat password is required'),
|
|
1120
|
+
addresses: z.array(
|
|
1121
|
+
z.object({
|
|
1122
|
+
street: text('Enter the street'),
|
|
1123
|
+
city: text('Enter the city'),
|
|
1124
|
+
})
|
|
1125
|
+
),
|
|
1126
|
+
});
|
|
1127
|
+
|
|
1128
|
+
// `when`: the mismatch shows while other fields still fail (zod otherwise
|
|
1129
|
+
// skips an object refinement until the whole object parses).
|
|
1130
|
+
const profile = profileFields.refine(
|
|
1131
|
+
(values) => values.password === values.confirm,
|
|
1132
|
+
{
|
|
1124
1133
|
message: 'The passwords do not match',
|
|
1125
1134
|
path: ['confirm'],
|
|
1126
|
-
|
|
1135
|
+
when: (payload) =>
|
|
1136
|
+
profileFields
|
|
1137
|
+
.pick({ password: true, confirm: true })
|
|
1138
|
+
.safeParse(payload.value).success,
|
|
1139
|
+
}
|
|
1140
|
+
);
|
|
1127
1141
|
|
|
1128
1142
|
let nextId = 2;
|
|
1129
1143
|
const formState = ref<{
|
|
@@ -1883,6 +1883,30 @@ Nothing here fails to compile — these change what existing code does.
|
|
|
1883
1883
|
component that always forwards `:highlighted="props.highlighted"` now
|
|
1884
1884
|
binds every inner table (its rows get the pointer cursor even when the
|
|
1885
1885
|
page binds nothing): add `:highlightable="props.highlighted !== undefined"`.
|
|
1886
|
+
59. **A function `item-text` runs on string items** (since
|
|
1887
|
+
3.0.0-beta.53). Over a `string[]` it used to be skipped, so
|
|
1888
|
+
`:item-text="(code) => labels[code]"` showed the raw codes and the advice
|
|
1889
|
+
was to wrap each code in an object. Now it labels them and the codes stay
|
|
1890
|
+
the values, as it already did over a `number[]`. A path (`item-text` /
|
|
1891
|
+
`item-value="name"`) on a primitive keeps the primitive itself, where a
|
|
1892
|
+
number used to show blank and the value was `undefined`. A list you
|
|
1893
|
+
wrapped into `{ value: code, label }` objects only for this can go back
|
|
1894
|
+
to plain codes plus the function.
|
|
1895
|
+
60. **`boundary` no longer flips a panel** (since 3.0.0-beta.53). A
|
|
1896
|
+
dropdown, popover, tooltip or picker kept inside a `boundary` used to flip
|
|
1897
|
+
to the other side of its trigger when it would cross the boundary's edge,
|
|
1898
|
+
so a row menu bounded by its table opened above the table's last rows.
|
|
1899
|
+
Now the boundary only keeps the panel inside it alongside the trigger
|
|
1900
|
+
(sideways for a panel above or below); away from the trigger it may pass
|
|
1901
|
+
the edge, and only the viewport flips it.
|
|
1902
|
+
61. **A table's row checkbox is named by the row, not every cell** (since
|
|
1903
|
+
3.0.0-beta.53). It read "Select" plus every cell's text; now it reads
|
|
1904
|
+
"Select" plus the row's name: its `rowHeader` cells, else its first
|
|
1905
|
+
column, as the drag handle does. Tests that find the checkbox by the long
|
|
1906
|
+
name, or by the name followed by more text, match the short name now. A
|
|
1907
|
+
table whose first column is not its identity (a receipt thumbnail) marks
|
|
1908
|
+
the identity column `rowHeader: true`. `accessible-label` still sets any
|
|
1909
|
+
name you want.
|
|
1886
1910
|
|
|
1887
1911
|
## 7. Class overrides → variants
|
|
1888
1912
|
|
|
@@ -66,17 +66,17 @@ Pass backend/domain items **as-is** to `items` and resolve text/value declarativ
|
|
|
66
66
|
`{ label, value }` and `{ text, value }` items work as they are; any other shape
|
|
67
67
|
needs `item-text` / `item-value`.
|
|
68
68
|
|
|
69
|
-
A **
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
69
|
+
A **primitive** item (`string[]`, `number[]`) is its own text and value; a
|
|
70
|
+
path has nothing to read on it and is ignored. To label a list of codes, pass
|
|
71
|
+
a function: `:item-text="(code) => labels[code]"` shows the labels and the
|
|
72
|
+
codes stay the values. No need to wrap the codes in objects.
|
|
73
73
|
|
|
74
74
|
Never pre-map accessor-mode items into `{ label, value }` arrays: point `item-text` / `item-value` at the fields they already have. Matching is hash-based on the extracted value, so component-native extraction stays robust and the raw item remains available to slots (`#option`, cell slots) untouched.
|
|
75
75
|
|
|
76
76
|
### Mapping modes
|
|
77
77
|
|
|
78
78
|
1. **`{ label, value }` objects** (or `{ text, value }`): omit both props; the text is the own `label` (else `text`), the value the own `value`.
|
|
79
|
-
2. **Primitive items** (`string[]`, `number[]`): omit both props; the value is the primitive itself.
|
|
79
|
+
2. **Primitive items** (`string[]`, `number[]`): omit both props; the value is the primitive itself. Label them with a function `item-text`.
|
|
80
80
|
3. **Dot paths** for nested objects: `item-text="profile.fullName"`, `item-value="profile.id"`.
|
|
81
81
|
4. **Extractor functions** only when a path can't express it:
|
|
82
82
|
|
|
@@ -334,20 +334,31 @@ call `removeField` on a deleted row: [BbForm § Rows](../BbForm.md#rows-v-for).
|
|
|
334
334
|
### A check across fields (confirm a password)
|
|
335
335
|
|
|
336
336
|
A rule that compares two fields is a refinement of the whole object, with
|
|
337
|
-
`path` naming the field that shows the message
|
|
337
|
+
`path` naming the field that shows the message, and `when` saying which
|
|
338
|
+
fields it needs:
|
|
338
339
|
|
|
339
340
|
```ts
|
|
340
341
|
import { z } from 'zod';
|
|
341
342
|
|
|
342
|
-
const
|
|
343
|
-
.
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
343
|
+
const fields = z.object({
|
|
344
|
+
password: z.string('At least 8 characters').min(8, 'At least 8 characters'),
|
|
345
|
+
password_confirmation: z.string('Repeat the password'),
|
|
346
|
+
terms: z.literal(true, 'Accept the terms'),
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
const signup = fields.refine(
|
|
350
|
+
(form) => form.password === form.password_confirmation,
|
|
351
|
+
{
|
|
348
352
|
message: 'The passwords do not match',
|
|
349
353
|
path: ['password_confirmation'],
|
|
350
|
-
|
|
354
|
+
// Without `when`, zod skips an object refinement while ANY field fails:
|
|
355
|
+
// the mismatch stays hidden until the terms box is ticked.
|
|
356
|
+
when: (payload) =>
|
|
357
|
+
fields
|
|
358
|
+
.pick({ password: true, password_confirmation: true })
|
|
359
|
+
.safeParse(payload.value).success,
|
|
360
|
+
}
|
|
361
|
+
);
|
|
351
362
|
```
|
|
352
363
|
|
|
353
364
|
The message lands on the field whose `name` is `password_confirmation`, and a
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
{"name":"prepend:icon","type":"string | undefined","description":"Icon rendered before the label."},
|
|
16
16
|
{"name":"pt","type":"PtMap<BbBadgePtPart, \"loading\"> | undefined","description":"Passthrough, object form: `{ icon: '…', 'icon:loading': '…' }` — the same\nkeys as the `pt:*` attributes without the prefix. Parts: `root`, `icon`,\n`spinner`, `text`, `clear`. State: `loading`."},
|
|
17
17
|
{"name":"size","type":"keyof Sizes | undefined","default":"\"md\"","values":["xs","sm","md","lg","xl","2xl"],"description":"Preset size of the badge."},
|
|
18
|
-
{"name":"variant","type":"BadgeVariantType | undefined","default":"\"primary\"","values":["outline","primary","destructive","secondary","none"],"description":"Visual variant: `primary`, `secondary`, `destructive`, or `outline`.\
|
|
18
|
+
{"name":"variant","type":"BadgeVariantType | undefined","default":"\"primary\"","values":["outline","primary","destructive","secondary","none"],"description":"Visual variant: `primary`, `secondary`, `destructive`, or `outline`.\nStatus colours are a registration (vite plugin `badgeVariants`, the\n`soft-*` palette in design-language.md) styled as `.bb-badge--<variant>`.\n`'none'` renders no variant class: set `--bg` / `--fg` on the element."}
|
|
19
19
|
],
|
|
20
20
|
"events": [
|
|
21
21
|
{"name":"click:clear","signature":"(event: MouseEvent): void","description":"Emitted when the clear button is pressed (only rendered when `clearable`)."}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
{"name":"adaptive","type":"boolean | undefined","default":"`config.adaptive` (`true`)","description":"When `true`, the palette opens as a bottom off-canvas sheet on mobile\nviewports instead of a floating popover; on desktop it stays a popover.\nMirrors the adaptive behaviour of `BbPopover`/`BbDropdown`/`BbDatePicker`.\n\nWhen unset, falls back to the global `config.adaptive`."},
|
|
12
12
|
{"name":"alpha","type":"boolean | undefined","default":"false","description":"Enable the alpha channel. The picker shows an opacity slider and emits\n`#RRGGBBAA` hex8 values."},
|
|
13
13
|
{"name":"anchor","type":"ElementOrComponentRef | undefined","description":"Element or component ref the popover positions itself relative to.\nDefaults to the activator element when omitted, allowing the popover to\nbe anchored to a larger container (e.g. the full input row) while a\nsmaller element (e.g. a color dot) remains the click target."},
|
|
14
|
-
{"name":"boundary","type":"ElementOrComponentRefOrSelector | undefined","description":"Constrains the popover within a bounding element.\nAccepts an HTMLElement, a Vue component ref, or a CSS selector string."},
|
|
14
|
+
{"name":"boundary","type":"ElementOrComponentRefOrSelector | undefined","description":"Constrains the popover within a bounding element: it stays inside it\nalongside its trigger (sideways for a popover above or below); away from\nthe trigger it may pass the edge, and it flips at the viewport only.\nAccepts an HTMLElement, a Vue component ref, or a CSS selector string."},
|
|
15
15
|
{"name":"disabled","type":"boolean | undefined","default":"false","description":"Disable all interaction (activator and palette)."},
|
|
16
16
|
{"name":"disableFlip","type":"boolean | undefined","default":"false","description":"Disables the automatic flip to the opposite side when the popover\nwould overflow (flipping is on by default)."},
|
|
17
17
|
{"name":"eager","type":"boolean | undefined","default":"false","description":"Renders the palette panel at mount instead of on the first open (the\nphone sheet's too)."},
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
{"name":"adaptive","type":"boolean | undefined","default":"`config.adaptive` (`true`)","description":"On mobile, open in a bottom off-canvas sheet instead of a floating popover.\nWhen unset, falls back to the global `config.adaptive`."},
|
|
13
13
|
{"name":"ampm","type":"boolean | undefined","default":"false","description":"12-hour display with an AM/PM column (requires `type=\"datetime\"`); emits stay 24h."},
|
|
14
14
|
{"name":"anchor","type":"ElementOrComponentRef | undefined","description":"Element or component ref the popover positions itself relative to.\nDefaults to the activator when omitted (anchor to a larger row while a\nsmaller element stays the click target)."},
|
|
15
|
-
{"name":"boundary","type":"ElementOrComponentRefOrSelector | undefined","description":"Constrains the popover within a bounding element or CSS selector."},
|
|
15
|
+
{"name":"boundary","type":"ElementOrComponentRefOrSelector | undefined","description":"Constrains the popover within a bounding element or CSS selector:\nsideways only, alongside the trigger; it flips at the viewport."},
|
|
16
16
|
{"name":"disabled","type":"boolean | undefined","default":"false","description":"Disables the activator and the calendar."},
|
|
17
17
|
{"name":"disableFlip","type":"boolean | undefined","default":"false","description":"Disable the automatic flip to the opposite side on overflow."},
|
|
18
18
|
{"name":"eager","type":"boolean | undefined","default":"false","description":"Render popover content before it is first shown."},
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
{"name":"activator","type":"Record<string, any> | HTMLElement | null | undefined","description":"An external activator element or component ref: the activator slot is not\nrendered, and the listeners and ARIA (`aria-haspopup` / `aria-expanded` /\n`aria-controls`) are attached to it; don't add your own."},
|
|
11
11
|
{"name":"adaptive","type":"boolean | undefined","default":"`config.adaptive` (`true`)","description":"On mobile (below `config.mobileMaxWidth`), renders the menu as a bottom\nsheet that drills into submenus one level at a time instead of hover\nflyouts; slots and selection are unchanged. Unset: the global\n`config.adaptive`."},
|
|
12
12
|
{"name":"anchor","type":"Record<string, any> | HTMLElement | null | undefined","default":"the activator element","description":"The element the panel positions against when it should differ from the\nactivator (a wrapper the activator is part of); an HTMLElement or\ncomponent ref. It also drives a percentage `width`. Ignored with\n`placement=\"cursor\"`."},
|
|
13
|
-
{"name":"boundary","type":"string | Record<string, any> | HTMLElement | null | undefined","description":"
|
|
13
|
+
{"name":"boundary","type":"string | Record<string, any> | HTMLElement | null | undefined","description":"Keeps the panel inside this element alongside its trigger (sideways for\na menu above or below); away from the trigger it may pass the edge, and\nonly the viewport flips it. An HTMLElement, a component ref or a CSS\nselector: a `useTemplateRef`, never `$refs.x` (not reactive)."},
|
|
14
14
|
{"name":"compact","type":"boolean | undefined","default":"false","description":"Compact density, the `BbSelect` ladder: flyout rows 28px → 24px, sheet\nrows 44px → 36px (a sheet row stays a touch target). The label size does\nnot change."},
|
|
15
15
|
{"name":"disabled","type":"boolean | undefined","default":"false","description":"Disables the component"},
|
|
16
16
|
{"name":"eager","type":"boolean | undefined","default":"false","description":"Renders the menu panel at mount instead of on the first open (the phone\nsheet's too), and keeps its rows after a close. Without it the rows mount\non each open and go once the menu has closed."},
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"source": "ai/source/BbHoverCard.md",
|
|
9
9
|
"props": [
|
|
10
10
|
{"name":"activator","type":"ElementOrComponentRef | undefined","description":"External activator element or component ref.\nWhen provided, the activator slot is not rendered and the hover / focus\nlisteners are attached programmatically to the referenced element."},
|
|
11
|
-
{"name":"boundary","type":"ElementOrComponentRefOrSelector | undefined","description":"Constrains the card within a bounding element
|
|
11
|
+
{"name":"boundary","type":"ElementOrComponentRefOrSelector | undefined","description":"Constrains the card within a bounding element: it stays inside it\nalongside its trigger (sideways for a card above or below); away from\nthe trigger it may pass the edge, and it flips at the viewport only.\nAccepts an HTMLElement, a Vue component ref, or a CSS selector string."},
|
|
12
12
|
{"name":"delay","type":"number | undefined","default":"350","description":"Milliseconds the pointer (or keyboard focus) rests on the activator\nbefore the card shows; longer than BbTooltip's, so passing over does not\nopen it. Closing has a fixed grace (guide § Timing and the safe zone)."},
|
|
13
13
|
{"name":"disabled","type":"boolean | undefined","default":"false","description":"Disables the component. Disabling an open card closes it."},
|
|
14
14
|
{"name":"eager","type":"boolean | undefined","default":"false","description":"Renders the card's content at mount instead of on the first open."},
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"props": [
|
|
10
10
|
{"name":"activator","type":"ElementOrComponentRef | undefined","description":"External activator element or component ref.\nWhen provided, the activator slot is not rendered and click events\nare attached programmatically to the referenced element."},
|
|
11
11
|
{"name":"adaptive","type":"boolean | undefined","default":"`config.adaptive` (`true`)","description":"On mobile (below `config.mobileMaxWidth`), renders as a bottom sheet\ninstead of a floating panel, with the same `header`, `default` and\n`footer` slots. `width` is ignored there: size the sheet with\n`offCanvasProps`. Unset: the global `config.adaptive`."},
|
|
12
|
-
{"name":"boundary","type":"ElementOrComponentRefOrSelector | undefined","description":"Constrains the popover within a bounding element
|
|
12
|
+
{"name":"boundary","type":"ElementOrComponentRefOrSelector | undefined","description":"Constrains the popover within a bounding element: it stays inside it\nalongside its trigger (sideways for a popover above or below); away from\nthe trigger it may pass the edge, and it flips at the viewport only.\nAccepts an HTMLElement, a Vue component ref, or a CSS selector string."},
|
|
13
13
|
{"name":"disabled","type":"boolean | undefined","default":"false","description":"Disables the component."},
|
|
14
14
|
{"name":"eager","type":"boolean | undefined","default":"false","description":"Renders the panel's content at mount instead of on the first open\n(the phone sheet's too)."},
|
|
15
15
|
{"name":"focusTarget","type":"string | undefined","description":"Selector for the element that receives focus after opening.\nDefaults to the first focusable element inside the popover."},
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
{"name":"ariaDescribedby","type":"string | string[] | undefined","description":"Space-separated IDREF(s) that describe this field for assistive technologies.\nAccepts either a string or array of ids."},
|
|
14
14
|
{"name":"ariaInvalid","type":"boolean | undefined","default":"undefined","description":"Explicit invalid state for accessibility semantics.\nFalls back to `hasErrors` when not provided."},
|
|
15
15
|
{"name":"autocomplete","type":"string | undefined","default":"\"off\"","description":"Browser autocomplete hint for the popover search input."},
|
|
16
|
-
{"name":"boundary","type":"string | Record<string, any> | HTMLElement | null | undefined","description":"Constrains the popover to a specific boundary element."},
|
|
16
|
+
{"name":"boundary","type":"string | Record<string, any> | HTMLElement | null | undefined","description":"Constrains the popover to a specific boundary element: it stays inside\nit alongside its trigger (sideways for a popover above or below); away\nfrom the trigger it may pass the edge, and it flips at the viewport only."},
|
|
17
17
|
{"name":"clearable","type":"boolean | undefined","default":"false","description":"Shows a clear button in the search field, in the lens' place while there\nis a query or a selection; it resets both. None without a search field.\nLeave it off when the activator already clears (as BbSelect's does)."},
|
|
18
18
|
{"name":"compact","type":"boolean | undefined","default":"false","description":"Apply the compact density variant."},
|
|
19
19
|
{"name":"dependencies","type":"unknown[] | undefined","default":"[]","description":"Additional dependencies that trigger item reloading when changed."},
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"contract": "ai/BbTable.md",
|
|
8
8
|
"source": "ai/source/BbTable.md",
|
|
9
9
|
"props": [
|
|
10
|
-
{"name":"accessibleLabel","type":"((columns: MappedCell[], item: any) => string) | undefined","description":"
|
|
10
|
+
{"name":"accessibleLabel","type":"((columns: MappedCell[], item: any) => string) | undefined","description":"The row's selection checkbox label, from `(columns, item)`. Unset: the\nrow's name in the locale's select template (its `rowHeader` cells, else\nits first column: \"Select INV-1041\"). The cells arrive in render order:\nlook one up by `key`, never by position."},
|
|
11
11
|
{"name":"actionsText","type":"string | undefined","description":"Label used in the header of the actions column."},
|
|
12
12
|
{"name":"align","type":"\"left\" | \"center\" | \"right\" | undefined","default":"\"left\"","description":"Text alignment of the columns."},
|
|
13
13
|
{"name":"caption","type":"string | undefined","description":"Caption that describes the content of the table. Used for accessibility purposes."},
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
{"name":"pt","type":"PtItemMap<BbTablePtPart, \"row\", BbTablePtState, Item> | undefined","description":"Passthrough, object form: the same keys as the `pt:*` attributes\nwithout the prefix. See the `pt:<part>` row."},
|
|
51
51
|
{"name":"readonly","type":"boolean | undefined","default":"false","description":"Sets the input in a readonly state."},
|
|
52
52
|
{"name":"reorderable","type":"boolean | undefined","default":"false","description":"Lets the user reorder the data columns: drag a header, or Shift+←/→ on a\nfocused header. Every move writes `v-model:order`; a column panel that\nonly writes `order` does not need it. `select` / `actions` and a custom\n`#thead` never move."},
|
|
53
|
-
{"name":"reorderableRows","type":"boolean | undefined","default":"false","description":"Adds a
|
|
53
|
+
{"name":"reorderableRows","type":"boolean | undefined","default":"false","description":"Adds a drag handle at the start of each row: the user drags a row, or lifts it\nwith Space / Enter and the arrow keys, and `reorder:rows` reports\n`{ item, from, to }`. The table never reorders `items`: splice it in the\nhandler."},
|
|
54
54
|
{"name":"resizable","type":"boolean | undefined","default":"false","description":"Lets the user resize the data columns (drag a header's trailing edge, or\nAlt+←/→; double-click resets). Each commit fires `resize:column(key,\nwidth)` once: write the width back into the column definition to keep it.\nIgnored when inheriting widths."},
|
|
55
55
|
{"name":"rowClass","type":"BbTableRowClasses<Item> | undefined","description":"Defines the classes to be passed to each data row. Can also be a\nfunction of the row's item for dynamic values."},
|
|
56
56
|
{"name":"selectable","type":"boolean | ((item: Item) => boolean) | undefined","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."},
|
|
@@ -129,7 +129,7 @@
|
|
|
129
129
|
{"name":"lastRow","description":"The row of `#<key>:last` cells, after the data rows (a totals row: `pt:lastRow=\"font-semibold\"`)."},
|
|
130
130
|
{"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."},
|
|
131
131
|
{"name":"dragIcon","description":"The move glyph on the chip that follows a column drag (`reorderable`)."},
|
|
132
|
-
{"name":"dragHandle","description":"Each row's
|
|
132
|
+
{"name":"dragHandle","description":"Each row's drag handle button (`reorderable-rows`), resolved with its row's states. A class list or an object; no per-row function."},
|
|
133
133
|
{"name":"foot","description":"The footer row group (the `tfoot` slot's container)."}
|
|
134
134
|
],
|
|
135
135
|
"states": [
|
|
@@ -145,7 +145,7 @@
|
|
|
145
145
|
]
|
|
146
146
|
},
|
|
147
147
|
"types": [
|
|
148
|
-
{"name":"BbTableColumn","usedAs":["prop 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]"]},
|
|
148
|
+
{"name":"BbTableColumn","usedAs":["prop columns"],"definition":"type BbTableColumn<Item = any> = BaseColumn<Item> & { align?: 'left' | 'right' | 'center'; skeleton?: SkeletonType; sortable?: boolean; rowHeader?: boolean; reorderable?: boolean; resizable?: 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","resizable?: 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]"]},
|
|
149
149
|
{"name":"BbTableItemsContext","usedAs":["prop items"],"definition":"type BbTableItemsContext<M = any> = BbItemsProviderContext<M> & { reason: 'initial' | 'dependencies' | 'pagination'; };"},
|
|
150
150
|
{"name":"BbTableRowClasses","usedAs":["prop rowClass"],"definition":"type BbTableRowClasses<Item = any> = Classes | ((item: Item) => Classes | undefined);"},
|
|
151
151
|
{"name":"BbTableSortEntry","usedAs":["prop sort","event update:sort"],"definition":"type BbTableSortEntry = [ key: string, direction: 'asc' | 'desc' ];"},
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
"--empty",
|
|
31
31
|
"--fixed",
|
|
32
32
|
"--fixed-header",
|
|
33
|
+
"--indent-*",
|
|
33
34
|
"--inherit-widths",
|
|
34
35
|
"--loading",
|
|
35
36
|
"--overflow-left",
|
|
@@ -39,6 +40,8 @@
|
|
|
39
40
|
"--reorderable",
|
|
40
41
|
"--resizable",
|
|
41
42
|
"--row-dragging",
|
|
43
|
+
"--row-grabbing",
|
|
44
|
+
"--rows-reorderable",
|
|
42
45
|
"--selectable",
|
|
43
46
|
"--virtual",
|
|
44
47
|
"--virtual-flat",
|
|
@@ -178,13 +181,21 @@
|
|
|
178
181
|
"--cue-l",
|
|
179
182
|
"--cue-r",
|
|
180
183
|
"--cue-w",
|
|
184
|
+
"--depth",
|
|
181
185
|
"--drop",
|
|
182
186
|
"--fade-a-l",
|
|
183
187
|
"--fade-a-r",
|
|
184
188
|
"--fade-l",
|
|
185
189
|
"--fade-r",
|
|
186
190
|
"--floor",
|
|
191
|
+
"--ic",
|
|
192
|
+
"--ig",
|
|
193
|
+
"--indent",
|
|
194
|
+
"--is",
|
|
187
195
|
"--line",
|
|
196
|
+
"--min-a",
|
|
197
|
+
"--min-g",
|
|
198
|
+
"--min-s",
|
|
188
199
|
"--offset-end",
|
|
189
200
|
"--offset-external-end",
|
|
190
201
|
"--offset-external-start",
|
|
@@ -213,6 +224,13 @@
|
|
|
213
224
|
{"name":"--actions-spacing","value":"8px","selector":".bb-table"},
|
|
214
225
|
{"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."},
|
|
215
226
|
{"name":"--offset-end","value":"0px","selector":".bb-table"},
|
|
227
|
+
{"name":"--ig","value":"0px","selector":".bb-table","description":"Nested indent locals (see `indentAnchor` in BbTable.vue): the step lands on ONE cell's leading padding. Reset on every table so a parent's step never inherits into a child's cells; the modifier picks the anchor."},
|
|
228
|
+
{"name":"--is","value":"0px","selector":".bb-table"},
|
|
229
|
+
{"name":"--ic","value":"0px","selector":".bb-table"},
|
|
230
|
+
{"name":"--depth","value":"0","selector":".bb-table","description":"Nesting depth (0 at the root) and the parent-region floors of the own structural tracks, both set inline by the component on nested tables; declared here so a parent's values never inherit into a child."},
|
|
231
|
+
{"name":"--min-g","value":"0px","selector":".bb-table"},
|
|
232
|
+
{"name":"--min-s","value":"0px","selector":".bb-table"},
|
|
233
|
+
{"name":"--min-a","value":"0px","selector":".bb-table"},
|
|
216
234
|
{"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."},
|
|
217
235
|
{"name":"--offset-internal-end","value":"var(--offset-end)","selector":".bb-table"},
|
|
218
236
|
{"name":"--offset-external-start","value":"0px","selector":".bb-table"},
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
{"name":"adaptive","type":"boolean | undefined","default":"`config.adaptive` (`true`)","description":"On mobile, open in a bottom off-canvas sheet instead of a floating popover.\nWhen unset, falls back to the global `config.adaptive`."},
|
|
13
13
|
{"name":"ampm","type":"boolean | undefined","default":"false","description":"12-hour display with an AM/PM column; emitted values stay 24-hour."},
|
|
14
14
|
{"name":"anchor","type":"ElementOrComponentRef | undefined","description":"Element or component ref the popover positions itself relative to.\nDefaults to the activator when omitted (anchor to a larger row while a\nsmaller element stays the click target)."},
|
|
15
|
-
{"name":"boundary","type":"ElementOrComponentRefOrSelector | undefined","description":"Constrains the popover within a bounding element or CSS selector."},
|
|
15
|
+
{"name":"boundary","type":"ElementOrComponentRefOrSelector | undefined","description":"Constrains the popover within a bounding element or CSS selector:\nsideways only, alongside the trigger; it flips at the viewport."},
|
|
16
16
|
{"name":"disabled","type":"boolean | undefined","default":"false","description":"Disables the activator and the columns."},
|
|
17
17
|
{"name":"disableFlip","type":"boolean | undefined","default":"false","description":"Disable the automatic flip to the opposite side on overflow."},
|
|
18
18
|
{"name":"eager","type":"boolean | undefined","default":"false","description":"Render popover content before it is first shown."},
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"props": [
|
|
10
10
|
{"name":"activator","type":"ElementOrComponentRef | undefined","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."},
|
|
11
11
|
{"name":"arrowPadding","type":"number | undefined","default":"10","description":"Space the arrow will maintain to the edge of the tooltip bubble.\nUseful when the floating element has border radius so it won't appear broken"},
|
|
12
|
-
{"name":"boundary","type":"ElementOrComponentRefOrSelector | undefined","description":"Constrains the tooltip within a bounding element
|
|
12
|
+
{"name":"boundary","type":"ElementOrComponentRefOrSelector | undefined","description":"Constrains the tooltip within a bounding element: it stays inside it\nalongside its trigger (sideways for a tooltip above or below); away from\nthe trigger it may pass the edge, and it flips at the viewport only.\nAccepts an HTMLElement, a Vue component ref, or a CSS selector string."},
|
|
13
13
|
{"name":"delay","type":"number | undefined","default":"100","description":"Milliseconds a pointer rests on the activator before the tooltip shows\n(`0`: at once). Keyboard focus shows it at once, and so does a pointer\narriving while another tooltip shows or within 300 ms of one closing."},
|
|
14
14
|
{"name":"disabled","type":"boolean | undefined","default":"false","description":"Disables the component"},
|
|
15
15
|
{"name":"eager","type":"boolean | undefined","default":"false","description":"Renders the tooltip's popover and content at mount instead of on the\nfirst open. The description screen readers hear exists from mount either\nway."},
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"props": [
|
|
10
10
|
{"name":"anchor","type":"any","description":"The element the popover positions itself relative to.\nAccepts an HTMLElement, a Vue component ref, or a virtual element with a `getBoundingClientRect` method."},
|
|
11
11
|
{"name":"arrowPadding","type":"number | undefined","description":"Space the arrow will maintain to the edge of the dropdown.\nUseful when the floating element has border radius so it won't appear broken"},
|
|
12
|
-
{"name":"boundary","type":"string | Record<string, any> | HTMLElement | null | undefined","description":"
|
|
12
|
+
{"name":"boundary","type":"string | Record<string, any> | HTMLElement | null | undefined","description":"Keeps the popover inside this element alongside its anchor (sideways\nabove or below, vertically beside it); away from the anchor it may pass\nthe edge, and only the viewport flips it. It never clamps the size\n(that is `overflowBoundary`). An HTMLElement, component ref or selector."},
|
|
13
13
|
{"name":"bubbleAttrs","type":"Record<string, unknown> | ((space: CommonPopoverAvailableSpace) => Record<string, unknown>) | undefined","description":"Attributes bound on the bubble (`class`, `style`, `inert`, …) after its\nown class, so the owner can make the bubble its layout container. The\nfunction form receives the default slot's free space (for a height cap)."},
|
|
14
14
|
{"name":"dialog","type":"boolean | undefined","default":"false","description":"Renders the popover as a `<dialog>` element (modal overlay) instead of a `<span>` with the Popover API."},
|
|
15
15
|
{"name":"disableFlip","type":"boolean | undefined","default":"false","description":"Disables the automatic flip to the opposite side when the popover\nwould overflow (flipping is on by default)."},
|
|
@@ -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.53",
|
|
5
|
+
"generatedAt": "2026-10-12T19:48:45.130Z",
|
|
6
6
|
"about": "The bitboss-ui API for agents: open components/<Name>.json for one component (every prop, event, slot, v-model, pt part and state, and the public types its API uses; one member per line). components/<Name>.tree.json has its component tree and CSS internals; files.removed the old names. The machine file with everything in one place is ../components.json.",
|
|
7
7
|
"reading": {
|
|
8
8
|
"components[]": "one row per component; description = its first sentence; file = its API file; tree: true = components/<Name>.tree.json exists (component tree, css classes, CSS custom properties).",
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
{"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'; };"},
|
|
25
25
|
{"name":"BbSelectPopoverItemsContext","usage":"api","component":null,"usedBy":[{"component":"BbSelectPopover","surface":"prop","name":"items"}],"definition":"type BbSelectPopoverItemsContext<M = any> = BbSelectItemsContext<M>;"},
|
|
26
26
|
{"name":"BbTabItem","usage":"api","component":"BbTabs","deprecated":true,"replacedBy":"BbTabsItem","usedBy":[{"component":"BbTabs","surface":"prop","name":"items"},{"component":"BbTabs","surface":"prop","name":"pt"},{"component":"BbTabs","surface":"prop","name":"pt:item"},{"component":"BbTabsList","surface":"prop","name":"pt"},{"component":"BbTabsList","surface":"prop","name":"pt:item"},{"component":"BbTabsRoot","surface":"prop","name":"items"}]},
|
|
27
|
-
{"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]"]},
|
|
27
|
+
{"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; resizable?: 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","resizable?: 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]"]},
|
|
28
28
|
{"name":"BbTableItemsContext","usage":"api","component":null,"usedBy":[{"component":"BbTable","surface":"prop","name":"items"}],"definition":"type BbTableItemsContext<M = any> = BbItemsProviderContext<M> & { reason: 'initial' | 'dependencies' | 'pagination'; };"},
|
|
29
29
|
{"name":"BbTableRowClasses","usage":"api","component":"BbTable","usedBy":[{"component":"BbTable","surface":"prop","name":"rowClass"}],"definition":"type BbTableRowClasses<Item = any> = Classes | ((item: Item) => Classes | undefined);"},
|
|
30
30
|
{"name":"BbTableSortEntry","usage":"api","component":"BbTable","usedBy":[{"component":"BbTable","surface":"prop","name":"sort"},{"component":"BbTable","surface":"event","name":"update:sort"}],"definition":"type BbTableSortEntry = [ key: string, direction: 'asc' | 'desc' ];"},
|
|
@@ -804,7 +804,7 @@ const shortDate = (value: string) =>
|
|
|
804
804
|
|
|
805
805
|
const columns = [
|
|
806
806
|
{ key: 'receipt', label: 'Receipt', width: 48 },
|
|
807
|
-
{ key: 'merchant', label: 'Merchant' },
|
|
807
|
+
{ key: 'merchant', label: 'Merchant', rowHeader: true },
|
|
808
808
|
{ key: 'submitter.name', label: 'Submitter' },
|
|
809
809
|
{ key: 'category', label: 'Category' },
|
|
810
810
|
{
|
|
@@ -808,7 +808,7 @@ const shortDate = (value: string) =>
|
|
|
808
808
|
|
|
809
809
|
const columns = [
|
|
810
810
|
{ key: 'receipt', label: 'Receipt', width: 48 },
|
|
811
|
-
{ key: 'merchant', label: 'Merchant' },
|
|
811
|
+
{ key: 'merchant', label: 'Merchant', rowHeader: true },
|
|
812
812
|
{ key: 'submitter.name', label: 'Submitter' },
|
|
813
813
|
{ key: 'category', label: 'Category' },
|
|
814
814
|
{
|
|
@@ -740,7 +740,7 @@ const shortDate = (value: string) =>
|
|
|
740
740
|
|
|
741
741
|
const columns = [
|
|
742
742
|
{ key: 'receipt', label: 'Receipt', width: 48 },
|
|
743
|
-
{ key: 'merchant', label: 'Merchant' },
|
|
743
|
+
{ key: 'merchant', label: 'Merchant', rowHeader: true },
|
|
744
744
|
{ key: 'submitter.name', label: 'Submitter' },
|
|
745
745
|
{ key: 'category', label: 'Category' },
|
|
746
746
|
{
|
|
@@ -322,10 +322,9 @@ export type BbBadgeProps = {
|
|
|
322
322
|
size?: keyof Sizes;
|
|
323
323
|
/**
|
|
324
324
|
* Visual variant: `primary`, `secondary`, `destructive`, or `outline`.
|
|
325
|
-
*
|
|
326
|
-
*
|
|
327
|
-
*
|
|
328
|
-
* `--fg` on the element.
|
|
325
|
+
* Status colours are a registration (vite plugin `badgeVariants`, the
|
|
326
|
+
* `soft-*` palette in design-language.md) styled as `.bb-badge--<variant>`.
|
|
327
|
+
* `'none'` renders no variant class: set `--bg` / `--fg` on the element.
|
|
329
328
|
* @defaultValue `'primary'`
|
|
330
329
|
*/
|
|
331
330
|
variant?: BadgeVariantType;
|
|
@@ -197,10 +197,9 @@ export type BbBadgeProps = {
|
|
|
197
197
|
size?: keyof Sizes;
|
|
198
198
|
/**
|
|
199
199
|
* Visual variant: `primary`, `secondary`, `destructive`, or `outline`.
|
|
200
|
-
*
|
|
201
|
-
*
|
|
202
|
-
*
|
|
203
|
-
* `--fg` on the element.
|
|
200
|
+
* Status colours are a registration (vite plugin `badgeVariants`, the
|
|
201
|
+
* `soft-*` palette in design-language.md) styled as `.bb-badge--<variant>`.
|
|
202
|
+
* `'none'` renders no variant class: set `--bg` / `--fg` on the element.
|
|
204
203
|
* @defaultValue `'primary'`
|
|
205
204
|
*/
|
|
206
205
|
variant?: BadgeVariantType;
|
|
@@ -1260,7 +1260,9 @@ export type BbColorPaletteProps = {
|
|
|
1260
1260
|
*/
|
|
1261
1261
|
anchor?: ElementOrComponentRef;
|
|
1262
1262
|
/**
|
|
1263
|
-
* Constrains the popover within a bounding element
|
|
1263
|
+
* Constrains the popover within a bounding element: it stays inside it
|
|
1264
|
+
* alongside its trigger (sideways for a popover above or below); away from
|
|
1265
|
+
* the trigger it may pass the edge, and it flips at the viewport only.
|
|
1264
1266
|
* Accepts an HTMLElement, a Vue component ref, or a CSS selector string.
|
|
1265
1267
|
*/
|
|
1266
1268
|
boundary?: ElementOrComponentRefOrSelector;
|