bitboss-ui 3.0.0-beta.26 → 3.0.0-beta.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/dist/ai/BbColorInput.md +5 -4
  2. package/dist/ai/BbColorPalette.md +20 -5
  3. package/dist/ai/BbDatePicker.md +29 -11
  4. package/dist/ai/BbDatePickerInput.md +4 -4
  5. package/dist/ai/BbSelect.md +4 -4
  6. package/dist/ai/BbSelectPopover.md +9 -8
  7. package/dist/ai/BbTimePicker.md +19 -4
  8. package/dist/ai/BbTimePickerInput.md +3 -2
  9. package/dist/ai/changelog.json +11 -3
  10. package/dist/ai/components.json +292 -41
  11. package/dist/ai/guides/passthrough.md +81 -63
  12. package/dist/ai/source/BbColorInput.md +6 -4
  13. package/dist/ai/source/BbColorPalette.md +198 -183
  14. package/dist/ai/source/BbDatePicker.md +347 -323
  15. package/dist/ai/source/BbDatePickerInput.md +2 -2
  16. package/dist/ai/source/BbSelect.md +2 -2
  17. package/dist/ai/source/BbSelectPopover.md +13 -1
  18. package/dist/ai/source/BbTimePicker.md +72 -44
  19. package/dist/ai/source/BbTimePickerInput.md +47 -25
  20. package/dist/ai/source/CommonTimeSelector.md +1 -1
  21. package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +8 -0
  22. package/dist/components/BbColorInput/types.d.ts +5 -4
  23. package/dist/components/BbColorInput/types.js +1 -0
  24. package/dist/components/BbColorPalette/BbColorPalette.vue_vue_type_script_setup_true_lang.js +217 -216
  25. package/dist/components/BbColorPalette/types.d.ts +3 -3
  26. package/dist/components/BbColorPalette/types.js +1 -0
  27. package/dist/components/BbDatePicker/BbDatePicker.vue_vue_type_script_setup_true_lang.js +241 -229
  28. package/dist/components/BbDatePicker/types.d.ts +3 -3
  29. package/dist/components/BbDatePicker/types.js +1 -0
  30. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +1 -1
  31. package/dist/components/BbDatePickerInput/types.d.ts +1 -1
  32. package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +1 -1
  33. package/dist/components/BbSelect/types.d.ts +1 -1
  34. package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +69 -63
  35. package/dist/components/BbSelectPopover/types.d.ts +3 -3
  36. package/dist/components/BbSelectPopover/types.js +1 -0
  37. package/dist/components/BbTimePicker/BbTimePicker.vue_vue_type_script_setup_true_lang.js +123 -118
  38. package/dist/components/BbTimePicker/types.d.ts +3 -3
  39. package/dist/components/BbTimePicker/types.js +1 -0
  40. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +230 -226
  41. package/dist/components/BbTimePickerInput/types.d.ts +1 -1
  42. package/dist/llms-full.txt +174 -105
  43. package/dist/styles.css +1 -1
  44. package/dist/validated/BbColorInput.vue_vue_type_script_setup_true_lang.js +7 -0
  45. package/package.json +1 -1
@@ -14,6 +14,7 @@
14
14
 
15
15
  | pt part | Lands on | In |
16
16
  | --- | --- | --- |
17
+ | `pt:panel` | `pt:panel` of `BbColorPalette` | `BbColorPalette` ([contract](./BbColorPalette.md)) |
17
18
  | `pt:sheet` | `pt:sheet` of `BbColorPalette` | `BbColorPalette` ([contract](./BbColorPalette.md)) |
18
19
  | `pt:swatch` | `pt:swatch` of `BbColorPalette` | `BbColorPalette` ([contract](./BbColorPalette.md)) |
19
20
  | `pt:root` | `div.bb-field` | `CommonField` _(internal)_ |
@@ -504,7 +505,7 @@ the `BbTextInput` guide.
504
505
 
505
506
  `pt` reaches a named part of the control with a class list — or, in the
506
507
  object form, a style and attributes — optionally only while a state is on.
507
- Parts: `root` (the container), `label`, `description`, `message` (the errors / warnings region — one node each, only one ever shows), `hint` (the helper line — shown on focus, or always with `persistent-hint`), `box` (the bordered field box), `input` (the native control), `icon` (`prepend:icon` + `append:icon` — a broadcast; the state glyphs are chrome), `spinner` (the spinner shown while `loading`), `prefix`, `suffix`, `clear` (the ✕ that empties the field). Plus `indicator` (the colour dot that opens the palette), `sheet` (the bottom sheet the color palette opens in on a phone — no node on desktop) and `swatch` (one palette swatch, after the `swatches` prop — a broadcast).
508
+ Parts: `root` (the container), `label`, `description`, `message` (the errors / warnings region — one node each, only one ever shows), `hint` (the helper line — shown on focus, or always with `persistent-hint`), `box` (the bordered field box), `input` (the native control), `icon` (`prepend:icon` + `append:icon` — a broadcast; the state glyphs are chrome), `spinner` (the spinner shown while `loading`), `prefix`, `suffix`, `clear` (the ✕ that empties the field). Plus `indicator` (the colour dot that opens the palette), `panel` (the palette box — the popover's painted bubble on desktop, the box inside the sheet on a phone), `sheet` (the bottom sheet the color palette opens in on a phone — no node on desktop) and `swatch` (one palette swatch, after the `swatches` prop — a broadcast).
508
509
  States: `errors`, `warnings` (never beside errors), `loading`, `disabled`, `readonly`, `has-value` (written `pt:box:has-value`), on every part; plus `selected` on `swatch` only — the swatch matching the value (`pt:swatch:selected`). A name outside that list is a type error and an
509
510
  ESLint error.
510
511
 
@@ -663,7 +664,7 @@ of it. The full grammar, the merge rules and the global map are in the
663
664
 
664
665
  | Prop | Type | Default | Required | Description |
665
666
  | --- | --- | --- | --- | --- |
666
- | `pt:<part>`, `pt:<part>:<state>`, `pt` | `PtValue` | | | Passthrough — a class list, or `{ class, style, attrs }`, bound to one named part of the component; the state form applies only while that state is on. Parts: `box`, `clear`, `description`, `hint`, `icon`, `indicator`, `input`, `label`, `message`, `prefix`, `root`, `sheet`, `spinner`, `suffix`, `swatch`. States: `disabled`, `errors`, `has-value`, `loading`, `readonly`, `warnings`, `selected`. `pt` is the object form with the same keys minus the prefix (`{ icon: '…', 'icon:loading': '…' }`). See `guides/passthrough.md`. |
667
+ | `pt:<part>`, `pt:<part>:<state>`, `pt` | `PtValue` | | | Passthrough — a class list, or `{ class, style, attrs }`, bound to one named part of the component; the state form applies only while that state is on. Parts: `box`, `clear`, `description`, `hint`, `icon`, `indicator`, `input`, `label`, `message`, `panel`, `prefix`, `root`, `sheet`, `spinner`, `suffix`, `swatch`. States: `disabled`, `errors`, `has-value`, `loading`, `readonly`, `warnings`, `selected`. `pt` is the object form with the same keys minus the prefix (`{ icon: '…', 'icon:loading': '…' }`). See `guides/passthrough.md`. |
667
668
  | `adaptive` | `boolean \| undefined` | ``config.adaptive` (`true`)` | | When `true`, the color palette opens as a bottom off-canvas sheet on mobile viewports instead of a floating popover; on desktop it stays a popover. Mirrors the adaptive behaviour of `BbSelect`/`BbDatePickerInput`. When unset, falls back to … |
668
669
  | `alpha` | `boolean \| undefined` | `false` | | Enable the alpha channel. Shows an opacity slider and uses `#RRGGBBAA` hex8 format. |
669
670
  | `append:icon` | `string \| undefined` | | | Name of the icon to be added at the end of the input. |
@@ -757,10 +758,10 @@ Set these on the element, or on a class you put on it, to retune this component
757
758
  - **CSS custom properties** listed on a node are declared on THAT node's root and read by elements inside it. Set one on that node's root or on the element inside it that reads it — the pt part that lands there is how you reach it (`pt:box="[--border-color:…]"` on a text input) — never on `BbColorInput`'s root, where the node's own declaration masks it (design-tokens guide, _Overriding one from a consumer app_, rule 0).
758
759
  - Listed nodes are the ones `BbColorInput`'s API reaches or that declare a documented CSS variable; the rest fold into "also mounts". The complete tree, repeats and undocumented locals included, is the `tree` field of this component in `components.json`.
759
760
 
760
- - `BbColorInput` _(this component)_ — its own template binds: `controlAttrs` → `input.bb-color-input__input`, `input` → `input.bb-color-input__input`, `indicator` → `button.bb-color-input__indicator`, `suffix` → `span.bb-field-input__suffix`; hands `BbColorPalette` the pt map `{ sheet: 'sheet', swatch: 'swatch' }` (ours → theirs)
761
+ - `BbColorInput` _(this component)_ — its own template binds: `controlAttrs` → `input.bb-color-input__input`, `input` → `input.bb-color-input__input`, `indicator` → `button.bb-color-input__indicator`, `suffix` → `span.bb-field-input__suffix`; hands `BbColorPalette` the pt map `{ panel: 'panel', sheet: 'sheet', swatch: 'swatch' }` (ours → theirs)
761
762
  - `CommonField` _(internal — not importable, reach it through `BbColorInput`)_ — `BbColorInput`'s pt parts land here: `root` → `div.bb-field`, `label` → `component`, `description` → `span.bb-field__description`, `hint` → `span.bb-field__hint-text`, `message` → `div.bb-field__errors`, `message` → `div.bb-field__warnings`
762
763
  - `CommonFieldInput` _(internal — not importable, reach it through `BbColorInput`)_ — `BbColorInput`'s pt parts land here: `box` → `span.bb-field-input__box`, `prefix` → `span.bb-field-input__prefix`, `icon` → `BbIcon`, `clear` → `ClearableButton`, `spinner` → `BbSpinner`, `suffix` → `span.bb-field-input__suffix`; documented CSS variables: `--bg`, `--bg-hover`, `--bg-focus`, `--bg-disabled`, `--border-color`, `--border-focus`, `--ring-size`, `--ring-color`, `--elev`, `--frost`, `--inside-label-clearance`; also mounts `ErrorIcon`, `WarningIcon`, `ClearableButton`, `BbIcon`, `BbSpinner`
763
- - `BbColorPalette` _(public — [contract](./BbColorPalette.md))_ — its own pt parts (`BbColorPalette`): `root` → `div.bb-color-palette__picker`, `swatch` → `button.bb-color-palette__swatch`; hands `BbOffCanvas` the pt map `{ sheet: 'root' }` (ours → theirs); also mounts `CommonPopover`
764
+ - `BbColorPalette` _(public — [contract](./BbColorPalette.md))_ — its own pt parts (`BbColorPalette`): `swatch` → `button.bb-color-palette__swatch`, `root` → `BbOffCanvas`, `panel` → `div`, `panel` → `CommonPopover`, `root` → `CommonPopover`; hands `BbOffCanvas` the pt map `{ sheet: 'root' }` (ours → theirs); also mounts `CommonPopover`
764
765
  - `BbOffCanvas` _(public — [contract](./BbOffCanvas.md))_ — its own pt parts (`BbOffCanvas`): `header` → `div.bb-offcanvas__header`, `title` → `span.bb-offcanvas__title`, `description` → `p.bb-offcanvas__description`, `close` → `CloseButton`, `content` → `div.bb-offcanvas__body`, `footer` → `div.bb-offcanvas__footer`; documented CSS variables: `--stack-x`, `--stack-fill`, `--stack-transition-duration`, `--px`, `--close-size`
765
766
  - `CloseButton` _(internal — not importable, reach it through `BbOffCanvas`)_ — documented CSS variables: `--size`, `--p`
766
767
 
@@ -14,8 +14,21 @@
14
14
 
15
15
  | pt part | Lands on | In |
16
16
  | --- | --- | --- |
17
+ | `pt:root` | the root of `BbOffCanvas` | `BbOffCanvas` ([contract](./BbOffCanvas.md)) |
18
+ | `pt:panel` | the root of `CommonPopover` | `CommonPopover` _(internal)_ |
19
+ | `pt:root` | the root of `CommonPopover` | `CommonPopover` _(internal)_ |
17
20
  | `pt:sheet` | `pt:root` of `BbOffCanvas` | `BbOffCanvas` ([contract](./BbOffCanvas.md)) |
18
21
 
22
+ **CSS variables you can set through those parts** — declared deeper in the tree, so set one on the part that reads it (`pt:<part>="[--name:value]"`), never on `BbColorPalette`'s root:
23
+
24
+ | Variable | Set through | Declared by | What it is |
25
+ | --- | --- | --- | --- |
26
+ | `--stack-x` | `pt:root` | `BbOffCanvas` | Inward shift applied to a parent panel while a child is stacked on top. |
27
+ | `--stack-fill` | `pt:root` | `BbOffCanvas` | Length of the pad (see `::after`) that fills from the panel's anchored edge out to the screen edge, so no empty band shows when a descendant is dragged away or shrinks. |
28
+ | `--stack-transition-duration` | `pt:root` | `BbOffCanvas` | Duration for the stack shift + pad. Zeroed while a peer resizes so parents track the live size instead of lagging behind a 250ms animation. |
29
+ | `--px` | `pt:root` | `BbOffCanvas` | Axis split of --bb-panel-p: --px (inline) / --py (block), each branching off it. Set the pair only when the axes differ; setting --bb-panel-p alone keeps them equal. Local on this root class (not :roo… |
30
+ | `--close-size` | `pt:root` | `BbOffCanvas` | Shared by the close control and by the space the title reserves for it, * so the two can never drift apart. |
31
+
19
32
  ## Usage & Guidelines
20
33
 
21
34
  ### When to use
@@ -556,9 +569,11 @@ styling (a caret, a highlight). Two props gate interaction:
556
569
 
557
570
  `pt` reaches a named part with a class list — or, in the object form, a
558
571
  style and attributes — optionally only while a state is on. Parts: `root`
559
- (the palette — canvas, sliders, swatches; the same node in the popover and in
560
- the sheet), `sheet` (the bottom sheet around it on a phone — no node on
561
- desktop) and `swatch` (one swatch, named after the `swatches` prop — a
572
+ (the floating element — the bottom sheet on a phone), `panel` (the palette box you
573
+ see: the popover's painted bubble on desktop, the box inside the sheet on a
574
+ phone — canvas, sliders, swatches; `pt:panel="px-1"`
575
+ tightens its padding), `sheet` (the bottom sheet on a phone only, applied
576
+ after `root`) and `swatch` (one swatch, named after the `swatches` prop — a
562
577
  broadcast). States: `open`, and
563
578
  `selected` per swatch (the one matching the value). The canvas and the sliders
564
579
  are not parts.
@@ -733,7 +748,7 @@ The full grammar, the merge rules and the global map are in the
733
748
 
734
749
  | Prop | Type | Default | Required | Description |
735
750
  | --- | --- | --- | --- | --- |
736
- | `pt:<part>`, `pt:<part>:<state>`, `pt` | `PtValue` | | | Passthrough — a class list, or `{ class, style, attrs }`, bound to one named part of the component; the state form applies only while that state is on. Parts: `root`, `sheet`, `swatch`. States: `open`, `selected`. `pt` is the object form with the same keys minus the prefix (`{ icon: '…', 'icon:loading': '…' }`). See `guides/passthrough.md`. |
751
+ | `pt:<part>`, `pt:<part>:<state>`, `pt` | `PtValue` | | | Passthrough — a class list, or `{ class, style, attrs }`, bound to one named part of the component; the state form applies only while that state is on. Parts: `panel`, `root`, `sheet`, `swatch`. States: `open`, `selected`. `pt` is the object form with the same keys minus the prefix (`{ icon: '…', 'icon:loading': '…' }`). See `guides/passthrough.md`. |
737
752
  | `activator` | `ElementOrComponentRef \| undefined` | | | External activator element or component ref. When provided, the `activator` slot is not rendered and click listeners are attached programmatically to the referenced element — mirroring the BbDropdown activator API. |
738
753
  | `adaptive` | `boolean \| undefined` | ``config.adaptive` (`true`)` | | When `true`, the palette opens as a bottom off-canvas sheet on mobile viewports instead of a floating popover; on desktop it stays a popover. Mirrors the adaptive behaviour of `BbPopover`/`BbDropdown`/`BbDatePicker`. When unset, falls back … |
739
754
  | `alpha` | `boolean \| undefined` | `false` | | Enable the alpha channel. The picker shows an opacity slider and emits `#RRGGBBAA` hex8 values. |
@@ -774,7 +789,7 @@ The full grammar, the merge rules and the global map are in the
774
789
  - **CSS custom properties** listed on a node are declared on THAT node's root and read by elements inside it. Set one on that node's root or on the element inside it that reads it — the pt part that lands there is how you reach it (`pt:box="[--border-color:…]"` on a text input) — never on `BbColorPalette`'s root, where the node's own declaration masks it (design-tokens guide, _Overriding one from a consumer app_, rule 0).
775
790
  - Listed nodes are the ones `BbColorPalette`'s API reaches or that declare a documented CSS variable; the rest fold into "also mounts". The complete tree, repeats and undocumented locals included, is the `tree` field of this component in `components.json`.
776
791
 
777
- - `BbColorPalette` _(this component)_ — its own template binds: `root` → `div.bb-color-palette__picker`, `swatch` → `button.bb-color-palette__swatch`; hands `BbOffCanvas` the pt map `{ sheet: 'root' }` (ours → theirs)
792
+ - `BbColorPalette` _(this component)_ — its own template binds: `swatch` → `button.bb-color-palette__swatch`, `root` → `BbOffCanvas`, `panel` → `div`, `panel` → `CommonPopover`, `root` → `CommonPopover`; hands `BbOffCanvas` the pt map `{ sheet: 'root' }` (ours → theirs)
778
793
  - `BbOffCanvas` _(public — [contract](./BbOffCanvas.md))_ — its own pt parts (`BbOffCanvas`): `header` → `div.bb-offcanvas__header`, `title` → `span.bb-offcanvas__title`, `description` → `p.bb-offcanvas__description`, `close` → `CloseButton`, `content` → `div.bb-offcanvas__body`, `footer` → `div.bb-offcanvas__footer`; documented CSS variables: `--stack-x`, `--stack-fill`, `--stack-transition-duration`, `--px`, `--close-size`
779
794
  - `CloseButton` _(internal — not importable, reach it through `BbOffCanvas`)_ — documented CSS variables: `--size`, `--p`
780
795
  - Also mounts `CommonPopover`
@@ -17,8 +17,21 @@
17
17
  | `pt:arrow` | the root of `BbBaseButton` | `BbBaseButton` ([contract](./BbBaseButton.md)) |
18
18
  | `pt:month` | the root of `BbBaseButton` | `BbBaseButton` ([contract](./BbBaseButton.md)) |
19
19
  | `pt:year` | the root of `BbBaseButton` | `BbBaseButton` ([contract](./BbBaseButton.md)) |
20
+ | `pt:root` | the root of `BbOffCanvas` | `BbOffCanvas` ([contract](./BbOffCanvas.md)) |
21
+ | `pt:panel` | the root of `CommonPopover` | `CommonPopover` _(internal)_ |
22
+ | `pt:root` | the root of `CommonPopover` | `CommonPopover` _(internal)_ |
20
23
  | `pt:sheet` | `pt:root` of `BbOffCanvas` | `BbOffCanvas` ([contract](./BbOffCanvas.md)) |
21
24
 
25
+ **CSS variables you can set through those parts** — declared deeper in the tree, so set one on the part that reads it (`pt:<part>="[--name:value]"`), never on `BbDatePicker`'s root:
26
+
27
+ | Variable | Set through | Declared by | What it is |
28
+ | --- | --- | --- | --- |
29
+ | `--stack-x` | `pt:root` | `BbOffCanvas` | Inward shift applied to a parent panel while a child is stacked on top. |
30
+ | `--stack-fill` | `pt:root` | `BbOffCanvas` | Length of the pad (see `::after`) that fills from the panel's anchored edge out to the screen edge, so no empty band shows when a descendant is dragged away or shrinks. |
31
+ | `--stack-transition-duration` | `pt:root` | `BbOffCanvas` | Duration for the stack shift + pad. Zeroed while a peer resizes so parents track the live size instead of lagging behind a 250ms animation. |
32
+ | `--px` | `pt:root` | `BbOffCanvas` | Axis split of --bb-panel-p: --px (inline) / --py (block), each branching off it. Set the pair only when the axes differ; setting --bb-panel-p alone keeps them equal. Local on this root class (not :roo… |
33
+ | `--close-size` | `pt:root` | `BbOffCanvas` | Shared by the close control and by the space the title reserves for it, * so the two can never drift apart. |
34
+
22
35
  ## Usage & Guidelines
23
36
 
24
37
  ### When to use
@@ -252,8 +265,11 @@ into, `BbDatePickerInput` when there is.
252
265
 
253
266
  `pt` reaches a named part with a class list — or, in the object form, a
254
267
  style and attributes — optionally only while a state is on. Parts: `root`
255
- (the calendar panel, in the popover and in the sheet alike), `sheet` (the
256
- bottom sheet around it on a phone — no node on desktop), `header` (the
268
+ (the floating element — the bottom sheet on a phone), `panel` (the calendar box you
269
+ see: the popover's painted bubble on desktop, the box inside the sheet on a
270
+ phone — it also carries the sizing tokens, so
271
+ `pt:panel="[--pad-x:2px]"` tightens the padding and the grid width follows), `sheet` (the
272
+ bottom sheet on a phone only, applied after `root`), `header` (the
257
273
  navigation bar), `arrow` (the previous / next buttons), `month` and `year`
258
274
  (the heading buttons), `column-header` (each weekday letter), `day` (one whole
259
275
  day cell) and `day-button` (the button inside it), `month-item` and
@@ -355,7 +371,7 @@ and digit typeahead; the time rail exposes labelled columns. Always pass a
355
371
 
356
372
  | Prop | Type | Default | Required | Description |
357
373
  | --- | --- | --- | --- | --- |
358
- | `pt:<part>`, `pt:<part>:<state>`, `pt` | `PtValue` | | | Passthrough — a class list, or `{ class, style, attrs }`, bound to one named part of the component; the state form applies only while that state is on. Parts: `arrow`, `column-header`, `day`, `day-button`, `header`, `month`, `month-item`, `root`, `sheet`, `year`, `year-item`. States: `active`, `disabled`, `highlighted`, `in-range`, `open`, `outside`, `range-end`, `range-start`, `selected`, `today`. `pt` is the object form with the same keys minus the prefix (`{ icon: '…', 'icon:loading': '…' }`). See `guides/passthrough.md`. |
374
+ | `pt:<part>`, `pt:<part>:<state>`, `pt` | `PtValue` | | | Passthrough — a class list, or `{ class, style, attrs }`, bound to one named part of the component; the state form applies only while that state is on. Parts: `arrow`, `column-header`, `day`, `day-button`, `header`, `month`, `month-item`, `panel`, `root`, `sheet`, `year`, `year-item`. States: `active`, `disabled`, `highlighted`, `in-range`, `open`, `outside`, `range-end`, `range-start`, `selected`, `today`. `pt` is the object form with the same keys minus the prefix (`{ icon: '…', 'icon:loading': '…' }`). See `guides/passthrough.md`. |
359
375
  | `activator` | `ElementOrComponentRef \| undefined` | | | External activator element or component ref. When provided, the `activator` slot is not rendered and click + ARIA are attached programmatically to the referenced element — mirroring the `BbColorPalette` activator API. |
360
376
  | `activeSegment` | `BbDatePickerSegment \| undefined` | | | Which end the time rail edits in range + `type="datetime"` (`v-model:active-segment`). Standalone use manages this internally; an embedding host (the date input) drives it from its focused field. Ignored outside range + datetime. |
361
377
  | `adaptive` | `boolean \| undefined` | ``config.adaptive` (`true`)` | | On mobile, open in a bottom off-canvas sheet instead of a floating popover. When unset, falls back to the global `config.adaptive`. |
@@ -410,14 +426,16 @@ Set these on the element, or on a class you put on it, to retune this component
410
426
 
411
427
  | Property | Set on | Default | What it is |
412
428
  | --- | --- | --- | --- |
413
- | `--cell` | `.bb-date-picker__grid` | `28px` | Cell size drives all grid math: 224px ÷ 7 = 32px exactly |
414
- | `--pad-x` | `.bb-date-picker__grid` | `6px` | |
415
- | `--pad-y` | `.bb-date-picker__grid` | `8px` | |
416
- | `--nav-button-h` | `.bb-date-picker__grid` | `24px` | |
429
+ | `--cell` | `.bb-date-picker__panel` | `28px` | Cell size drives all grid math: 224px ÷ 7 = 32px exactly |
430
+ | `--pad-x` | `.bb-date-picker__panel` | `6px` | |
431
+ | `--pad-y` | `.bb-date-picker__panel` | `8px` | |
432
+ | `--nav-button-h` | `.bb-date-picker__panel` | `24px` | |
433
+ | `--day-slot-allowance` | `.bb-date-picker__panel` | `0px` | Allowance for the day slot append area - needed for the slot to be visible |
434
+ | `--unit-row` | `.bb-date-picker__panel` | `calc(var(--cell) * 1.25)` | Row pitch for the coarse grids (month/year), where a "row" is one of four month rows rather than a week. Roomier than --cell because twelve months in a 4×3 grid have space the 6×7 day grid does not. |
417
435
  | `--weeks` | `.bb-date-picker__grid` | `6` | |
418
- | `--day-slot-allowance` | `.bb-date-picker__grid` | `0px` | Allowance for the day slot append area - needed for the slot to be visible |
419
- | `--unit-row` | `.bb-date-picker__grid` | `calc(var(--cell) * 1.25)` | Row pitch for the coarse grids (month/year), where a "row" is one of four month rows rather than a week. Roomier than --cell because twelve months in a 4×3 grid have space the 6×7 day grid does not. |
420
- | `--sheet-cell` | `.bb-date-picker__calendar--sheet` | `40px` | Declared on the container so the time rail (the calendar's sibling) can align its wheels to the same column grid. |
436
+ | `--sheet-cell` | `.bb-date-picker__panel--sheet` | `40px` | Declared on the container so the time rail (the calendar's sibling) can align its wheels to the same column grid. |
437
+ | `--cell` | `.bb-date-picker__panel--sheet` | `var(--sheet-cell)` | One touch scale for the whole sheet: 40px day cells (36px marks), and a nav row to match — on the panel, where the tokens live. |
438
+ | `--nav-button-h` | `.bb-date-picker__panel--sheet` | `40px` | |
421
439
 
422
440
  ## Component tree
423
441
 
@@ -428,7 +446,7 @@ Set these on the element, or on a class you put on it, to retune this component
428
446
  - **CSS custom properties** listed on a node are declared on THAT node's root and read by elements inside it. Set one on that node's root or on the element inside it that reads it — the pt part that lands there is how you reach it (`pt:box="[--border-color:…]"` on a text input) — never on `BbDatePicker`'s root, where the node's own declaration masks it (design-tokens guide, _Overriding one from a consumer app_, rule 0).
429
447
  - Listed nodes are the ones `BbDatePicker`'s API reaches or that declare a documented CSS variable; the rest fold into "also mounts". The complete tree, repeats and undocumented locals included, is the `tree` field of this component in `components.json`.
430
448
 
431
- - `BbDatePicker` _(this component)_ — its own template binds: `root` → `div.bb-date-picker__calendar`, `header` → `div.bb-date-picker__controls`, `arrow` → `BbBaseButton`, `month` → `BbBaseButton`, `year` → `BbBaseButton`, `day` → `div.bb-date-picker__date`, `day-button` → `button.bb-date-picker__date-button`; hands `BbOffCanvas` the pt map `{ sheet: 'root' }` (ours → theirs)
449
+ - `BbDatePicker` _(this component)_ — its own template binds: `header` → `div.bb-date-picker__controls`, `arrow` → `BbBaseButton`, `month` → `BbBaseButton`, `year` → `BbBaseButton`, `day` → `div.bb-date-picker__date`, `day-button` → `button.bb-date-picker__date-button`, `root` → `BbOffCanvas`, `panel` → `div`, `panel` → `CommonPopover`, `root` → `CommonPopover`; hands `BbOffCanvas` the pt map `{ sheet: 'root' }` (ours → theirs)
432
450
  - `BbBaseButton` _(public — [contract](./BbBaseButton.md))_ — its own pt parts (`BbBaseButton`): `root` → `RouterComponent`, `root` → `a`, `root` → `component`; also mounts `RouterComponent`
433
451
  - `CommonTimeSelector` _(internal — not importable, reach it through `BbDatePicker`)_ — documented CSS variables: `--time-mark`; also mounts `BbBaseButton`
434
452
  - `BbOffCanvas` _(public — [contract](./BbOffCanvas.md))_ — its own pt parts (`BbOffCanvas`): `header` → `div.bb-offcanvas__header`, `title` → `span.bb-offcanvas__title`, `description` → `p.bb-offcanvas__description`, `close` → `CloseButton`, `content` → `div.bb-offcanvas__body`, `footer` → `div.bb-offcanvas__footer`; documented CSS variables: `--stack-x`, `--stack-fill`, `--stack-transition-duration`, `--px`, `--close-size`
@@ -14,7 +14,7 @@
14
14
 
15
15
  | pt part | Lands on | In |
16
16
  | --- | --- | --- |
17
- | `pt:panel` | `pt:root` of `BbDatePicker` | `BbDatePicker` ([contract](./BbDatePicker.md)) |
17
+ | `pt:panel` | `pt:panel` of `BbDatePicker` | `BbDatePicker` ([contract](./BbDatePicker.md)) |
18
18
  | `pt:sheet` | `pt:sheet` of `BbDatePicker` | `BbDatePicker` ([contract](./BbDatePicker.md)) |
19
19
  | `pt:header` | `pt:header` of `BbDatePicker` | `BbDatePicker` ([contract](./BbDatePicker.md)) |
20
20
  | `pt:arrow` | `pt:arrow` of `BbDatePicker` | `BbDatePicker` ([contract](./BbDatePicker.md)) |
@@ -707,7 +707,7 @@ the `BbTextInput` guide.
707
707
 
708
708
  `pt` reaches a named part of the control with a class list — or, in the
709
709
  object form, a style and attributes — optionally only while a state is on.
710
- Parts: `root` (the container), `label`, `description`, `message` (the errors / warnings region — one node each, only one ever shows), `hint` (the helper line — shown on focus, or always with `persistent-hint`), `box` (the bordered field box), `input` (the native control), `icon` (`prepend:icon` + `append:icon` — a broadcast; the state glyphs are chrome), `spinner` (the spinner shown while `loading`), `prefix`, `suffix`, `clear` (the ✕ that empties the field). Plus `panel` (the calendar, in the popover and in the sheet alike), `sheet` (the bottom sheet around it on a phone only) and the calendar's own parts, forwarded to it: `header`, `arrow`, `month`, `year`, `column-header`, `day` (the whole cell), `day-button` (the mark inside it), `month-item` and `year-item` — the `BbDatePicker` guide describes each node. `input` is every segment field; the calendar trigger is chrome.
710
+ Parts: `root` (the container), `label`, `description`, `message` (the errors / warnings region — one node each, only one ever shows), `hint` (the helper line — shown on focus, or always with `persistent-hint`), `box` (the bordered field box), `input` (the native control), `icon` (`prepend:icon` + `append:icon` — a broadcast; the state glyphs are chrome), `spinner` (the spinner shown while `loading`), `prefix`, `suffix`, `clear` (the ✕ that empties the field). Plus `panel` (the calendar box you see — the popover's painted bubble on desktop, the box inside the sheet on a phone; it carries the sizing tokens, so `pt:panel="[--pad-x:2px]"` tightens it), `sheet` (the bottom sheet on a phone only) and the calendar's own parts, forwarded to it: `header`, `arrow`, `month`, `year`, `column-header`, `day` (the whole cell), `day-button` (the mark inside it), `month-item` and `year-item` — the `BbDatePicker` guide describes each node. `input` is every segment field; the calendar trigger is chrome.
711
711
  States: `errors`, `warnings` (never beside errors), `loading`, `disabled`, `readonly`, `has-value` (written `pt:box:has-value`). Plus `open` (the calendar is showing), and the calendar's per-node states: `selected`, `disabled`, `today`, `outside`, `range-start` / `range-end` / `in-range` and `highlighted` on the cells, `active` on `month` / `year`. A name outside that list is a type error and an
712
712
  ESLint error.
713
713
 
@@ -942,8 +942,8 @@ Set these on the element, or on a class you put on it, to retune this component
942
942
  - **CSS custom properties** listed on a node are declared on THAT node's root and read by elements inside it. Set one on that node's root or on the element inside it that reads it — the pt part that lands there is how you reach it (`pt:box="[--border-color:…]"` on a text input) — never on `BbDatePickerInput`'s root, where the node's own declaration masks it (design-tokens guide, _Overriding one from a consumer app_, rule 0).
943
943
  - Listed nodes are the ones `BbDatePickerInput`'s API reaches or that declare a documented CSS variable; the rest fold into "also mounts". The complete tree, repeats and undocumented locals included, is the `tree` field of this component in `components.json`.
944
944
 
945
- - `BbDatePickerInput` _(this component)_ — its own template binds: `input` → `input.bb-segmented-field__field`, `suffix` → `span.bb-field-input__suffix`; hands `BbDatePicker` the pt map `{ panel: 'root', sheet: 'sheet', header: 'header', arrow: 'arrow', month: 'month', year: 'year', 'column-header': 'column-header', day: 'day', 'day-button': 'day-button', 'month-item': 'month-item', 'year-item': 'year-item', }` (ours → theirs)
946
- - `BbDatePicker` _(public — [contract](./BbDatePicker.md))_ — its own pt parts (`BbDatePicker`): `root` → `div.bb-date-picker__calendar`, `header` → `div.bb-date-picker__controls`, `arrow` → `BbBaseButton`, `month` → `BbBaseButton`, `year` → `BbBaseButton`, `day` → `div.bb-date-picker__date`, `day-button` → `button.bb-date-picker__date-button`; hands `BbOffCanvas` the pt map `{ sheet: 'root' }` (ours → theirs); documented CSS variables: `--cell`, `--day-slot-allowance`, `--unit-row`, `--sheet-cell`; also mounts `CommonPopover`, `ScaleFade`, `Slide`, `DatePickerMonthPanel`, `DatePickerYearPanel`
945
+ - `BbDatePickerInput` _(this component)_ — its own template binds: `input` → `input.bb-segmented-field__field`, `suffix` → `span.bb-field-input__suffix`; hands `BbDatePicker` the pt map `{ panel: 'panel', sheet: 'sheet', header: 'header', arrow: 'arrow', month: 'month', year: 'year', 'column-header': 'column-header', day: 'day', 'day-button': 'day-button', 'month-item': 'month-item', 'year-item': 'year-item', }` (ours → theirs)
946
+ - `BbDatePicker` _(public — [contract](./BbDatePicker.md))_ — its own pt parts (`BbDatePicker`): `header` → `div.bb-date-picker__controls`, `arrow` → `BbBaseButton`, `month` → `BbBaseButton`, `year` → `BbBaseButton`, `day` → `div.bb-date-picker__date`, `day-button` → `button.bb-date-picker__date-button`, `root` → `BbOffCanvas`, `panel` → `div`, `panel` → `CommonPopover`, `root` → `CommonPopover`; hands `BbOffCanvas` the pt map `{ sheet: 'root' }` (ours → theirs); documented CSS variables: `--cell`, `--day-slot-allowance`, `--unit-row`, `--sheet-cell`, `--cell`; also mounts `CommonPopover`, `ScaleFade`, `Slide`, `DatePickerMonthPanel`, `DatePickerYearPanel`
947
947
  - `BbBaseButton` _(public — [contract](./BbBaseButton.md))_ — its own pt parts (`BbBaseButton`): `root` → `RouterComponent`, `root` → `a`, `root` → `component`; also mounts `RouterComponent`
948
948
  - `CommonTimeSelector` _(internal — not importable, reach it through `BbDatePicker`)_ — documented CSS variables: `--time-mark`; also mounts `BbBaseButton`
949
949
  - `BbOffCanvas` _(public — [contract](./BbOffCanvas.md))_ — its own pt parts (`BbOffCanvas`): `header` → `div.bb-offcanvas__header`, `title` → `span.bb-offcanvas__title`, `description` → `p.bb-offcanvas__description`, `close` → `CloseButton`, `content` → `div.bb-offcanvas__body`, `footer` → `div.bb-offcanvas__footer`; documented CSS variables: `--stack-x`, `--stack-fill`, `--stack-transition-duration`, `--px`, `--close-size`
@@ -14,7 +14,7 @@
14
14
 
15
15
  | pt part | Lands on | In |
16
16
  | --- | --- | --- |
17
- | `pt:panel` | `pt:root` of `BbSelectPopover` | `BbSelectPopover` ([contract](./BbSelectPopover.md)) |
17
+ | `pt:panel` | `pt:panel` of `BbSelectPopover` | `BbSelectPopover` ([contract](./BbSelectPopover.md)) |
18
18
  | `pt:sheet` | `pt:sheet` of `BbSelectPopover` | `BbSelectPopover` ([contract](./BbSelectPopover.md)) |
19
19
  | `pt:option` | `pt:option` of `BbSelectPopover` | `BbSelectPopover` ([contract](./BbSelectPopover.md)) |
20
20
  | `pt:item-text` | `pt:item-text` of `BbSelectPopover` | `BbSelectPopover` ([contract](./BbSelectPopover.md)) |
@@ -1576,7 +1576,7 @@ the `BbTextInput` guide.
1576
1576
 
1577
1577
  `pt` reaches a named part of the control with a class list — or, in the
1578
1578
  object form, a style and attributes — optionally only while a state is on.
1579
- Parts: `root` (the container), `label`, `description`, `message` (the errors / warnings region — one node each, only one ever shows), `hint` (the helper line — shown on focus, or always with `persistent-hint`), `box` (the bordered field box), `input` (the native control), `icon` (`prepend:icon` + `append:icon` — a broadcast; the state glyphs are chrome), `spinner` (the spinner shown while `loading`), `prefix`, `suffix`, `clear` (the ✕ that empties the field). Plus `panel` (the options surface — the sheet on mobile), `sheet` (that bottom sheet on a phone only, applied after `panel`) `option` (one listbox option, a broadcast), `item-text` (that option's label), `item-icon` (its `itemProps` prepend / append icons — never the field's `icon`) and `item-description` (its muted second line from `itemProps.description` — never the field's `description`), all with the option's `selected` / `disabled`; a custom `#option` slot replaces the label and description. `input` is the activator — the thing you act on to enter the value; the chevron and the clear ✕ are chrome.
1579
+ Parts: `root` (the container), `label`, `description`, `message` (the errors / warnings region — one node each, only one ever shows), `hint` (the helper line — shown on focus, or always with `persistent-hint`), `box` (the bordered field box), `input` (the native control), `icon` (`prepend:icon` + `append:icon` — a broadcast; the state glyphs are chrome), `spinner` (the spinner shown while `loading`), `prefix`, `suffix`, `clear` (the ✕ that empties the field). Plus `panel` (the options box you see — the popover's painted bubble on desktop, the box inside the sheet on a phone), `sheet` (the bottom sheet on a phone only), `option` (one listbox option, a broadcast), `item-text` (that option's label), `item-icon` (its `itemProps` prepend / append icons — never the field's `icon`) and `item-description` (its muted second line from `itemProps.description` — never the field's `description`), all with the option's `selected` / `disabled`; a custom `#option` slot replaces the label and description. `input` is the activator — the thing you act on to enter the value; the chevron and the clear ✕ are chrome.
1580
1580
  States: `errors`, `warnings` (never beside errors), `loading`, `disabled`, `readonly`, `has-value` (written `pt:box:has-value`). Plus `open` (the options surface is showing) and `selected`, resolved per option. A name outside that list is a type error and an
1581
1581
  ESLint error.
1582
1582
 
@@ -1863,11 +1863,11 @@ Set these on the element, or on a class you put on it, to retune this component
1863
1863
  - **CSS custom properties** listed on a node are declared on THAT node's root and read by elements inside it. Set one on that node's root or on the element inside it that reads it — the pt part that lands there is how you reach it (`pt:box="[--border-color:…]"` on a text input) — never on `BbSelect`'s root, where the node's own declaration masks it (design-tokens guide, _Overriding one from a consumer app_, rule 0).
1864
1864
  - Listed nodes are the ones `BbSelect`'s API reaches or that declare a documented CSS variable; the rest fold into "also mounts". The complete tree, repeats and undocumented locals included, is the `tree` field of this component in `components.json`.
1865
1865
 
1866
- - `BbSelect` _(this component)_ — its own template binds: `input` → `input.bb-select__activator`; hands `BbSelectPopover` the pt map `{ panel: 'root', sheet: 'sheet', option: 'option', 'item-text': 'item-text', 'item-icon': 'item-icon', 'item-description': 'item-description', }` (ours → theirs)
1866
+ - `BbSelect` _(this component)_ — its own template binds: `input` → `input.bb-select__activator`; hands `BbSelectPopover` the pt map `{ panel: 'panel', sheet: 'sheet', option: 'option', 'item-text': 'item-text', 'item-icon': 'item-icon', 'item-description': 'item-description', }` (ours → theirs)
1867
1867
  - `CommonField` _(internal — not importable, reach it through `BbSelect`)_ — `BbSelect`'s pt parts land here: `root` → `div.bb-field`, `label` → `component`, `description` → `span.bb-field__description`, `hint` → `span.bb-field__hint-text`, `message` → `div.bb-field__errors`, `message` → `div.bb-field__warnings`
1868
1868
  - `CommonFieldInput` _(internal — not importable, reach it through `BbSelect`)_ — `BbSelect`'s pt parts land here: `box` → `span.bb-field-input__box`, `prefix` → `span.bb-field-input__prefix`, `icon` → `BbIcon`, `clear` → `ClearableButton`, `spinner` → `BbSpinner`, `suffix` → `span.bb-field-input__suffix`; documented CSS variables: `--bg`, `--bg-hover`, `--bg-focus`, `--bg-disabled`, `--border-color`, `--border-focus`, `--ring-size`, `--ring-color`, `--elev`, `--frost`, `--inside-label-clearance`; also mounts `ErrorIcon`, `WarningIcon`, `ClearableButton`, `BbIcon`, `BbSpinner`
1869
1869
  - `BbBadge` _(public — [contract](./BbBadge.md))_ — its own pt parts (`BbBadge`): `spinner` → `BbSpinner`, `icon` → `BbIcon`, `clear` → `button.bb-badge__clear-button`; documented CSS variables: `--bg`, `--fg`, `--border-width`, `--ring`, `--min-size-md`, `--min-size`, `--elev`, `--radius`, `--font-size`, `--icon-size`, `--gap`, `--padding-inline`, `--clear-size`, `--pad-left`; also mounts `BbIcon`, `BbSpinner`, `BadgeBodyContent`
1870
- - `BbSelectPopover` _(public — [contract](./BbSelectPopover.md))_ — its own pt parts (`BbSelectPopover`): `input` → `input.bb-select-popover__search-input`, `clear` → `ClearableButton`, `root` → `BbOffCanvas`, `root` → `CommonPopover`, `header` → `div.bb-select-popover__header`, `footer` → `div.bb-select-popover__footer`; hands `BbOffCanvas` the pt map `{ header: 'header', footer: 'footer', sheet: 'root' }` (ours → theirs); also mounts `BbBadge`, `BbIcon`, `ClearableButton`, `CommonPopover`, `ErrorIcon`, `WarningIcon`, `BbSmoothHeight`
1870
+ - `BbSelectPopover` _(public — [contract](./BbSelectPopover.md))_ — its own pt parts (`BbSelectPopover`): `input` → `input.bb-select-popover__search-input`, `clear` → `ClearableButton`, `root` → `BbOffCanvas`, `panel` → `div.bb-select-popover`, `panel` → `CommonPopover`, `root` → `CommonPopover`, `header` → `div.bb-select-popover__header`, `footer` → `div.bb-select-popover__footer`; hands `BbOffCanvas` the pt map `{ header: 'header', footer: 'footer', sheet: 'root' }` (ours → theirs); also mounts `BbBadge`, `BbIcon`, `ClearableButton`, `CommonPopover`, `ErrorIcon`, `WarningIcon`, `BbSmoothHeight`
1871
1871
  - `BbOffCanvas` _(public — [contract](./BbOffCanvas.md))_ — its own pt parts (`BbOffCanvas`): `header` → `div.bb-offcanvas__header`, `title` → `span.bb-offcanvas__title`, `description` → `p.bb-offcanvas__description`, `close` → `CloseButton`, `content` → `div.bb-offcanvas__body`, `footer` → `div.bb-offcanvas__footer`; documented CSS variables: `--stack-x`, `--stack-fill`, `--stack-transition-duration`, `--px`, `--close-size`
1872
1872
  - `CloseButton` _(internal — not importable, reach it through `BbOffCanvas`)_ — documented CSS variables: `--size`, `--p`
1873
1873
  - `ListBox` _(internal — not importable, reach it through `BbSelectPopover`)_
@@ -16,6 +16,7 @@
16
16
  | --- | --- | --- |
17
17
  | `pt:clear` | the root of `ClearableButton` | `ClearableButton` _(internal)_ |
18
18
  | `pt:root` | the root of `BbOffCanvas` | `BbOffCanvas` ([contract](./BbOffCanvas.md)) |
19
+ | `pt:panel` | the root of `CommonPopover` | `CommonPopover` _(internal)_ |
19
20
  | `pt:root` | the root of `CommonPopover` | `CommonPopover` _(internal)_ |
20
21
  | `pt:header` | `pt:header` of `BbOffCanvas` | `BbOffCanvas` ([contract](./BbOffCanvas.md)) |
21
22
  | `pt:footer` | `pt:footer` of `BbOffCanvas` | `BbOffCanvas` ([contract](./BbOffCanvas.md)) |
@@ -1326,18 +1327,18 @@ floating popover everywhere.
1326
1327
 
1327
1328
  `pt` reaches a named part of the popover with a class list — or, in the
1328
1329
  object form, a style and attributes — optionally only while a state is on.
1329
- Parts: `root` (the flyout — the sheet on mobile), `sheet` (the bottom sheet the surface becomes on a phone — only that sheet, never the desktop surface; applied after `root`, so it wins a conflict there), `input` (the search
1330
+ Parts: `root` (the floating element — the sheet on a phone), `panel` (the options box you see: the popover's painted bubble on desktop, the box inside the sheet on a phone), `sheet` (the bottom sheet the surface becomes on a phone — only that sheet, never the desktop surface; applied after `root`, so it wins a conflict there), `input` (the search
1330
1331
  field), `option` (every listbox option, a broadcast resolved per option), `item-text` (that option's label), `item-icon` (its `itemProps` icons) and `item-description` (its muted second line, `itemProps.description`) — all with the option's states; a custom `#option` slot replaces the label and description,
1331
1332
  `header`, `footer`. States: `open`, and `selected` / `disabled` per option.
1332
1333
  `BbSelect` forwards its own `panel` / `sheet` / `option` here.
1333
1334
 
1334
1335
  The filter-pill assignee picker above, restyled through those parts: mono on
1335
1336
  the search `pt:input`, a muted wash on the chosen option
1336
- (`pt:option:selected` is per node), a primary ring on `pt:root:open` (the
1337
- flyout — the sheet on mobile). The activator is yours; don't restyle it
1337
+ (`pt:option:selected` is per node), a primary ring on `pt:panel:open` (the
1338
+ options box — the box inside the sheet on a phone). The activator is yours; don't restyle it
1338
1339
  through `pt`.
1339
1340
 
1340
- **pt:input / pt:option:selected / pt:root:open — assignee pill**
1341
+ **pt:input / pt:option:selected / pt:panel:open — assignee pill**
1341
1342
 
1342
1343
  ```vue
1343
1344
  <template>
@@ -1355,7 +1356,7 @@ through `pt`.
1355
1356
  :items="teammates"
1356
1357
  pt:input="font-mono text-sm"
1357
1358
  pt:option:selected="bg-(--bb-muted) font-semibold"
1358
- pt:root:open="ring-1 ring-(--bb-primary)"
1359
+ pt:panel:open="ring-1 ring-(--bb-primary)"
1359
1360
  width="240px"
1360
1361
  >
1361
1362
  <template #activator="{ props }">
@@ -1385,7 +1386,7 @@ type Teammate = {
1385
1386
 
1386
1387
  // Same filter-pill assignee picker as `AssigneePicker.vue`, restyled through
1387
1388
  // passthrough: mono on the search `pt:input`, a muted wash on the chosen
1388
- // option (`pt:option:selected` is per node), a primary ring on `pt:root:open`
1389
+ // option (`pt:option:selected` is per node), a primary ring on `pt:panel:open`
1389
1390
  // (the flyout — the sheet on mobile).
1390
1391
  const teammates: Teammate[] = [
1391
1392
  { id: 'ada', fullName: 'Ada Lovelace' },
@@ -1524,7 +1525,7 @@ in the [passthrough guide](./guides/passthrough.md).
1524
1525
 
1525
1526
  | Prop | Type | Default | Required | Description |
1526
1527
  | --- | --- | --- | --- | --- |
1527
- | `pt:<part>`, `pt:<part>:<state>`, `pt` | `PtValue` | | | Passthrough — a class list, or `{ class, style, attrs }`, bound to one named part of the component; the state form applies only while that state is on. Parts: `clear`, `footer`, `header`, `input`, `item-description`, `item-icon`, `item-text`, `option`, `root`, `sheet`. States: `disabled`, `open`, `selected`. `pt` is the object form with the same keys minus the prefix (`{ icon: '…', 'icon:loading': '…' }`). See `guides/passthrough.md`. |
1528
+ | `pt:<part>`, `pt:<part>:<state>`, `pt` | `PtValue` | | | Passthrough — a class list, or `{ class, style, attrs }`, bound to one named part of the component; the state form applies only while that state is on. Parts: `clear`, `footer`, `header`, `input`, `item-description`, `item-icon`, `item-text`, `option`, `panel`, `root`, `sheet`. States: `disabled`, `open`, `selected`. `pt` is the object form with the same keys minus the prefix (`{ icon: '…', 'icon:loading': '…' }`). See `guides/passthrough.md`. |
1528
1529
  | `activator` | `Record<string, any> \| HTMLElement \| null \| undefined` | | | External activator element or component ref. When provided, the activator slot is not rendered and event listeners are attached programmatically to the referenced element. |
1529
1530
  | `adaptive` | `boolean \| undefined` | ``config.adaptive` (`true`)` | | When `true`, the panel opens as a bottom off-canvas sheet on mobile viewports instead of a floating popover; on desktop it stays a popover. The sheet reuses the same search field and options list, adding a representation of the current sele… |
1530
1531
  | `anchor` | `Record<string, any> \| HTMLElement \| null \| undefined` | `null` | | Override the element used for popover positioning and width measurement. Useful when the focusable activator is narrower than its visual container (e.g. a button inside a wrapper). Falls back to `activatorEl` when omitted. |
@@ -1616,7 +1617,7 @@ Set these on the element, or on a class you put on it, to retune this component
1616
1617
  - **CSS custom properties** listed on a node are declared on THAT node's root and read by elements inside it. Set one on that node's root or on the element inside it that reads it — the pt part that lands there is how you reach it (`pt:box="[--border-color:…]"` on a text input) — never on `BbSelectPopover`'s root, where the node's own declaration masks it (design-tokens guide, _Overriding one from a consumer app_, rule 0).
1617
1618
  - Listed nodes are the ones `BbSelectPopover`'s API reaches or that declare a documented CSS variable; the rest fold into "also mounts". The complete tree, repeats and undocumented locals included, is the `tree` field of this component in `components.json`.
1618
1619
 
1619
- - `BbSelectPopover` _(this component)_ — its own template binds: `input` → `input.bb-select-popover__search-input`, `clear` → `ClearableButton`, `root` → `BbOffCanvas`, `root` → `CommonPopover`, `header` → `div.bb-select-popover__header`, `footer` → `div.bb-select-popover__footer`; hands `BbOffCanvas` the pt map `{ header: 'header', footer: 'footer', sheet: 'root' }` (ours → theirs)
1620
+ - `BbSelectPopover` _(this component)_ — its own template binds: `input` → `input.bb-select-popover__search-input`, `clear` → `ClearableButton`, `root` → `BbOffCanvas`, `panel` → `div.bb-select-popover`, `panel` → `CommonPopover`, `root` → `CommonPopover`, `header` → `div.bb-select-popover__header`, `footer` → `div.bb-select-popover__footer`; hands `BbOffCanvas` the pt map `{ header: 'header', footer: 'footer', sheet: 'root' }` (ours → theirs)
1620
1621
  - `BbBadge` _(public — [contract](./BbBadge.md))_ — its own pt parts (`BbBadge`): `spinner` → `BbSpinner`, `icon` → `BbIcon`, `clear` → `button.bb-badge__clear-button`; documented CSS variables: `--bg`, `--fg`, `--border-width`, `--ring`, `--min-size-md`, `--min-size`, `--elev`, `--radius`, `--font-size`, `--icon-size`, `--gap`, `--padding-inline`, `--clear-size`, `--pad-left`; also mounts `BbIcon`, `BbSpinner`, `BadgeBodyContent`
1621
1622
  - `BbOffCanvas` _(public — [contract](./BbOffCanvas.md))_ — its own pt parts (`BbOffCanvas`): `header` → `div.bb-offcanvas__header`, `title` → `span.bb-offcanvas__title`, `description` → `p.bb-offcanvas__description`, `close` → `CloseButton`, `content` → `div.bb-offcanvas__body`, `footer` → `div.bb-offcanvas__footer`; documented CSS variables: `--stack-x`, `--stack-fill`, `--stack-transition-duration`, `--px`, `--close-size`
1622
1623
  - `CloseButton` _(internal — not importable, reach it through `BbOffCanvas`)_ — documented CSS variables: `--size`, `--p`
@@ -14,9 +14,22 @@
14
14
 
15
15
  | pt part | Lands on | In |
16
16
  | --- | --- | --- |
17
+ | `pt:root` | the root of `BbOffCanvas` | `BbOffCanvas` ([contract](./BbOffCanvas.md)) |
18
+ | `pt:panel` | the root of `CommonPopover` | `CommonPopover` _(internal)_ |
19
+ | `pt:root` | the root of `CommonPopover` | `CommonPopover` _(internal)_ |
17
20
  | `pt:sheet` | `pt:root` of `BbOffCanvas` | `BbOffCanvas` ([contract](./BbOffCanvas.md)) |
18
21
  | `pt:item` | the root of `BbBaseButton` | `BbBaseButton` ([contract](./BbBaseButton.md)) |
19
22
 
23
+ **CSS variables you can set through those parts** — declared deeper in the tree, so set one on the part that reads it (`pt:<part>="[--name:value]"`), never on `BbTimePicker`'s root:
24
+
25
+ | Variable | Set through | Declared by | What it is |
26
+ | --- | --- | --- | --- |
27
+ | `--stack-x` | `pt:root` | `BbOffCanvas` | Inward shift applied to a parent panel while a child is stacked on top. |
28
+ | `--stack-fill` | `pt:root` | `BbOffCanvas` | Length of the pad (see `::after`) that fills from the panel's anchored edge out to the screen edge, so no empty band shows when a descendant is dragged away or shrinks. |
29
+ | `--stack-transition-duration` | `pt:root` | `BbOffCanvas` | Duration for the stack shift + pad. Zeroed while a peer resizes so parents track the live size instead of lagging behind a 250ms animation. |
30
+ | `--px` | `pt:root` | `BbOffCanvas` | Axis split of --bb-panel-p: --px (inline) / --py (block), each branching off it. Set the pair only when the axes differ; setting --bb-panel-p alone keeps them equal. Local on this root class (not :roo… |
31
+ | `--close-size` | `pt:root` | `BbOffCanvas` | Shared by the close control and by the space the title reserves for it, * so the two can never drift apart. |
32
+
20
33
  ## Usage & Guidelines
21
34
 
22
35
  ### When to use
@@ -187,8 +200,10 @@ there is no text field to type into, `BbTimePickerInput` when there is.
187
200
 
188
201
  `pt` reaches a named part with a class list — or, in the object form, a
189
202
  style and attributes — optionally only while a state is on. Parts: `root`
190
- (the time panel, in the popover and in the sheet alike), `sheet` (the bottom
191
- sheet around it on a phone — no node on desktop) and `item` (one column entry, a broadcast). States: `open`,
203
+ (the floating element — the bottom sheet on a phone), `panel` (the time box you
204
+ see: the popover's painted bubble on desktop, the box inside the sheet on a
205
+ phone), `sheet` (the bottom
206
+ sheet on a phone only, applied after `root`) and `item` (one column entry, a broadcast). States: `open`,
192
207
  and `selected` per entry.
193
208
 
194
209
  The opening-time cell above, restyled through those parts: the current
@@ -256,7 +271,7 @@ typeahead. Always pass a `label` when the trigger is an unlabelled cell or icon.
256
271
 
257
272
  | Prop | Type | Default | Required | Description |
258
273
  | --- | --- | --- | --- | --- |
259
- | `pt:<part>`, `pt:<part>:<state>`, `pt` | `PtValue` | | | Passthrough — a class list, or `{ class, style, attrs }`, bound to one named part of the component; the state form applies only while that state is on. Parts: `item`, `root`, `sheet`. States: `open`, `selected`. `pt` is the object form with the same keys minus the prefix (`{ icon: '…', 'icon:loading': '…' }`). See `guides/passthrough.md`. |
274
+ | `pt:<part>`, `pt:<part>:<state>`, `pt` | `PtValue` | | | Passthrough — a class list, or `{ class, style, attrs }`, bound to one named part of the component; the state form applies only while that state is on. Parts: `item`, `panel`, `root`, `sheet`. States: `open`, `selected`. `pt` is the object form with the same keys minus the prefix (`{ icon: '…', 'icon:loading': '…' }`). See `guides/passthrough.md`. |
260
275
  | `activator` | `ElementOrComponentRef \| undefined` | | | External activator element or component ref. When provided, the `activator` slot is not rendered and click + ARIA are attached programmatically to the referenced element — mirroring `BbDatePicker`. |
261
276
  | `activeSegment` | `BbTimePickerSegment \| undefined` | | | Which end the columns edit in range mode (`v-model:active-segment`). Standalone use manages this internally via the in-panel toggle; a host can drive it. Ignored outside `range`. |
262
277
  | `adaptive` | `boolean \| undefined` | ``config.adaptive` (`true`)` | | On mobile, open in a bottom off-canvas sheet instead of a floating popover. When unset, falls back to the global `config.adaptive`. |
@@ -304,7 +319,7 @@ typeahead. Always pass a `label` when the trigger is an unlabelled cell or icon.
304
319
  - **CSS custom properties** listed on a node are declared on THAT node's root and read by elements inside it. Set one on that node's root or on the element inside it that reads it — the pt part that lands there is how you reach it (`pt:box="[--border-color:…]"` on a text input) — never on `BbTimePicker`'s root, where the node's own declaration masks it (design-tokens guide, _Overriding one from a consumer app_, rule 0).
305
320
  - Listed nodes are the ones `BbTimePicker`'s API reaches or that declare a documented CSS variable; the rest fold into "also mounts". The complete tree, repeats and undocumented locals included, is the `tree` field of this component in `components.json`.
306
321
 
307
- - `BbTimePicker` _(this component)_ — its own template binds: `root` → `div.bb-time-picker__panel`; hands `BbOffCanvas` the pt map `{ sheet: 'root' }` (ours → theirs)
322
+ - `BbTimePicker` _(this component)_ — its own template binds: `root` → `BbOffCanvas`, `panel` → `div`, `panel` → `CommonPopover`, `root` → `CommonPopover`; hands `BbOffCanvas` the pt map `{ sheet: 'root' }` (ours → theirs)
308
323
  - `CommonTimeSelector` _(internal — not importable, reach it through `BbTimePicker`)_ — `BbTimePicker`'s pt parts land here: `item` → `BbBaseButton`; documented CSS variables: `--time-mark`
309
324
  - `BbBaseButton` _(public — [contract](./BbBaseButton.md))_ — its own pt parts (`BbBaseButton`): `root` → `RouterComponent`, `root` → `a`, `root` → `component`; also mounts `RouterComponent`
310
325
  - `BbOffCanvas` _(public — [contract](./BbOffCanvas.md))_ — its own pt parts (`BbOffCanvas`): `header` → `div.bb-offcanvas__header`, `title` → `span.bb-offcanvas__title`, `description` → `p.bb-offcanvas__description`, `close` → `CloseButton`, `content` → `div.bb-offcanvas__body`, `footer` → `div.bb-offcanvas__footer`; documented CSS variables: `--stack-x`, `--stack-fill`, `--stack-transition-duration`, `--px`, `--close-size`
@@ -14,6 +14,7 @@
14
14
 
15
15
  | pt part | Lands on | In |
16
16
  | --- | --- | --- |
17
+ | `pt:panel` | the root of `CommonPopover` | `CommonPopover` _(internal)_ |
17
18
  | `pt:sheet` | `pt:root` of `BbOffCanvas` | `BbOffCanvas` ([contract](./BbOffCanvas.md)) |
18
19
  | `pt:root` | `div.bb-field` | `CommonField` _(internal)_ |
19
20
  | `pt:label` | `component` | `CommonField` _(internal)_ |
@@ -155,7 +156,7 @@ the `BbTextInput` guide.
155
156
 
156
157
  `pt` reaches a named part of the control with a class list — or, in the
157
158
  object form, a style and attributes — optionally only while a state is on.
158
- Parts: `root` (the container), `label`, `description`, `message` (the errors / warnings region — one node each, only one ever shows), `hint` (the helper line — shown on focus, or always with `persistent-hint`), `box` (the bordered field box), `input` (the native control), `icon` (`prepend:icon` + `append:icon` — a broadcast; the state glyphs are chrome), `spinner` (the spinner shown while `loading`), `prefix`, `suffix`, `clear` (the ✕ that empties the field). Plus `panel` (the time columns, in the popover and in the sheet alike), `sheet` (the bottom sheet around them on a phone only) and `item` (one column entry, a broadcast). `input` is every segment field; the clock trigger is chrome.
159
+ Parts: `root` (the container), `label`, `description`, `message` (the errors / warnings region — one node each, only one ever shows), `hint` (the helper line — shown on focus, or always with `persistent-hint`), `box` (the bordered field box), `input` (the native control), `icon` (`prepend:icon` + `append:icon` — a broadcast; the state glyphs are chrome), `spinner` (the spinner shown while `loading`), `prefix`, `suffix`, `clear` (the ✕ that empties the field). Plus `panel` (the time box you see — the popover's painted bubble on desktop, the box inside the sheet on a phone), `sheet` (the bottom sheet on a phone only) and `item` (one column entry, a broadcast). `input` is every segment field; the clock trigger is chrome.
159
160
  States: `errors`, `warnings` (never beside errors), `loading`, `disabled`, `readonly`, `has-value` (written `pt:box:has-value`). Plus `open` (the panel is showing) and `selected`, resolved per entry. A name outside that list is a type error and an
160
161
  ESLint error.
161
162
 
@@ -354,7 +355,7 @@ Set these on the element, or on a class you put on it, to retune this component
354
355
  - **CSS custom properties** listed on a node are declared on THAT node's root and read by elements inside it. Set one on that node's root or on the element inside it that reads it — the pt part that lands there is how you reach it (`pt:box="[--border-color:…]"` on a text input) — never on `BbTimePickerInput`'s root, where the node's own declaration masks it (design-tokens guide, _Overriding one from a consumer app_, rule 0).
355
356
  - Listed nodes are the ones `BbTimePickerInput`'s API reaches or that declare a documented CSS variable; the rest fold into "also mounts". The complete tree, repeats and undocumented locals included, is the `tree` field of this component in `components.json`.
356
357
 
357
- - `BbTimePickerInput` _(this component)_ — its own template binds: `input` → `input.bb-segmented-field__field`, `suffix` → `span.bb-field-input__suffix`, `panel` → `div.bb-time-picker-input__panel`; hands `BbOffCanvas` the pt map `{ sheet: 'root' }` (ours → theirs)
358
+ - `BbTimePickerInput` _(this component)_ — its own template binds: `input` → `input.bb-segmented-field__field`, `suffix` → `span.bb-field-input__suffix`, `panel` → `div`, `panel` → `CommonPopover`; hands `BbOffCanvas` the pt map `{ sheet: 'root' }` (ours → theirs)
358
359
  - `BbOffCanvas` _(public — [contract](./BbOffCanvas.md))_ — its own pt parts (`BbOffCanvas`): `header` → `div.bb-offcanvas__header`, `title` → `span.bb-offcanvas__title`, `description` → `p.bb-offcanvas__description`, `close` → `CloseButton`, `content` → `div.bb-offcanvas__body`, `footer` → `div.bb-offcanvas__footer`; documented CSS variables: `--stack-x`, `--stack-fill`, `--stack-transition-duration`, `--px`, `--close-size`
359
360
  - `CloseButton` _(internal — not importable, reach it through `BbOffCanvas`)_ — documented CSS variables: `--size`, `--p`
360
361
  - `CommonField` _(internal — not importable, reach it through `BbTimePickerInput`)_ — `BbTimePickerInput`'s pt parts land here: `root` → `div.bb-field`, `label` → `component`, `description` → `span.bb-field__description`, `hint` → `span.bb-field__hint-text`, `message` → `div.bb-field__errors`, `message` → `div.bb-field__warnings`
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
3
  "library": "bitboss-ui",
4
- "version": "3.0.0-beta.26",
4
+ "version": "3.0.0-beta.27",
5
5
  "upgrade": "v2-to-v3",
6
6
  "guide": "ai/guides/migration/v2-to-v3.md",
7
7
  "releases": [
@@ -39,11 +39,12 @@
39
39
  "3.0.0-beta.23",
40
40
  "3.0.0-beta.24",
41
41
  "3.0.0-beta.25",
42
- "3.0.0-beta.26"
42
+ "3.0.0-beta.26",
43
+ "3.0.0-beta.27"
43
44
  ],
44
45
  "summary": {
45
46
  "renames": 64,
46
- "behaviourBreaks": 64,
47
+ "behaviourBreaks": 65,
47
48
  "unreleased": 0
48
49
  },
49
50
  "breaking": [
@@ -949,6 +950,13 @@
949
950
  "guide": "components/bb-popover.md",
950
951
  "firstReleasedIn": "3.0.0-beta.17"
951
952
  },
953
+ {
954
+ "kind": "behaviour",
955
+ "description": "Picker pt surfaces: BbColorPalette / BbTimePicker / BbDatePicker pt:root moves from the inner content box to the floating element (the sheet on a phone); the box is the new pt:panel (the bubble). BbSelect / BbDatePickerInput / BbTimePickerInput pt:panel now land on the painted bubble, not the floating element / inner box. Classes __picker / __calendar → __panel",
956
+ "ruling": "Q37",
957
+ "guide": "ai/guides/passthrough.md (picker surfaces)",
958
+ "firstReleasedIn": "3.0.0-beta.27"
959
+ },
952
960
  {
953
961
  "kind": "behaviour",
954
962
  "description": "BbDropdown fetched (pipeline) rows no longer copy BbBaseButton props / icons / variant / onClick / disabled off the raw item — every field beyond text and value comes only from itemProps",