bitboss-ui 3.0.0-beta.30 → 3.0.0-beta.32

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 (229) hide show
  1. package/README.md +29 -29
  2. package/bin/bitboss-ui-mcp.mjs +2 -1
  3. package/bin/bitboss-ui.mjs +50 -29
  4. package/dist/ai/BbBadge.md +8 -3
  5. package/dist/ai/BbBaseCheckboxIcon.md +3 -3
  6. package/dist/ai/BbBaseRadioIcon.md +3 -3
  7. package/dist/ai/BbBaseSwitchIcon.md +3 -3
  8. package/dist/ai/BbBreadcrumbs.md +4 -1
  9. package/dist/ai/BbCalendar.md +91 -18
  10. package/dist/ai/BbCheckbox.md +2 -2
  11. package/dist/ai/BbCheckboxGroup.md +20 -13
  12. package/dist/ai/BbColorInput.md +6 -6
  13. package/dist/ai/BbColorPalette.md +10 -9
  14. package/dist/ai/BbDatePicker.md +69 -30
  15. package/dist/ai/BbDatePickerInput.md +30 -22
  16. package/dist/ai/BbDialog.md +3 -3
  17. package/dist/ai/BbDropdown.md +348 -56
  18. package/dist/ai/BbDropdownButton.md +37 -18
  19. package/dist/ai/BbIcon.md +1 -1
  20. package/dist/ai/BbNumberInput.md +3 -3
  21. package/dist/ai/BbOffCanvas.md +2 -2
  22. package/dist/ai/BbPopover.md +9 -21
  23. package/dist/ai/BbRadio.md +2 -2
  24. package/dist/ai/BbRadioGroup.md +21 -22
  25. package/dist/ai/BbRating.md +3 -3
  26. package/dist/ai/BbSelect.md +19 -19
  27. package/dist/ai/BbSelectPopover.md +26 -26
  28. package/dist/ai/BbSwitch.md +2 -2
  29. package/dist/ai/BbSwitchGroup.md +20 -13
  30. package/dist/ai/BbTable.md +15 -16
  31. package/dist/ai/BbTabs.md +20 -15
  32. package/dist/ai/BbTabsList.md +2 -1
  33. package/dist/ai/BbTabsPanes.md +1 -1
  34. package/dist/ai/BbTag.md +3 -3
  35. package/dist/ai/BbTextInput.md +3 -3
  36. package/dist/ai/BbTextarea.md +3 -3
  37. package/dist/ai/BbTimePicker.md +9 -8
  38. package/dist/ai/BbTimePickerInput.md +7 -6
  39. package/dist/ai/BbTree.md +11 -1
  40. package/dist/ai/FlatListBox.md +4 -4
  41. package/dist/ai/GroupedListBox.md +4 -4
  42. package/dist/ai/ListBox.md +7 -7
  43. package/dist/ai/OptionsContainer.md +1 -1
  44. package/dist/ai/changelog.json +47 -3
  45. package/dist/ai/components.json +1317 -887
  46. package/dist/ai/guides/agent-contract.md +1 -1
  47. package/dist/ai/guides/ai-router.md +3 -5
  48. package/dist/ai/guides/component-picker.md +26 -25
  49. package/dist/ai/guides/design-language.md +1 -1
  50. package/dist/ai/guides/design-tokens.md +8 -8
  51. package/dist/ai/guides/icons-policy.md +5 -4
  52. package/dist/ai/guides/installation-and-plugin-setup.md +4 -4
  53. package/dist/ai/guides/migration/components/bb-dropdown.md +11 -10
  54. package/dist/ai/guides/migration/v2-to-v3.md +26 -26
  55. package/dist/ai/guides/options-items-playbook.md +1 -1
  56. package/dist/ai/guides/passthrough.md +130 -94
  57. package/dist/ai/source/BbBadge.md +4 -2
  58. package/dist/ai/source/BbBadgeButton.md +43 -3
  59. package/dist/ai/source/BbBaseCheckboxIcon.md +1 -1
  60. package/dist/ai/source/BbBaseRadioIcon.md +1 -1
  61. package/dist/ai/source/BbBaseSwitchIcon.md +1 -1
  62. package/dist/ai/source/BbBreadcrumbs.md +5 -0
  63. package/dist/ai/source/BbCalendar.md +39 -37
  64. package/dist/ai/source/BbCheckbox.md +1 -1
  65. package/dist/ai/source/BbCheckboxGroup.md +8 -8
  66. package/dist/ai/source/BbColorInput.md +5 -5
  67. package/dist/ai/source/BbColorPalette.md +24 -15
  68. package/dist/ai/source/BbDatePicker.md +51 -29
  69. package/dist/ai/source/BbDatePickerInput.md +26 -23
  70. package/dist/ai/source/BbDialog.md +3 -3
  71. package/dist/ai/source/BbDropdown.md +109 -28
  72. package/dist/ai/source/BbDropdownButton.md +40 -27
  73. package/dist/ai/source/BbDropdownGroup.md +93 -25
  74. package/dist/ai/source/BbForm.md +2 -2
  75. package/dist/ai/source/BbNumberInput.md +1 -1
  76. package/dist/ai/source/BbOffCanvas.md +3 -3
  77. package/dist/ai/source/BbPopover.md +12 -13
  78. package/dist/ai/source/BbRadio.md +1 -1
  79. package/dist/ai/source/BbRadioGroup.md +8 -8
  80. package/dist/ai/source/BbRating.md +6 -6
  81. package/dist/ai/source/BbSelect.md +16 -16
  82. package/dist/ai/source/BbSelectPopover.md +34 -30
  83. package/dist/ai/source/BbSwitch.md +1 -1
  84. package/dist/ai/source/BbSwitchGroup.md +6 -6
  85. package/dist/ai/source/BbTable.md +38 -11
  86. package/dist/ai/source/BbTabs.md +14 -4
  87. package/dist/ai/source/BbTabsList.md +13 -3
  88. package/dist/ai/source/BbTabsPanes.md +13 -3
  89. package/dist/ai/source/BbTabsRoot.md +13 -3
  90. package/dist/ai/source/BbTextInput.md +1 -1
  91. package/dist/ai/source/BbTextarea.md +1 -1
  92. package/dist/ai/source/BbTimePicker.md +12 -9
  93. package/dist/ai/source/BbTimePickerInput.md +10 -8
  94. package/dist/ai/source/BbTree.md +6 -0
  95. package/dist/ai/source/CommonPopover.md +1 -4
  96. package/dist/ai/source/FlatListBox.md +6 -6
  97. package/dist/ai/source/GroupedListBox.md +6 -6
  98. package/dist/ai/source/ListBox.md +1 -1
  99. package/dist/ai/source/OptionsContainer.md +5 -5
  100. package/dist/components/BbBadge/BbBadge.vue_vue_type_script_setup_true_lang.js +1 -1
  101. package/dist/components/BbBadge/BbBadgeButton.vue_vue_type_script_setup_true_lang.js +24 -8
  102. package/dist/components/BbBadge/types.d.ts +3 -1
  103. package/dist/components/BbBaseCheckboxIcon/BbBaseCheckboxIcon.vue_vue_type_script_setup_true_lang.js +2 -2
  104. package/dist/components/BbBaseCheckboxIcon/types.d.ts +1 -1
  105. package/dist/components/BbBaseRadioIcon/BbBaseRadioIcon.vue_vue_type_script_setup_true_lang.js +2 -2
  106. package/dist/components/BbBaseRadioIcon/types.d.ts +1 -1
  107. package/dist/components/BbBaseSwitchIcon/BbBaseSwitchIcon.vue_vue_type_script_setup_true_lang.js +2 -2
  108. package/dist/components/BbBaseSwitchIcon/types.d.ts +1 -1
  109. package/dist/components/BbBreadcrumbs/types.d.ts +5 -0
  110. package/dist/components/BbCalendar/BbCalendar.vue_vue_type_script_setup_true_lang.js +63 -63
  111. package/dist/components/BbCalendar/CalendarMonthPanel.vue_vue_type_script_setup_true_lang.js +4 -4
  112. package/dist/components/BbCalendar/CalendarYearPanel.vue_vue_type_script_setup_true_lang.js +4 -4
  113. package/dist/components/BbCalendar/types.d.ts +20 -16
  114. package/dist/components/BbCalendar/types.js +7 -7
  115. package/dist/components/BbCalendar/useCalendarContext.d.ts +1 -1
  116. package/dist/components/BbCalendar/useCalendarGrid.d.ts +1 -1
  117. package/dist/components/BbCheckbox/BbCheckbox.vue_vue_type_script_setup_true_lang.js +7 -7
  118. package/dist/components/BbCheckbox/types.d.ts +1 -1
  119. package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +23 -23
  120. package/dist/components/BbCheckboxGroup/types.d.ts +6 -6
  121. package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +16 -16
  122. package/dist/components/BbColorInput/types.d.ts +3 -3
  123. package/dist/components/BbColorInput/types.js +1 -1
  124. package/dist/components/BbColorPalette/BbColorPalette.vue_vue_type_script_setup_true_lang.js +101 -101
  125. package/dist/components/BbColorPalette/types.d.ts +11 -8
  126. package/dist/components/BbDatePicker/BbDatePicker.vue_vue_type_script_setup_true_lang.js +74 -71
  127. package/dist/components/BbDatePicker/types.d.ts +13 -10
  128. package/dist/components/BbDatePicker/types.js +7 -7
  129. package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +148 -148
  130. package/dist/components/BbDatePickerInput/types.d.ts +9 -6
  131. package/dist/components/BbDatePickerInput/types.js +8 -8
  132. package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +79 -74
  133. package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +69 -70
  134. package/dist/components/BbDropdown/BbDropdownList.vue.d.ts +6 -0
  135. package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +283 -262
  136. package/dist/components/BbDropdown/normalizeGroups.js +1 -0
  137. package/dist/components/BbDropdown/types.d.ts +86 -19
  138. package/dist/components/BbDropdown/types.js +3 -3
  139. package/dist/components/BbDropdown/useDropdownContext.d.ts +1 -1
  140. package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +52 -53
  141. package/dist/components/BbDropdownButton/types.d.ts +19 -10
  142. package/dist/components/BbDropdownButton/types.js +6 -6
  143. package/dist/components/BbNumberInput/BbNumberInput.vue_vue_type_script_setup_true_lang.js +12 -12
  144. package/dist/components/BbNumberInput/types.d.ts +1 -1
  145. package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +169 -169
  146. package/dist/components/BbPopover/types.d.ts +6 -7
  147. package/dist/components/BbRadio/BbRadio.vue_vue_type_script_setup_true_lang.js +7 -7
  148. package/dist/components/BbRadio/types.d.ts +1 -1
  149. package/dist/components/BbRadioGroup/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +23 -23
  150. package/dist/components/BbRadioGroup/types.d.ts +6 -6
  151. package/dist/components/BbRating/BbRating.vue_vue_type_script_setup_true_lang.js +91 -92
  152. package/dist/components/BbRating/types.d.ts +3 -3
  153. package/dist/components/BbRating/types.js +1 -1
  154. package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +46 -46
  155. package/dist/components/BbSelect/types.d.ts +7 -7
  156. package/dist/components/BbSelect/types.js +4 -4
  157. package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +274 -273
  158. package/dist/components/BbSelectPopover/types.d.ts +16 -15
  159. package/dist/components/BbSelectPopover/types.js +3 -3
  160. package/dist/components/BbSwitch/BbSwitch.vue_vue_type_script_setup_true_lang.js +7 -7
  161. package/dist/components/BbSwitch/types.d.ts +1 -1
  162. package/dist/components/BbSwitchGroup/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +23 -23
  163. package/dist/components/BbSwitchGroup/types.d.ts +4 -4
  164. package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +800 -795
  165. package/dist/components/BbTable/types.d.ts +7 -1
  166. package/dist/components/BbTable/utils.d.ts +1 -1
  167. package/dist/components/BbTable/utils.js +3 -3
  168. package/dist/components/BbTabs/types.d.ts +13 -3
  169. package/dist/components/BbTag/BbTag.vue_vue_type_script_setup_true_lang.js +13 -13
  170. package/dist/components/BbTag/types.d.ts +1 -1
  171. package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +12 -12
  172. package/dist/components/BbTextInput/types.d.ts +1 -1
  173. package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +12 -12
  174. package/dist/components/BbTextarea/types.d.ts +1 -1
  175. package/dist/components/BbTimePicker/BbTimePicker.vue_vue_type_script_setup_true_lang.js +116 -113
  176. package/dist/components/BbTimePicker/types.d.ts +6 -5
  177. package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +235 -232
  178. package/dist/components/BbTimePickerInput/types.d.ts +3 -3
  179. package/dist/components/BbTimePickerInput/types.js +1 -1
  180. package/dist/components/BbTree/types.d.ts +6 -0
  181. package/dist/components/CommonFieldInput/CommonFieldInput.vue.d.ts +1 -1
  182. package/dist/components/CommonPopover/CommonPopover.vue_vue_type_script_setup_true_lang.js +23 -22
  183. package/dist/components/FlatListBox/FlatListBox.vue_vue_type_script_setup_true_lang.js +5 -5
  184. package/dist/components/FlatListBox/types.d.ts +1 -1
  185. package/dist/components/GroupedListBox/GroupedListBox.vue_vue_type_script_setup_true_lang.js +5 -5
  186. package/dist/components/GroupedListBox/types.d.ts +1 -1
  187. package/dist/components/ListBox/types.d.ts +1 -1
  188. package/dist/components/OptionsContainer/OptionsContainer.vue_vue_type_script_setup_true_lang.js +2 -2
  189. package/dist/components/OptionsContainer/types.d.ts +2 -2
  190. package/dist/composables/usePassthrough.d.ts +2 -2
  191. package/dist/composables/usePassthrough.js +7 -10
  192. package/dist/index.d.ts +1 -1
  193. package/dist/llms-full.txt +1051 -556
  194. package/dist/llms-medium.txt +35 -36
  195. package/dist/llms.txt +1 -1
  196. package/dist/styles.css +1 -1
  197. package/dist/types/BadgeVariant.d.ts +6 -4
  198. package/dist/types/passthrough.d.ts +43 -38
  199. package/dist/types/passthrough.js +8 -8
  200. package/dist/types/ptComponentMap.d.ts +23 -23
  201. package/dist/utils/passthrough.d.ts +8 -4
  202. package/dist/utils/passthrough.js +21 -17
  203. package/dist/utils/passthroughTestKit.d.ts +3 -3
  204. package/dist/validated/BbCheckbox.vue_vue_type_script_setup_true_lang.js +6 -6
  205. package/dist/validated/BbCheckboxGroup.vue.d.ts +22 -22
  206. package/dist/validated/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +22 -22
  207. package/dist/validated/BbColorInput.vue_vue_type_script_setup_true_lang.js +16 -16
  208. package/dist/validated/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +144 -144
  209. package/dist/validated/BbForm.vue_vue_type_script_setup_true_lang.js +2 -3
  210. package/dist/validated/BbNumberInput.vue_vue_type_script_setup_true_lang.js +12 -12
  211. package/dist/validated/BbRadioGroup.vue.d.ts +22 -22
  212. package/dist/validated/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +22 -22
  213. package/dist/validated/BbRating.vue_vue_type_script_setup_true_lang.js +6 -6
  214. package/dist/validated/BbSelect.vue.d.ts +43 -43
  215. package/dist/validated/BbSelect.vue_vue_type_script_setup_true_lang.js +43 -43
  216. package/dist/validated/BbSwitch.vue_vue_type_script_setup_true_lang.js +6 -6
  217. package/dist/validated/BbSwitchGroup.vue.d.ts +22 -22
  218. package/dist/validated/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +22 -22
  219. package/dist/validated/BbTag.vue_vue_type_script_setup_true_lang.js +13 -13
  220. package/dist/validated/BbTextInput.vue_vue_type_script_setup_true_lang.js +12 -12
  221. package/dist/validated/BbTextarea.vue_vue_type_script_setup_true_lang.js +12 -12
  222. package/dist/validated/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +16 -16
  223. package/dist/vite-plugin.d.ts +3 -4
  224. package/dist/vite.js +3 -3
  225. package/llms.txt +1 -1
  226. package/package.json +1 -1
  227. package/scripts/lib/component-tree.ts +1 -1
  228. package/scripts/lib/mcp-config.mjs +49 -24
  229. package/scripts/lib/validate-bb-markup.mjs +14 -2
@@ -24,7 +24,7 @@
24
24
  | `pt:list` | `span` | `OptionsContainer` _(internal)_ |
25
25
  | `pt:item` | `label` | `OptionsContainer` _(internal)_ |
26
26
  | `pt:label` | `span` | `OptionsContainer` _(internal)_ |
27
- | `pt:item-description` | `span` | `OptionsContainer` _(internal)_ |
27
+ | `pt:itemDescription` | `span` | `OptionsContainer` _(internal)_ |
28
28
 
29
29
  **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 `BbCheckboxGroup`'s root:
30
30
 
@@ -588,13 +588,13 @@ object form, a style and attributes — optionally only while a state is on.
588
588
  Parts: `root` (the fieldset), `legend` (the group's heading, after the `legend`
589
589
  prop), `description`, `message`, `hint` (the helper line — shown on focus, or
590
590
  always with `persistent-hint`), `item` — one option row —, `icon` — that row's glyph —, `label` — that
591
- option's label text, both as on a standalone control — and `item-description` — its
591
+ option's label text, both as on a standalone control — and `itemDescription` — its
592
592
  muted second line (`itemProps.description`), never the group's `description`.
593
- `item`, `icon`, `label` and `item-description` are broadcasts resolved per row. States of the
594
- whole group, on every part: `has-value` (something is chosen), `readonly`,
593
+ `item`, `icon`, `label` and `itemDescription` are broadcasts resolved per row. States of the
594
+ whole group, on every part: `hasValue` (something is chosen), `readonly`,
595
595
  `loading` (the items are being fetched), `disabled`, `warnings`, `errors`.
596
596
  States of one row, on the row parts only: `checked`, `focused` (that row's
597
- input has focus), `focus-visible` (that focus is keyboard-visible), and the
597
+ input has focus), `focusVisible` (that focus is keyboard-visible), and the
598
598
  row's own `disabled` — the states a standalone control has. A name outside
599
599
  that list is a type error and an ESLint error.
600
600
 
@@ -636,6 +636,13 @@ const cadence = ref<string[]>(['Daily']);
636
636
  </script>
637
637
  ```
638
638
 
639
+ A look that depends on the ITEM — a paid channel tinted differently, a
640
+ deprecated option muted — is a **per-item function** on a row part:
641
+ `:pt:item="({ item, checked }) => …"`, called with the raw item (typed as your
642
+ item) and every state as a boolean for that row, its result merged after
643
+ `pt:item:checked`. Row parts only (`item`, `icon`, `label`, `itemDescription`),
644
+ on the instance only — never in the plugin's global map or a scope.
645
+
639
646
  This is the old `:deep()` reach-in on the selected row's modifier class,
640
647
  spelled as a part and a state — your class, our promise. Classes append to
641
648
  ours, an attribute in `attrs` wins over ours. The full grammar, the merge rules
@@ -696,7 +703,7 @@ and the global map are in the [passthrough guide](./guides/passthrough.md).
696
703
 
697
704
  | Prop | Type | Default | Required | Description |
698
705
  | --- | --- | --- | --- | --- |
699
- | `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: `description`, `hint`, `icon`, `item`, `item-description`, `label`, `legend`, `list`, `message`, `root`. States: `disabled`, `errors`, `has-value`, `loading`, `readonly`, `warnings`, `checked`, `focus-visible`, `focused`. What each one is: _Passthrough parts and states_ below. `pt` is the object form with the same keys minus the prefix (`{ icon: '…', 'icon:loading': '…' }`). See `guides/passthrough.md`. |
706
+ | `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: `description`, `hint`, `icon`, `item`, `itemDescription`, `label`, `legend`, `list`, `message`, `root`. States: `disabled`, `errors`, `hasValue`, `loading`, `readonly`, `warnings`, `checked`, `focused`, `focusVisible`. What each one is: _Passthrough parts and states_ below. `pt` is the object form with the same keys minus the prefix (`{ icon: '…', 'icon:loading': '…' }`). See `guides/passthrough.md`. |
700
707
  | `autofocus` | `Booleanish \| undefined` | | | Sets autofocus on page load. |
701
708
  | `compact` | `boolean \| undefined` | `false` | | Displays the component in a compact version. |
702
709
  | `dependencies` | `unknown[] \| undefined` | | | Defines an array of dependencies that will trigger actions in the component upon change. |
@@ -747,22 +754,22 @@ and the global map are in the [passthrough guide](./guides/passthrough.md).
747
754
  | `hint` | The helper line (the `hint` prop), shown on focus, or always with `persistent-hint`. |
748
755
  | `list` | The node that lays the rows out (flex + wrap, gaps on `--gap` / `--row-gap`): `pt:list="grid grid-cols-3"` re-lays them, `pt:list="[--gap:8px]"` tightens them. Takes the group-wide states only. |
749
756
  | `item` | One option row — a broadcast, resolved per option with its own `checked` / `disabled` / focus. Takes a per-item function. |
750
- | `icon` | One row's drawn glyph — the default one: a consumer `icon` slot replaces it. |
751
- | `label` | One option's label text (the `label` slot's default). |
752
- | `item-description` | One option's muted second line, its description. |
757
+ | `icon` | One row's drawn glyph — the default one: a consumer `icon` slot replaces it. Takes a per-item function. |
758
+ | `label` | One option's label text (the `label` slot's default). Takes a per-item function. |
759
+ | `itemDescription` | One option's muted second line, its description. Takes a per-item function. |
753
760
 
754
761
  States are listed in precedence order: when two are on at once and their entries conflict, the later one wins.
755
762
 
756
763
  | State | When it is on |
757
764
  | --- | --- |
758
- | `has-value` | Component-wide: at least one option is chosen. |
759
- | `checked` | Per row, on `item`, `icon`, `label` and `item-description`: that option is chosen. Never on a field part. |
765
+ | `hasValue` | Component-wide: at least one option is chosen. |
766
+ | `checked` | Per row, on `item`, `icon`, `label` and `itemDescription`: that option is chosen. Never on a field part. |
760
767
  | `readonly` | Component-wide: the group is `readonly`. |
761
768
  | `disabled` | Component-wide while the group is `disabled`; also per row, on the row parts of an option that is disabled on its own. |
762
769
  | `warnings` | Component-wide: the group shows warnings and no errors. |
763
770
  | `errors` | Component-wide: the group shows errors. |
764
771
  | `focused` | Per row, on the row parts: that option's input has focus — any focus, mouse included. |
765
- | `focus-visible` | Per row, on the row parts: that option's focus is keyboard-visible — where a focus ring belongs. |
772
+ | `focusVisible` | Per row, on the row parts: that option's focus is keyboard-visible — where a focus ring belongs. |
766
773
  | `loading` | Component-wide: the items are being fetched. |
767
774
 
768
775
  ## Events
@@ -820,7 +827,7 @@ Set these on the element, or on a class you put on it, to retune this component
820
827
 
821
828
  - `BbCheckboxGroup` _(this component)_ — its own template binds: `icon` → `BbBaseCheckboxIcon`
822
829
  - `CommonField` _(internal — not importable, reach it through `BbCheckboxGroup`)_ — `BbCheckboxGroup`'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`
823
- - `OptionsContainer` _(internal — not importable, reach it through `BbCheckboxGroup`)_ — `BbCheckboxGroup`'s pt parts land here: `list` → `span`, `item` → `label`, `label` → `span`, `item-description` → `span`
830
+ - `OptionsContainer` _(internal — not importable, reach it through `BbCheckboxGroup`)_ — `BbCheckboxGroup`'s pt parts land here: `list` → `span`, `item` → `label`, `label` → `span`, `itemDescription` → `span`
824
831
  - Also mounts `BbBaseCheckboxIcon`
825
832
 
826
833
  ## See Also
@@ -505,8 +505,8 @@ the `BbTextInput` guide.
505
505
 
506
506
  `pt` reaches a named part of the control with a class list — or, in the
507
507
  object form, a style and attributes — optionally only while a state is on.
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).
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
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 surface — the popover's painted bubble on desktop, the sheet itself 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).
509
+ States: `errors`, `warnings` (never beside errors), `loading`, `disabled`, `readonly`, `hasValue` (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
510
510
  ESLint error.
511
511
 
512
512
  The workspace appearance form above, restyled through those parts: mono on
@@ -664,7 +664,7 @@ of it. The full grammar, the merge rules and the global map are in the
664
664
 
665
665
  | Prop | Type | Default | Required | Description |
666
666
  | --- | --- | --- | --- | --- |
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`. What each one is: _Passthrough parts and states_ below. `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`, `hasValue`, `loading`, `readonly`, `warnings`, `selected`. What each one is: _Passthrough parts and states_ below. `pt` is the object form with the same keys minus the prefix (`{ icon: '…', 'icon:loading': '…' }`). See `guides/passthrough.md`. |
668
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 … |
669
669
  | `alpha` | `boolean \| undefined` | `false` | | Enable the alpha channel. Shows an opacity slider and uses `#RRGGBBAA` hex8 format. |
670
670
  | `append:icon` | `string \| undefined` | | | Name of the icon to be added at the end of the input. |
@@ -718,7 +718,7 @@ of it. The full grammar, the merge rules and the global map are in the
718
718
  | `suffix` | The `#suffix` slot's wrapper, inside the box after the input. |
719
719
  | `clear` | The ✕ that empties this control (`clearable`) — one node, never a chip's own ✕. |
720
720
  | `indicator` | The colour dot in the box that opens the palette. |
721
- | `panel` | The palette box — the popover's painted bubble on desktop, the box inside the sheet on a phone. |
721
+ | `panel` | The palette surface — the popover's painted bubble on desktop, the sheet itself on a phone. |
722
722
  | `sheet` | The bottom sheet the palette opens in on a phone — no node on desktop. |
723
723
  | `swatch` | One palette swatch (after the `swatches` prop) — a broadcast resolved per swatch. |
724
724
 
@@ -726,7 +726,7 @@ States are listed in precedence order: when two are on at once and their entries
726
726
 
727
727
  | State | When it is on |
728
728
  | --- | --- |
729
- | `has-value` | Component-wide: the control holds a value, by its own rule (`0` counts on `BbNumberInput`, `''` on `BbColorInput`). |
729
+ | `hasValue` | Component-wide: the control holds a value, by its own rule (`0` counts on `BbNumberInput`, `''` on `BbColorInput`). |
730
730
  | `selected` | Per node, on `swatch` only: the swatch that matches the value. |
731
731
  | `readonly` | Component-wide: the control is `readonly` — shown, focusable, not editable. |
732
732
  | `disabled` | Component-wide: the control is `disabled`. |
@@ -796,7 +796,7 @@ Set these on the element, or on a class you put on it, to retune this component
796
796
  - `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)
797
797
  - `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`
798
798
  - `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`
799
- - `BbColorPalette` _(public — [contract](./BbColorPalette.md))_ — its own pt parts (`BbColorPalette`): `swatch` → `button.bb-color-palette__swatch`, `panel` → `div`, `panel` → `CommonPopover`; hands `BbOffCanvas` the pt map `{ sheet: 'root' }` (ours → theirs); also mounts `CommonPopover`
799
+ - `BbColorPalette` _(public — [contract](./BbColorPalette.md))_ — its own pt parts (`BbColorPalette`): `swatch` → `button.bb-color-palette__swatch`, `panel` → `div`, `panel` → `CommonPopover`; hands `BbOffCanvas` the pt map `{ panel: 'root', sheet: 'root' }` (ours → theirs); also mounts `CommonPopover`
800
800
  - `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`, `--handle-w`, `--handle-h`, `--handle-bg`, `--close-size`
801
801
  - `CloseButton` _(internal — not importable, reach it through `BbOffCanvas`)_ — documented CSS variables: `--size`, `--p`
802
802
 
@@ -15,6 +15,7 @@
15
15
  | pt part | Lands on | In |
16
16
  | --- | --- | --- |
17
17
  | `pt:panel` | the root of `CommonPopover` | `CommonPopover` _(internal)_ |
18
+ | `pt:panel` | `pt:root` of `BbOffCanvas` | `BbOffCanvas` ([contract](./BbOffCanvas.md)) |
18
19
  | `pt:sheet` | `pt:root` of `BbOffCanvas` | `BbOffCanvas` ([contract](./BbOffCanvas.md)) |
19
20
 
20
21
  ## Usage & Guidelines
@@ -557,11 +558,11 @@ styling (a caret, a highlight). Two props gate interaction:
557
558
 
558
559
  `pt` reaches a named part with a class list — or, in the object form, a
559
560
  style and attributes — optionally only while a state is on. Parts: `root`
560
- (the floating element — the bottom sheet on a phone), `panel` (the palette box you
561
- see: the popover's painted bubble on desktop, the box inside the sheet on a
562
- phone — canvas, sliders, swatches; `pt:panel="px-1"`
563
- tightens its padding), `sheet` (the bottom sheet on a phone only, applied
564
- after `root`) and `swatch` (one swatch, named after the `swatches` prop — a
561
+ (the floating element — an invisible positioning wrapper, no node on a
562
+ phone), `panel` (the palette surface you see: the popover's painted bubble on
563
+ desktop, the sheet itself on a phone — canvas, sliders, swatches; `pt:panel="px-1"`
564
+ tightens the bubble's padding), `sheet` (the bottom sheet on a phone only, applied
565
+ after `panel`) and `swatch` (one swatch, named after the `swatches` prop — a
565
566
  broadcast). States: `open`, and
566
567
  `selected` per swatch (the one matching the value). The canvas and the sliders
567
568
  are not parts.
@@ -762,9 +763,9 @@ The full grammar, the merge rules and the global map are in the
762
763
 
763
764
  | Part | What it is |
764
765
  | --- | --- |
765
- | `root` | The floating element — on a phone, the bottom sheet (as on `BbPopover`). |
766
- | `panel` | The picker box you see — the popover's painted bubble on desktop, the box inside the sheet on a phone — holding the canvas, the sliders and the swatches. The canvas and the sliders are not parts. |
767
- | `sheet` | The bottom sheet on a phone only (the `BbOffCanvas` root). Applied after `root`, so it wins a conflict there. |
766
+ | `root` | The floating element — an invisible positioning wrapper; a `class` on the component lands here. No node on the phone sheet: style what you see with `panel`. |
767
+ | `panel` | The picker surface you see — the popover's painted bubble on desktop, the sheet itself on a phone — holding the canvas, the sliders and the swatches. The canvas and the sliders are not parts. |
768
+ | `sheet` | The bottom sheet on a phone only (the `BbOffCanvas` root). Applied after `panel`, so it wins a conflict there. |
768
769
  | `swatch` | One swatch (after the `swatches` prop) — a broadcast resolved per swatch. |
769
770
 
770
771
  States are listed in precedence order: when two are on at once and their entries conflict, the later one wins.
@@ -795,7 +796,7 @@ States are listed in precedence order: when two are on at once and their entries
795
796
  - **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).
796
797
  - 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`.
797
798
 
798
- - `BbColorPalette` _(this component)_ — its own template binds: `swatch` → `button.bb-color-palette__swatch`, `panel` → `div`, `panel` → `CommonPopover`; hands `BbOffCanvas` the pt map `{ sheet: 'root' }` (ours → theirs)
799
+ - `BbColorPalette` _(this component)_ — its own template binds: `swatch` → `button.bb-color-palette__swatch`, `panel` → `div`, `panel` → `CommonPopover`; hands `BbOffCanvas` the pt map `{ panel: 'root', sheet: 'root' }` (ours → theirs)
799
800
  - `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`, `--handle-w`, `--handle-h`, `--handle-bg`, `--close-size`
800
801
  - `CloseButton` _(internal — not importable, reach it through `BbOffCanvas`)_ — documented CSS variables: `--size`, `--p`
801
802
  - Also mounts `CommonPopover`
@@ -15,6 +15,7 @@
15
15
  | pt part | Lands on | In |
16
16
  | --- | --- | --- |
17
17
  | `pt:panel` | the root of `CommonPopover` | `CommonPopover` _(internal)_ |
18
+ | `pt:panel` | `pt:root` of `BbOffCanvas` | `BbOffCanvas` ([contract](./BbOffCanvas.md)) |
18
19
  | `pt:sheet` | `pt:root` of `BbOffCanvas` | `BbOffCanvas` ([contract](./BbOffCanvas.md)) |
19
20
 
20
21
  ## Usage & Guidelines
@@ -202,6 +203,31 @@ const time = ref<string | null>(null);
202
203
  </template>
203
204
  ```
204
205
 
206
+ ### Decorating days
207
+
208
+ The picker passes its day slots straight to the calendar inside it, so the four
209
+ day-grid slots work here unchanged:
210
+
211
+ - `#day` replaces every day's number and `#append:day` adds under every day
212
+ (event dots, prices). Both receive `label`, `selected`, `outside`,
213
+ `first` / `middle` / `last` and `item` (the day as a dayjs object).
214
+ - `#<YYYY_MM_DD>` and `#append:<YYYY_MM_DD>` do the same for one date, e.g.
215
+ `#append:2026_12_25`: its local `YYYY-MM-DD` with `_` for `-`. A date's slot
216
+ wins over the every-day one.
217
+
218
+ ```vue
219
+ <BbDatePicker v-model="pickup">
220
+ <template #activator="{ props, value }">
221
+ <BbButton v-bind="props" variant="outline">{{ value ?? 'Pickup day' }}</BbButton>
222
+ </template>
223
+ <template #append:2026_12_25><span class="text-[10px]">Closed</span></template>
224
+ </BbDatePicker>
225
+ ```
226
+
227
+ Use per-date slots for a few fixed dates; mark data-driven days through
228
+ `#append:day` and a lookup on `item`. The [BbCalendar](./BbCalendar.md) guide
229
+ has a worked example.
230
+
205
231
  ### Adaptive and positioning
206
232
 
207
233
  On mobile the calendar opens in a bottom off-canvas sheet instead of a floating
@@ -267,24 +293,24 @@ into, `BbDatePickerInput` when there is.
267
293
 
268
294
  `pt` reaches a named part with a class list — or, in the object form, a
269
295
  style and attributes — optionally only while a state is on. Parts: `root`
270
- (the floating element — the bottom sheet on a phone), `panel` (the calendar box you
271
- see: the popover's painted bubble on desktop, the box inside the sheet on a
272
- phone — it also carries the sizing tokens, so
296
+ (the floating element — an invisible positioning wrapper, no node on a
297
+ phone), `panel` (the calendar surface you see: the popover's painted bubble on
298
+ desktop, the sheet itself on a phone — it also carries the sizing tokens, so
273
299
  `pt:panel="[--pad-x:2px]"` tightens the padding and the grid width follows), `sheet` (the
274
- bottom sheet on a phone only, applied after `root`), `header` (the
300
+ bottom sheet on a phone only, applied after `panel`), `header` (the
275
301
  navigation bar), `arrow` (the previous / next buttons), `month` and `year`
276
- (the heading buttons), `column-header` (each weekday letter), `day` (one whole
277
- day cell) and `day-button` (the button inside it), `month-item` and
278
- `year-item` (one button of the month / year panel).
302
+ (the heading buttons), `columnHeader` (each weekday letter), `day` (one whole
303
+ day cell) and `dayButton` (the button inside it), `monthItem` and
304
+ `yearItem` (one button of the month / year panel).
279
305
 
280
306
  States: `open` follows the surface; `arrow` is `disabled` at a `min` / `max`
281
307
  bound; `month` and `year` are `active` while their panel is open. The cells
282
- resolve per node — on `day` and `day-button`: `selected`, `disabled`, `today`,
283
- `outside` (a day of the previous or next month), `range-start` / `range-end` /
284
- `in-range` (a committed range) and `highlighted` (the keyboard cursor). The
308
+ resolve per node — on `day` and `dayButton`: `selected`, `disabled`, `today`,
309
+ `outside` (a day of the previous or next month), `rangeStart` / `rangeEnd` /
310
+ `inRange` (a committed range) and `highlighted` (the keyboard cursor). The
285
311
  panel items carry the same set without `today` and `outside`.
286
312
 
287
- `day` is the whole cell and `day-button` the rounded mark inside it: a
313
+ `day` is the whole cell and `dayButton` the rounded mark inside it: a
288
314
  background on `pt:day` paints the full cell square, so restyle the mark on
289
315
  `pt:day-button`. The time rail is not a part. The calendar parts are
290
316
  `BbCalendar`'s — this component forwards them to the calendar it hosts, and
@@ -375,7 +401,7 @@ and digit typeahead; the time rail exposes labelled columns. Always pass a
375
401
 
376
402
  | Prop | Type | Default | Required | Description |
377
403
  | --- | --- | --- | --- | --- |
378
- | `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`. What each one is: _Passthrough parts and states_ below. `pt` is the object form with the same keys minus the prefix (`{ icon: '…', 'icon:loading': '…' }`). See `guides/passthrough.md`. |
404
+ | `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`, `columnHeader`, `day`, `dayButton`, `header`, `month`, `monthItem`, `panel`, `root`, `sheet`, `year`, `yearItem`. States: `active`, `disabled`, `highlighted`, `inRange`, `open`, `outside`, `rangeEnd`, `rangeStart`, `selected`, `today`. What each one is: _Passthrough parts and states_ below. `pt` is the object form with the same keys minus the prefix (`{ icon: '…', 'icon:loading': '…' }`). See `guides/passthrough.md`. |
379
405
  | `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. |
380
406
  | `activeSegment` | `BbCalendarSegment \| 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. |
381
407
  | `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`. |
@@ -412,29 +438,29 @@ and digit typeahead; the time rail exposes labelled columns. Always pass a
412
438
 
413
439
  | Part | What it is |
414
440
  | --- | --- |
415
- | `root` | The floating element — on a phone, the bottom sheet (as on `BbPopover`). |
441
+ | `root` | The floating element — an invisible positioning wrapper; a `class` on the component lands here. No node on the phone sheet: style what you see with `panel`. |
416
442
  | `header` | The navigation bar: the previous / next arrows and the month / year headings. |
417
443
  | `arrow` | The previous / next buttons — a broadcast. |
418
444
  | `month` | The month heading button; it opens the month panel. |
419
445
  | `year` | The year heading button; it opens the year panel. |
420
- | `column-header` | Each weekday letter above the grid — a broadcast. |
421
- | `day` | One whole day cell — a broadcast resolved per day. A background here paints the full cell square; restyle the round mark on `day-button`. |
422
- | `day-button` | The button inside a day cell — the mark that shows selection. A broadcast resolved per day. |
423
- | `month-item` | One month button of the month panel (the home grid of `type="month"`) — a broadcast resolved per month. |
424
- | `year-item` | One year button of the year list — a broadcast resolved per year. |
425
- | `panel` | The calendar box you see — the popover's painted bubble on desktop, the box inside the sheet on a phone. It carries the calendar's sizing tokens: `pt:panel="[--cell:36px]"` widens the calendar, `pt:panel="[--pad-x:2px]"` tightens it. |
426
- | `sheet` | The bottom sheet on a phone only (the `BbOffCanvas` root). Applied after `root`, so it wins a conflict there. |
446
+ | `columnHeader` | Each weekday letter above the grid — a broadcast. |
447
+ | `day` | One whole day cell — a broadcast resolved per day. A background here paints the full cell square; restyle the round mark on `dayButton`. |
448
+ | `dayButton` | The button inside a day cell — the mark that shows selection. A broadcast resolved per day. |
449
+ | `monthItem` | One month button of the month panel (the home grid of `type="month"`) — a broadcast resolved per month. |
450
+ | `yearItem` | One year button of the year list — a broadcast resolved per year. |
451
+ | `panel` | The calendar surface you see — the popover's painted bubble on desktop, the sheet itself on a phone. It carries the sizing tokens: `pt:panel="[--cell:36px]"` widens the calendar, `[--pad-x:2px]` tightens. |
452
+ | `sheet` | The bottom sheet on a phone only (the `BbOffCanvas` root). Applied after `panel`, so it wins a conflict there. |
427
453
 
428
454
  States are listed in precedence order: when two are on at once and their entries conflict, the later one wins.
429
455
 
430
456
  | State | When it is on |
431
457
  | --- | --- |
432
- | `outside` | Per node, on `day` / `day-button`: a day of the previous or next month, shown to fill the grid. |
433
- | `today` | Per node, on `day` / `day-button`: today. |
434
- | `in-range` | Per node, on the cells (`day`, `day-button`, `month-item`, `year-item`): inside a committed range, between its ends. |
458
+ | `outside` | Per node, on `day` / `dayButton`: a day of the previous or next month, shown to fill the grid. |
459
+ | `today` | Per node, on `day` / `dayButton`: today. |
460
+ | `inRange` | Per node, on the cells (`day`, `dayButton`, `monthItem`, `yearItem`): inside a committed range, between its ends. |
435
461
  | `selected` | Per node, on the cells: a chosen day, month or year. |
436
- | `range-start` | Per node, on the cells: a committed range's first day, month or year. |
437
- | `range-end` | Per node, on the cells: a committed range's last day, month or year. |
462
+ | `rangeStart` | Per node, on the cells: a committed range's first day, month or year. |
463
+ | `rangeEnd` | Per node, on the cells: a committed range's last day, month or year. |
438
464
  | `disabled` | Component-wide while the picker is `disabled`. Also per node: on the cells, one outside `min` / `max` or refused by `selectable`; on `arrow`, at a bound or while the month / year panel is open. |
439
465
  | `active` | Per node, on `month` / `year`: its panel is open. |
440
466
  | `open` | Component-wide: the calendar is showing. |
@@ -457,6 +483,8 @@ States are listed in precedence order: when two are on at once and their entries
457
483
  - `activator` — scope: `BbDatePickerActivatorSlotProps` — Custom activator element. Apply `v-bind="props"` to your trigger.
458
484
  - `append:day` — scope: `BbCalendarDaySlotProps` — Appends content below each calendar day.
459
485
  - `day` — scope: `BbCalendarDaySlotProps` — Replaces the day button label inside each calendar day.
486
+ - `#<YYYY_MM_DD>` (named from data) — scope: `BbCalendarDaySlotProps` — One date's button label (e.g. `#2024_03_15`: the local `YYYY-MM-DD` through `slotKey`); beats `day`. Day grid only.
487
+ - `#append:<YYYY_MM_DD>` (named from data) — scope: `BbCalendarDaySlotProps` — Content under one date's cell; beats `append:day`.
460
488
 
461
489
  ## CSS custom properties
462
490
 
@@ -470,9 +498,20 @@ Set these on the element, or on a class you put on it, to retune this component
470
498
  | `--nav-button-h` | `.bb-date-picker__panel` | `24px` | |
471
499
  | `--day-slot-allowance` | `.bb-date-picker__panel` | `0px` | Allowance for the day slot append area - needed for the slot to be visible |
472
500
  | `--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. |
473
- | `--sheet-cell` | `.bb-date-picker__panel--sheet` | `40px` | Declared on the container so the time rail (the grid's sibling inside the calendar) can align its wheels to the same column grid. |
474
- | `--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. |
475
- | `--nav-button-h` | `.bb-date-picker__panel--sheet` | `40px` | |
501
+ | `--sheet-cell` | `.bb-date-picker-offcanvas` | `40px` | |
502
+ | `--cell` | `.bb-date-picker-offcanvas` | `var(--sheet-cell)` | |
503
+ | `--pad-x` | `.bb-date-picker-offcanvas` | `6px` | |
504
+ | `--pad-y` | `.bb-date-picker-offcanvas` | `8px` | |
505
+ | `--nav-button-h` | `.bb-date-picker-offcanvas` | `40px` | |
506
+ | `--day-slot-allowance` | `.bb-date-picker-offcanvas` | `0px` | |
507
+ | `--unit-row` | `.bb-date-picker-offcanvas` | `calc(var(--cell) * 1.25)` | |
508
+ | `--sheet-cell` | `.bb-date-picker__panel--sheet` | `inherit` | |
509
+ | `--cell` | `.bb-date-picker__panel--sheet` | `inherit` | |
510
+ | `--pad-x` | `.bb-date-picker__panel--sheet` | `inherit` | |
511
+ | `--pad-y` | `.bb-date-picker__panel--sheet` | `inherit` | |
512
+ | `--nav-button-h` | `.bb-date-picker__panel--sheet` | `inherit` | |
513
+ | `--day-slot-allowance` | `.bb-date-picker__panel--sheet` | `inherit` | |
514
+ | `--unit-row` | `.bb-date-picker__panel--sheet` | `inherit` | |
476
515
 
477
516
  ## Component tree
478
517
 
@@ -483,8 +522,8 @@ Set these on the element, or on a class you put on it, to retune this component
483
522
  - **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).
484
523
  - 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`.
485
524
 
486
- - `BbDatePicker` _(this component)_ — its own template binds: `panel` → `div`, `panel` → `CommonPopover`; hands `BbCalendar` the pt map ` passthrough.forward(DATE_PICKER_CALENDAR_PARTS, BB_CALENDAR_PT.states) ` (ours → theirs); hands `BbOffCanvas` the pt map `{ sheet: 'root' }` (ours → theirs)
487
- - `BbCalendar` _(public — [contract](./BbCalendar.md))_ — its own pt parts (`BbCalendar`): `header` → `div.bb-calendar__controls`, `arrow` → `BbBaseButton`, `month` → `BbBaseButton`, `year` → `BbBaseButton`, `day` → `div.bb-calendar__date`, `day-button` → `button.bb-calendar__date-button`; documented CSS variables: `--cell`, `--day-slot-allowance`, `--unit-row`; also mounts `ScaleFade`, `Slide`, `CalendarMonthPanel`, `CalendarYearPanel`
525
+ - `BbDatePicker` _(this component)_ — its own template binds: `panel` → `div`, `panel` → `CommonPopover`; hands `BbCalendar` the pt map ` passthrough.forward(DATE_PICKER_CALENDAR_PARTS, BB_CALENDAR_PT.states) ` (ours → theirs); hands `BbOffCanvas` the pt map `{ panel: 'root', sheet: 'root' }` (ours → theirs)
526
+ - `BbCalendar` _(public — [contract](./BbCalendar.md))_ — its own pt parts (`BbCalendar`): `header` → `div.bb-calendar__controls`, `arrow` → `BbBaseButton`, `month` → `BbBaseButton`, `year` → `BbBaseButton`, `day` → `div.bb-calendar__date`, `dayButton` → `button.bb-calendar__date-button`; documented CSS variables: `--cell`, `--day-slot-allowance`, `--unit-row`; also mounts `ScaleFade`, `Slide`, `CalendarMonthPanel`, `CalendarYearPanel`
488
527
  - `BbBaseButton` _(public — [contract](./BbBaseButton.md))_ — its own pt parts (`BbBaseButton`): `root` → `RouterComponent`, `root` → `a`, `root` → `component`; also mounts `RouterComponent`
489
528
  - `CommonTimeSelector` _(internal — not importable, reach it through `BbCalendar`)_ — documented CSS variables: `--time-mark`; also mounts `BbBaseButton`
490
529
  - `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`, `--handle-w`, `--handle-h`, `--handle-bg`, `--close-size`
@@ -20,11 +20,11 @@
20
20
  | `pt:arrow` | `pt:arrow` of `BbDatePicker` | `BbDatePicker` ([contract](./BbDatePicker.md)) |
21
21
  | `pt:month` | `pt:month` of `BbDatePicker` | `BbDatePicker` ([contract](./BbDatePicker.md)) |
22
22
  | `pt:year` | `pt:year` of `BbDatePicker` | `BbDatePicker` ([contract](./BbDatePicker.md)) |
23
- | `pt:column-header` | `pt:column-header` of `BbDatePicker` | `BbDatePicker` ([contract](./BbDatePicker.md)) |
23
+ | `pt:columnHeader` | `pt:columnHeader` of `BbDatePicker` | `BbDatePicker` ([contract](./BbDatePicker.md)) |
24
24
  | `pt:day` | `pt:day` of `BbDatePicker` | `BbDatePicker` ([contract](./BbDatePicker.md)) |
25
- | `pt:day-button` | `pt:day-button` of `BbDatePicker` | `BbDatePicker` ([contract](./BbDatePicker.md)) |
26
- | `pt:month-item` | `pt:month-item` of `BbDatePicker` | `BbDatePicker` ([contract](./BbDatePicker.md)) |
27
- | `pt:year-item` | `pt:year-item` of `BbDatePicker` | `BbDatePicker` ([contract](./BbDatePicker.md)) |
25
+ | `pt:dayButton` | `pt:dayButton` of `BbDatePicker` | `BbDatePicker` ([contract](./BbDatePicker.md)) |
26
+ | `pt:monthItem` | `pt:monthItem` of `BbDatePicker` | `BbDatePicker` ([contract](./BbDatePicker.md)) |
27
+ | `pt:yearItem` | `pt:yearItem` of `BbDatePicker` | `BbDatePicker` ([contract](./BbDatePicker.md)) |
28
28
  | `pt:root` | `div.bb-field` | `CommonField` _(internal)_ |
29
29
  | `pt:label` | `component` | `CommonField` _(internal)_ |
30
30
  | `pt:description` | `span.bb-field__description` | `CommonField` _(internal)_ |
@@ -589,6 +589,12 @@ below it (badges, event dots, price tags). Both receive the day's state — `lab
589
589
  decorations lightweight; they render for every visible cell. The appointment
590
590
  example above uses `append:day` for event dots.
591
591
 
592
+ One date can have its own slot: `#<YYYY_MM_DD>` replaces that date's number and
593
+ `#append:<YYYY_MM_DD>` adds under it, e.g. `#append:2026_12_25` — the local
594
+ `YYYY-MM-DD` with `_` for `-`. A date's slot wins over `day` / `append:day` for
595
+ that date. Use them for a few fixed dates (holidays); mark data-driven days with
596
+ `append:day` and a lookup on `item`.
597
+
592
598
  ### Calendar keyboard navigation
593
599
 
594
600
  The calendar grid is a `role="grid"` with a roving tabindex (the current day is
@@ -716,8 +722,8 @@ the `BbTextInput` guide.
716
722
 
717
723
  `pt` reaches a named part of the control with a class list — or, in the
718
724
  object form, a style and attributes — optionally only while a state is on.
719
- 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.
720
- 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
725
+ 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 surface you see — the popover's painted bubble on desktop, the sheet itself 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`, `columnHeader`, `day` (the whole cell), `dayButton` (the mark inside it), `monthItem` and `yearItem` — the `BbDatePicker` guide describes each node. `input` is every segment field; the calendar trigger is chrome.
726
+ States: `errors`, `warnings` (never beside errors), `loading`, `disabled`, `readonly`, `hasValue` (written `pt:box:has-value`). Plus `open` (the calendar is showing), and the calendar's per-node states: `selected`, `disabled`, `today`, `outside`, `rangeStart` / `rangeEnd` / `inRange` and `highlighted` on the cells, `active` on `month` / `year`. A name outside that list is a type error and an
721
727
  ESLint error.
722
728
 
723
729
  The invoice due-date field above, restyled through those parts: a muted
@@ -851,7 +857,7 @@ label>')` matches nothing; query each segment by its own label instead. See
851
857
 
852
858
  | Prop | Type | Default | Required | Description |
853
859
  | --- | --- | --- | --- | --- |
854
- | `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: `activator`, `arrow`, `box`, `clear`, `column-header`, `day`, `day-button`, `description`, `header`, `hint`, `icon`, `input`, `label`, `message`, `month`, `month-item`, `panel`, `prefix`, `root`, `sheet`, `spinner`, `suffix`, `year`, `year-item`. States: `active`, `disabled`, `errors`, `has-value`, `highlighted`, `in-range`, `loading`, `open`, `outside`, `range-end`, `range-start`, `readonly`, `selected`, `today`, `warnings`. What each one is: _Passthrough parts and states_ below. `pt` is the object form with the same keys minus the prefix (`{ icon: '…', 'icon:loading': '…' }`). See `guides/passthrough.md`. |
860
+ | `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: `activator`, `arrow`, `box`, `clear`, `columnHeader`, `day`, `dayButton`, `description`, `header`, `hint`, `icon`, `input`, `label`, `message`, `month`, `monthItem`, `panel`, `prefix`, `root`, `sheet`, `spinner`, `suffix`, `year`, `yearItem`. States: `active`, `disabled`, `errors`, `hasValue`, `highlighted`, `inRange`, `loading`, `open`, `outside`, `rangeEnd`, `rangeStart`, `readonly`, `selected`, `today`, `warnings`. What each one is: _Passthrough parts and states_ below. `pt` is the object form with the same keys minus the prefix (`{ icon: '…', 'icon:loading': '…' }`). See `guides/passthrough.md`. |
855
861
  | `adaptive` | `boolean \| undefined` | ``config.adaptive` (`true`)` | | On mobile the calendar opens inside a bottom off-canvas sheet instead of a floating popover, mirroring the adaptive behaviour of `BbPopover`/`BbSelect`. When unset, falls back to the global `config.adaptive`. |
856
862
  | `ampm` | `boolean \| undefined` | `false` | | 12-hour display with an AM/PM segment (requires `type="datetime"`). Purely a field-composition concern: `modelValue` and the `time` model stay 24-hour regardless. Type `A`/`P` (or ArrowUp/Down) to set the meridiem. |
857
863
  | `append:icon` | `string \| undefined` | | | Name of the icon to be added at the end of the input. |
@@ -917,29 +923,29 @@ label>')` matches nothing; query each segment by its own label instead. See
917
923
  | `suffix` | The `#suffix` slot's wrapper, inside the box after the input. |
918
924
  | `clear` | The ✕ that empties this control (`clearable`) — one node, never a chip's own ✕. |
919
925
  | `activator` | The button in the box that opens the calendar. Merged after the picker's own activator props and handlers, so a listener of yours runs after ours. Its glyph is not a part. |
920
- | `panel` | The calendar box — the popover's painted bubble on desktop, the box inside the sheet on a phone. It carries the calendar's sizing tokens (`pt:panel="[--cell:36px]"`). |
926
+ | `panel` | The calendar surface — the popover's painted bubble on desktop, the sheet itself on a phone. It carries the calendar's sizing tokens (`pt:panel="[--cell:36px]"`). |
921
927
  | `sheet` | The bottom sheet around the calendar on a phone only. |
922
928
  | `header` | The navigation bar: the previous / next arrows and the month / year headings. |
923
929
  | `arrow` | The previous / next buttons — a broadcast. |
924
930
  | `month` | The month heading button; it opens the month panel. |
925
931
  | `year` | The year heading button; it opens the year panel. |
926
- | `column-header` | Each weekday letter above the grid — a broadcast. |
927
- | `day` | One whole day cell — a broadcast resolved per day. A background here paints the full cell square; restyle the round mark on `day-button`. |
928
- | `day-button` | The button inside a day cell — the mark that shows selection. A broadcast resolved per day. |
929
- | `month-item` | One month button of the month panel (the home grid of `type="month"`) — a broadcast resolved per month. |
930
- | `year-item` | One year button of the year list — a broadcast resolved per year. |
932
+ | `columnHeader` | Each weekday letter above the grid — a broadcast. |
933
+ | `day` | One whole day cell — a broadcast resolved per day. A background here paints the full cell square; restyle the round mark on `dayButton`. |
934
+ | `dayButton` | The button inside a day cell — the mark that shows selection. A broadcast resolved per day. |
935
+ | `monthItem` | One month button of the month panel (the home grid of `type="month"`) — a broadcast resolved per month. |
936
+ | `yearItem` | One year button of the year list — a broadcast resolved per year. |
931
937
 
932
938
  States are listed in precedence order: when two are on at once and their entries conflict, the later one wins.
933
939
 
934
940
  | State | When it is on |
935
941
  | --- | --- |
936
- | `has-value` | Component-wide: the control holds a value, by its own rule (`0` counts on `BbNumberInput`, `''` on `BbColorInput`). |
937
- | `outside` | Per node, on `day` / `day-button`: a day of the previous or next month, shown to fill the grid. |
938
- | `today` | Per node, on `day` / `day-button`: today. |
939
- | `in-range` | Per node, on the cells (`day`, `day-button`, `month-item`, `year-item`): inside a committed range, between its ends. |
942
+ | `hasValue` | Component-wide: the control holds a value, by its own rule (`0` counts on `BbNumberInput`, `''` on `BbColorInput`). |
943
+ | `outside` | Per node, on `day` / `dayButton`: a day of the previous or next month, shown to fill the grid. |
944
+ | `today` | Per node, on `day` / `dayButton`: today. |
945
+ | `inRange` | Per node, on the cells (`day`, `dayButton`, `monthItem`, `yearItem`): inside a committed range, between its ends. |
940
946
  | `selected` | Per node, on the cells: a chosen day, month or year. |
941
- | `range-start` | Per node, on the cells: a committed range's first day, month or year. |
942
- | `range-end` | Per node, on the cells: a committed range's last day, month or year. |
947
+ | `rangeStart` | Per node, on the cells: a committed range's first day, month or year. |
948
+ | `rangeEnd` | Per node, on the cells: a committed range's last day, month or year. |
943
949
  | `readonly` | Component-wide: the control is `readonly` — shown, focusable, not editable. |
944
950
  | `disabled` | Component-wide while the input is `disabled`. Also per node, on the calendar's cells: one outside `min` / `max` or refused by `selectable`; on `arrow`, at a bound or while the month / year panel is open. |
945
951
  | `warnings` | Component-wide: the control is in its warning state (`warnings` / `has-warnings`) and not in an error state — errors win, so the two are never on together. |
@@ -974,6 +980,8 @@ States are listed in precedence order: when two are on at once and their entries
974
980
  - `prepend` — scope: `object` — Content rendered before the date fields, at the start of the field box.
975
981
  - `prepend-outer` — scope: `object` — Content rendered before the entire date picker control, outside the input chrome.
976
982
  - `suffix` — scope: `object` — Inline content rendered at the end of the input field area, after the date fields.
983
+ - `#<YYYY_MM_DD>` (named from data) — scope: `BbCalendarDaySlotProps` — One date's button label (e.g. `#2024_03_15`: the local `YYYY-MM-DD` through `slotKey`); beats `day`. Day grid only.
984
+ - `#append:<YYYY_MM_DD>` (named from data) — scope: `BbCalendarDaySlotProps` — Content under one date's cell; beats `append:day`.
977
985
 
978
986
  ## Validated variant
979
987
 
@@ -1002,9 +1010,9 @@ Set these on the element, or on a class you put on it, to retune this component
1002
1010
  - **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).
1003
1011
  - 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`.
1004
1012
 
1005
- - `BbDatePickerInput` _(this component)_ — its own template binds: `controlAttrs` → `input.bb-segmented-field__field`, `input` → `input.bb-segmented-field__field`, `activator` → `button.bb-segmented-field__trigger-btn`, `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)
1006
- - `BbDatePicker` _(public — [contract](./BbDatePicker.md))_ — its own pt parts (`BbDatePicker`): `panel` → `div`, `panel` → `CommonPopover`; hands `BbCalendar` the pt map ` passthrough.forward(DATE_PICKER_CALENDAR_PARTS, BB_CALENDAR_PT.states) ` (ours → theirs); hands `BbOffCanvas` the pt map `{ sheet: 'root' }` (ours → theirs); documented CSS variables: `--cell`, `--day-slot-allowance`, `--unit-row`, `--sheet-cell`, `--cell`; also mounts `CommonPopover`
1007
- - `BbCalendar` _(public — [contract](./BbCalendar.md))_ — its own pt parts (`BbCalendar`): `header` → `div.bb-calendar__controls`, `arrow` → `BbBaseButton`, `month` → `BbBaseButton`, `year` → `BbBaseButton`, `day` → `div.bb-calendar__date`, `day-button` → `button.bb-calendar__date-button`; documented CSS variables: `--cell`, `--day-slot-allowance`, `--unit-row`; also mounts `ScaleFade`, `Slide`, `CalendarMonthPanel`, `CalendarYearPanel`
1013
+ - `BbDatePickerInput` _(this component)_ — its own template binds: `controlAttrs` → `input.bb-segmented-field__field`, `input` → `input.bb-segmented-field__field`, `activator` → `button.bb-segmented-field__trigger-btn`, `suffix` → `span.bb-field-input__suffix`; hands `BbDatePicker` the pt map `{ panel: 'panel', sheet: 'sheet', header: 'header', arrow: 'arrow', month: 'month', year: 'year', columnHeader: 'columnHeader', day: 'day', dayButton: 'dayButton', monthItem: 'monthItem', yearItem: 'yearItem', }` (ours → theirs)
1014
+ - `BbDatePicker` _(public — [contract](./BbDatePicker.md))_ — its own pt parts (`BbDatePicker`): `panel` → `div`, `panel` → `CommonPopover`; hands `BbCalendar` the pt map ` passthrough.forward(DATE_PICKER_CALENDAR_PARTS, BB_CALENDAR_PT.states) ` (ours → theirs); hands `BbOffCanvas` the pt map `{ panel: 'root', sheet: 'root' }` (ours → theirs); documented CSS variables: `--cell`, `--day-slot-allowance`, `--unit-row`; also mounts `CommonPopover`
1015
+ - `BbCalendar` _(public — [contract](./BbCalendar.md))_ — its own pt parts (`BbCalendar`): `header` → `div.bb-calendar__controls`, `arrow` → `BbBaseButton`, `month` → `BbBaseButton`, `year` → `BbBaseButton`, `day` → `div.bb-calendar__date`, `dayButton` → `button.bb-calendar__date-button`; documented CSS variables: `--cell`, `--day-slot-allowance`, `--unit-row`; also mounts `ScaleFade`, `Slide`, `CalendarMonthPanel`, `CalendarYearPanel`
1008
1016
  - `BbBaseButton` _(public — [contract](./BbBaseButton.md))_ — its own pt parts (`BbBaseButton`): `root` → `RouterComponent`, `root` → `a`, `root` → `component`; also mounts `RouterComponent`
1009
1017
  - `CommonTimeSelector` _(internal — not importable, reach it through `BbCalendar`)_ — documented CSS variables: `--time-mark`; also mounts `BbBaseButton`
1010
1018
  - `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`, `--handle-w`, `--handle-h`, `--handle-bg`, `--close-size`
@@ -715,14 +715,14 @@ Dialogs sharing a `stack` name **replace** one another: only the most recently
715
715
  opened member is visible, the ones beneath are hidden until it closes — the
716
716
  stack reads as a single surface whose content swaps as you drill in. When a
717
717
  member closes, the one beneath crossfades in as it fades out. Each stacked
718
- member dims what lies beneath it (via `--bb-overlay-stacked`, half of
719
- `--bb-overlay` by default); only the bottom member blurs, and its backdrop is
718
+ member dims what lies beneath it (via `--bb-overlay-stacked`, the same
719
+ dim as `--bb-overlay` by default); only the bottom member blurs, and its backdrop is
720
720
  never handed off while members swap above it, so the page behind never
721
721
  re-blurs between them. Set `--bb-overlay-stacked: transparent` for a single
722
722
  dim under the whole stack. The backdrop split follows the **open order of
723
723
  every dialog**, whatever its `stack` name or none, exactly as for
724
724
  off-canvases: the bottom-most open dialog blurs and dims, each one opened
725
- above it adds the lighter stacked dim. The `stack` name only decides
725
+ above it adds the stacked dim. The `stack` name only decides
726
726
  cover/replace. Dialogs with different names (or none) therefore pile up
727
727
  visibly, each dimming the one beneath. Use a stack for a two-step flow that
728
728
  should not read as two boxes piling up.