bitboss-ui 3.0.0-beta.48 → 3.0.0-beta.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -7
- package/bin/bitboss-ui-mcp.mjs +15 -3
- package/bin/bitboss-ui.mjs +115 -13
- package/dist/ai/BbAvatar.md +1 -1
- package/dist/ai/BbBreadcrumbs.md +65 -65
- package/dist/ai/BbButton.md +16 -5
- package/dist/ai/BbCheckbox.md +0 -2
- package/dist/ai/BbCheckboxGroup.md +13 -20
- package/dist/ai/BbDatePickerInput.md +4 -2
- package/dist/ai/BbDialog.md +1 -8
- package/dist/ai/BbDropdown.md +231 -220
- package/dist/ai/BbDropdownButton.md +65 -65
- package/dist/ai/BbDropdownGroup.md +2 -2
- package/dist/ai/BbDropzone.md +10 -10
- package/dist/ai/BbForm.md +43 -52
- package/dist/ai/BbHoverCard.md +4 -2
- package/dist/ai/BbNumberInput.md +88 -21
- package/dist/ai/BbPopover.md +29 -23
- package/dist/ai/BbProgress.md +48 -22
- package/dist/ai/BbRadioGroup.md +13 -19
- package/dist/ai/BbSelect.md +16 -36
- package/dist/ai/BbSelectPopover.md +14 -30
- package/dist/ai/BbSmoothHeight.md +0 -2
- package/dist/ai/BbSwitchGroup.md +13 -20
- package/dist/ai/BbTable.md +11 -10
- package/dist/ai/BbTabs.md +106 -105
- package/dist/ai/BbTabsList.md +2 -2
- package/dist/ai/BbTabsPanels.md +1 -1
- package/dist/ai/BbTabsRoot.md +2 -2
- package/dist/ai/BbTooltip.md +24 -10
- package/dist/ai/BbTree.md +14 -11
- package/dist/ai/changelog.json +256 -5
- package/dist/ai/components.json +36 -34
- package/dist/ai/composables/useBbDropdownContext.md +16 -16
- package/dist/ai/composables/useBbFormField.md +5 -1
- package/dist/ai/composables/useBbTabsContext.md +14 -14
- package/dist/ai/guides/agent-contract.md +27 -27
- package/dist/ai/guides/ai-router.md +1 -1
- package/dist/ai/guides/component-picker.md +3 -3
- package/dist/ai/guides/fetch-items-playbook.md +1 -1
- package/dist/ai/guides/icons-policy.md +10 -10
- package/dist/ai/guides/inertia-helpers.md +120 -67
- package/dist/ai/guides/installation-and-plugin-setup.md +43 -15
- package/dist/ai/guides/migration/components/bb-breadcrumbs.md +3 -2
- package/dist/ai/guides/migration/components/bb-checkbox-group.md +16 -16
- package/dist/ai/guides/migration/components/bb-dropdown-button.md +9 -8
- package/dist/ai/guides/migration/components/bb-dropdown.md +15 -14
- package/dist/ai/guides/migration/components/bb-radio-group.md +2 -1
- package/dist/ai/guides/migration/components/bb-select-popover.md +6 -1
- package/dist/ai/guides/migration/components/bb-select.md +10 -2
- package/dist/ai/guides/migration/components/bb-switch-group.md +2 -1
- package/dist/ai/guides/migration/components/bb-tabs.md +9 -8
- package/dist/ai/guides/migration/components/bb-tooltip.md +1 -1
- package/dist/ai/guides/migration/v2-to-v3.md +114 -17
- package/dist/ai/guides/migration/v3-beta-tooling.md +11 -0
- package/dist/ai/guides/options-items-playbook.md +30 -24
- package/dist/ai/guides/passthrough.md +2 -2
- package/dist/ai/guides/preset-components.md +18 -3
- package/dist/ai/guides/typescript-generic-components.md +1 -1
- package/dist/ai/guides/validated-forms.md +11 -22
- package/dist/ai/guides/validation-providers.md +4 -3
- package/dist/ai/helpers/inertia/manifest.json +636 -0
- package/dist/ai/helpers/inertia/types.ts +15 -0
- package/dist/ai/helpers/inertia/useAsyncFn.ts +110 -0
- package/dist/ai/helpers/inertia/useConfirmOnRouteLeave.ts +102 -0
- package/dist/ai/helpers/inertia/useDeleteCmd.ts +30 -0
- package/dist/ai/helpers/inertia/useHasChanged.ts +36 -0
- package/dist/ai/helpers/inertia/useIndexById.ts +23 -0
- package/dist/ai/helpers/inertia/useLazyProp.ts +148 -0
- package/dist/ai/helpers/inertia/useLazyPropGetter.ts +50 -0
- package/dist/ai/helpers/inertia/useLoading.ts +20 -0
- package/dist/ai/helpers/inertia/usePaginatedResponseContext.ts +88 -0
- package/dist/ai/helpers/inertia/usePromiseForm.ts +62 -0
- package/dist/ai/helpers/inertia/useProp.ts +63 -0
- package/dist/ai/helpers/inertia/useQuery.ts +19 -0
- package/dist/ai/helpers/inertia/useQueryObject.ts +116 -0
- package/dist/ai/helpers/inertia/useResourceContext.ts +69 -0
- package/dist/ai/helpers/inertia/useRouteQuery.ts +54 -0
- package/dist/ai/helpers/inertia/useScreenSizes.ts +23 -0
- package/dist/ai/helpers/inertia/useTableContext.ts +34 -0
- package/dist/ai/helpers/inertia/useTableSelectionContext.ts +48 -0
- package/dist/ai/helpers/inertia/useUntil.ts +33 -0
- package/dist/ai/helpers/inertia/utils.ts +24 -0
- package/dist/ai/index.md +6 -6
- package/dist/ai/manifest/components/BbBreadcrumbs.json +10 -6
- package/dist/ai/manifest/components/BbBreadcrumbs.tree.json +1 -1
- package/dist/ai/manifest/components/BbButton.json +1 -1
- package/dist/ai/manifest/components/BbCheckboxGroup.json +2 -2
- package/dist/ai/manifest/components/BbDropdown.json +23 -20
- package/dist/ai/manifest/components/BbDropdown.tree.json +2 -2
- package/dist/ai/manifest/components/BbDropdownButton.json +22 -19
- package/dist/ai/manifest/components/BbDropdownButton.tree.json +1 -1
- package/dist/ai/manifest/components/BbDropdownGroup.json +2 -2
- package/dist/ai/manifest/components/BbForm.json +1 -0
- package/dist/ai/manifest/components/BbNumberInput.json +6 -1
- package/dist/ai/manifest/components/BbNumberInput.tree.json +2 -1
- package/dist/ai/manifest/components/BbPopover.json +1 -0
- package/dist/ai/manifest/components/BbProgress.json +6 -6
- package/dist/ai/manifest/components/BbProgress.tree.json +1 -0
- package/dist/ai/manifest/components/BbRadioGroup.json +2 -2
- package/dist/ai/manifest/components/BbSelect.json +2 -2
- package/dist/ai/manifest/components/BbSelectPopover.json +2 -2
- package/dist/ai/manifest/components/BbSwitchGroup.json +2 -2
- package/dist/ai/manifest/components/BbTabs.json +7 -6
- package/dist/ai/manifest/components/BbTabsList.json +3 -3
- package/dist/ai/manifest/components/BbTabsPanels.json +1 -1
- package/dist/ai/manifest/components/BbTabsRoot.json +5 -4
- package/dist/ai/manifest/components/BbTooltip.json +1 -1
- package/dist/ai/manifest/index.json +2 -2
- package/dist/ai/manifest/meta.json +2 -0
- package/dist/ai/manifest/types.advanced.json +10 -9
- package/dist/ai/manifest/types.api.json +5 -4
- package/dist/ai/recipes/inertia/approvals-inbox.md +16 -18
- package/dist/ai/recipes/inertia/inline-edit-workspace.md +23 -33
- package/dist/ai/recipes/inertia/layout-scaffold.md +16 -16
- package/dist/ai/recipes/inertia/onboarding.md +6 -10
- package/dist/ai/recipes/inertia/ownership-atlas.md +15 -18
- package/dist/ai/recipes/inertia/record-form.md +11 -11
- package/dist/ai/recipes/inertia/records-workspace.md +38 -41
- package/dist/ai/recipes/inertia/settings-workspace.md +26 -38
- package/dist/ai/recipes/inertia/upload-center.md +31 -39
- package/dist/ai/recipes/inertia/wizard-form.md +10 -19
- package/dist/ai/recipes/nuxt/approvals-inbox.md +7 -8
- package/dist/ai/recipes/nuxt/inline-edit-workspace.md +14 -24
- package/dist/ai/recipes/nuxt/layout-scaffold.md +16 -16
- package/dist/ai/recipes/nuxt/onboarding.md +2 -6
- package/dist/ai/recipes/nuxt/ownership-atlas.md +7 -9
- package/dist/ai/recipes/nuxt/record-form.md +5 -5
- package/dist/ai/recipes/nuxt/records-workspace.md +29 -31
- package/dist/ai/recipes/nuxt/settings-workspace.md +22 -34
- package/dist/ai/recipes/nuxt/upload-center.md +22 -29
- package/dist/ai/recipes/nuxt/wizard-form.md +3 -11
- package/dist/ai/recipes/vue/approvals-inbox.md +7 -8
- package/dist/ai/recipes/vue/inline-edit-workspace.md +14 -24
- package/dist/ai/recipes/vue/layout-scaffold.md +16 -16
- package/dist/ai/recipes/vue/onboarding.md +2 -6
- package/dist/ai/recipes/vue/ownership-atlas.md +7 -9
- package/dist/ai/recipes/vue/record-form.md +5 -5
- package/dist/ai/recipes/vue/records-workspace.md +29 -31
- package/dist/ai/recipes/vue/settings-workspace.md +22 -34
- package/dist/ai/recipes/vue/upload-center.md +22 -29
- package/dist/ai/recipes/vue/wizard-form.md +3 -11
- package/dist/ai/source/BbAccordion.md +1 -1
- package/dist/ai/source/BbAlert.md +3 -3
- package/dist/ai/source/BbBadge.md +2 -2
- package/dist/ai/source/BbBadgeButton.md +5 -4
- package/dist/ai/source/BbBaseButton.md +1 -1
- package/dist/ai/source/BbBaseRadioIcon.md +1 -0
- package/dist/ai/source/BbBaseSwitchIcon.md +1 -0
- package/dist/ai/source/BbBreadcrumbs.md +63 -42
- package/dist/ai/source/BbButton.md +71 -33
- package/dist/ai/source/BbCalendar.md +17 -16
- package/dist/ai/source/BbCheckbox.md +3 -2
- package/dist/ai/source/BbCheckboxGroup.md +11 -4
- package/dist/ai/source/BbColorInput.md +10 -9
- package/dist/ai/source/BbConfirm.md +1 -1
- package/dist/ai/source/BbConfirmPortal.md +1 -1
- package/dist/ai/source/BbDatePicker.md +2 -2
- package/dist/ai/source/BbDatePickerInput.md +47 -20
- package/dist/ai/source/BbDialog.md +5 -5
- package/dist/ai/source/BbDropdown.md +230 -158
- package/dist/ai/source/BbDropdownButton.md +19 -12
- package/dist/ai/source/BbDropdownGroup.md +126 -93
- package/dist/ai/source/BbForm.md +25 -1
- package/dist/ai/source/BbIndicator.md +4 -0
- package/dist/ai/source/BbNumberInput.md +855 -19
- package/dist/ai/source/BbOffCanvas.md +27 -11
- package/dist/ai/source/BbPagination.md +3 -3
- package/dist/ai/source/BbPopover.md +152 -8
- package/dist/ai/source/BbPopoverPortal.md +11 -0
- package/dist/ai/source/BbProgress.md +82 -18
- package/dist/ai/source/BbRadioGroup.md +12 -5
- package/dist/ai/source/BbRating.md +11 -9
- package/dist/ai/source/BbSelect.md +16 -10
- package/dist/ai/source/BbSelectPopover.md +29 -23
- package/dist/ai/source/BbSlider.md +12 -6
- package/dist/ai/source/BbSwitch.md +3 -2
- package/dist/ai/source/BbSwitchGroup.md +5 -2
- package/dist/ai/source/BbTable.md +102 -18
- package/dist/ai/source/BbTabs.md +27 -23
- package/dist/ai/source/BbTabsList.md +26 -22
- package/dist/ai/source/BbTabsPanels.md +26 -22
- package/dist/ai/source/BbTabsRoot.md +25 -21
- package/dist/ai/source/BbTag.md +10 -9
- package/dist/ai/source/BbTextInput.md +5 -4
- package/dist/ai/source/BbTextarea.md +6 -5
- package/dist/ai/source/BbTimePicker.md +1 -1
- package/dist/ai/source/BbTimePickerInput.md +46 -9
- package/dist/ai/source/BbToast.md +10 -7
- package/dist/ai/source/BbToastPortal.md +10 -7
- package/dist/ai/source/BbTooltip.md +54 -8
- package/dist/ai/source/BbTree.md +21 -3
- package/dist/ai/source/CommonField.md +6 -4
- package/dist/ai/source/CommonFieldInput.md +15 -10
- package/dist/ai/source/CommonPopover.md +6 -0
- package/dist/ai/source/CommonTimeSelector.md +5 -4
- package/dist/components/BbBadge/BbBadgeButton.vue_vue_type_script_setup_true_lang.js +10 -8
- package/dist/components/BbBaseButton/BbBaseButton.vue_vue_type_script_setup_true_lang.js +8 -8
- package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue_vue_type_script_setup_true_lang.js +45 -45
- package/dist/components/BbBreadcrumbs/types.d.ts +25 -17
- package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +84 -71
- package/dist/components/BbButton/toggleRoving.d.ts +6 -0
- package/dist/components/BbButton/toggleRoving.js +45 -0
- package/dist/components/BbButton/types.d.ts +4 -1
- package/dist/components/BbCalendar/BbCalendar.vue_vue_type_script_setup_true_lang.js +178 -178
- package/dist/components/BbCalendar/CalendarMonthPanel.vue_vue_type_script_setup_true_lang.js +15 -15
- package/dist/components/BbCalendar/CalendarYearPanel.vue_vue_type_script_setup_true_lang.js +28 -28
- package/dist/components/BbCalendar/useCalendarGrid.js +141 -139
- package/dist/components/BbCalendar/useDayjsLocale.d.ts +38 -15
- package/dist/components/BbCalendar/useDayjsLocale.js +31 -30
- package/dist/components/BbCheckbox/BbCheckbox.vue_vue_type_script_setup_true_lang.js +48 -48
- package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +81 -80
- package/dist/components/BbCheckboxGroup/types.d.ts +6 -2
- package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +69 -69
- package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +363 -349
- package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +91 -86
- package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +298 -289
- package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +322 -356
- package/dist/components/BbDropdown/DropdownPipelineResolver.vue_vue_type_script_setup_true_lang.js +17 -15
- package/dist/components/BbDropdown/DropdownRow.vue.d.ts +40 -0
- package/dist/components/BbDropdown/DropdownRow.vue.js +5 -0
- package/dist/components/BbDropdown/DropdownRow.vue_vue_type_script_setup_true_lang.js +60 -0
- package/dist/components/BbDropdown/normalizeGroups.d.ts +8 -2
- package/dist/components/BbDropdown/normalizeGroups.js +60 -46
- package/dist/components/BbDropdown/types.d.ts +119 -88
- package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +11 -2
- package/dist/components/BbDropdownButton/types.d.ts +2 -2
- package/dist/components/BbForm/BbForm.vue.d.ts +9 -0
- package/dist/components/BbForm/BbForm.vue_vue_type_script_setup_true_lang.js +114 -105
- package/dist/components/BbForm/BbFormCustomField.js +1 -1
- package/dist/components/BbForm/bindFormField.js +2 -1
- package/dist/components/BbForm/formFields.d.ts +5 -0
- package/dist/components/BbNumberInput/BbNumberInput.vue.d.ts +0 -1
- package/dist/components/BbNumberInput/BbNumberInput.vue_vue_type_script_setup_true_lang.js +452 -125
- package/dist/components/BbNumberInput/numberDisplay.d.ts +256 -0
- package/dist/components/BbNumberInput/numberDisplay.js +499 -0
- package/dist/components/BbNumberInput/types.d.ts +54 -1
- package/dist/components/BbNumberInput/warroom/corpus.d.ts +58 -0
- package/dist/components/BbNumberInput/warroom/currency-verify.rows.d.ts +28 -0
- package/dist/components/BbNumberInput/warroom/currency.rows.d.ts +2 -0
- package/dist/components/BbNumberInput/warroom/harness.d.ts +217 -0
- package/dist/components/BbNumberInput/warroom/oracle.d.ts +150 -0
- package/dist/components/BbPagination/BbPagination.vue_vue_type_script_setup_true_lang.js +7 -7
- package/dist/components/BbPopover/BbPopover.vue.d.ts +1 -0
- package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +207 -164
- package/dist/components/BbPopover/types.d.ts +11 -0
- package/dist/components/BbProgress/BbProgress.vue_vue_type_script_setup_true_lang.js +15 -7
- package/dist/components/BbProgress/types.d.ts +23 -7
- package/dist/components/BbProgress/types.js +1 -1
- package/dist/components/BbRadioGroup/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +102 -101
- package/dist/components/BbRadioGroup/types.d.ts +6 -2
- package/dist/components/BbRating/BbRating.vue_vue_type_script_setup_true_lang.js +63 -63
- package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +156 -154
- package/dist/components/BbSelect/types.d.ts +6 -2
- package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +2 -1
- package/dist/components/BbSelectPopover/types.d.ts +6 -2
- package/dist/components/BbSlider/BbSlider.vue_vue_type_script_setup_true_lang.js +153 -153
- package/dist/components/BbSwitch/BbSwitch.vue_vue_type_script_setup_true_lang.js +62 -62
- package/dist/components/BbSwitchGroup/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +131 -130
- package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +711 -676
- package/dist/components/BbTabs/BbTabs.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/BbTabs/BbTabsList.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/BbTabs/types.d.ts +25 -21
- package/dist/components/BbTag/BbTag.vue_vue_type_script_setup_true_lang.js +76 -76
- package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +58 -58
- package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +82 -82
- package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +246 -236
- package/dist/components/BbTooltip/BbTooltip.vue_vue_type_script_setup_true_lang.js +102 -97
- package/dist/components/BbTooltip/tooltipWarmup.d.ts +23 -0
- package/dist/components/BbTooltip/tooltipWarmup.js +7 -0
- package/dist/components/BbTooltip/types.d.ts +7 -2
- package/dist/components/BbTree/BbTree.vue_vue_type_script_setup_true_lang.js +29 -21
- package/dist/components/BbTree/BbTreeLevel.vue_vue_type_script_setup_true_lang.js +10 -7
- package/dist/components/CommonFieldInput/CommonFieldInput.vue_vue_type_script_setup_true_lang.js +37 -36
- package/dist/components/CommonTimeSelector/CommonTimeSelector.vue_vue_type_script_setup_true_lang.js +9 -9
- package/dist/composables/formSubmitLock.d.ts +6 -0
- package/dist/composables/formSubmitLock.js +4 -0
- package/dist/composables/useBaseOptions.d.ts +7 -1
- package/dist/composables/useBaseOptions.js +32 -32
- package/dist/composables/useBbDropdownContext.d.ts +8 -8
- package/dist/composables/useBbFormField.d.ts +9 -0
- package/dist/composables/useBbFormField.js +5 -3
- package/dist/composables/useBbTabsContext.d.ts +10 -10
- package/dist/composables/useBbTabsContext.js +18 -18
- package/dist/composables/useFormBinding.d.ts +11 -0
- package/dist/composables/useFormBinding.js +15 -13
- package/dist/composables/useItemText.d.ts +5 -1
- package/dist/composables/useItemText.js +8 -3
- package/dist/composables/useItemValue.d.ts +5 -1
- package/dist/composables/useItemValue.js +8 -3
- package/dist/composables/useLocale.js +10 -9
- package/dist/deprecation/ai-deprecations.json.d.ts +130 -0
- package/dist/deprecation/ai-deprecations.json.js +1 -1
- package/dist/deprecation/removedProps.js +1 -1
- package/dist/directives/bbDropdown.js +1 -1
- package/dist/i18n/index.d.ts +7 -12
- package/dist/i18n/locales/cs.json +11 -14
- package/dist/i18n/locales/da.json +13 -16
- package/dist/i18n/locales/de-CH.json +137 -0
- package/dist/i18n/locales/de.json +14 -17
- package/dist/i18n/locales/el.json +10 -13
- package/dist/i18n/locales/en-GB.json +137 -0
- package/dist/i18n/locales/en.json +8 -11
- package/dist/i18n/locales/es-MX.json +137 -0
- package/dist/i18n/locales/es.json +16 -19
- package/dist/i18n/locales/fi.json +8 -11
- package/dist/i18n/locales/fr.json +23 -26
- package/dist/i18n/locales/hu.json +8 -11
- package/dist/i18n/locales/it.json +12 -15
- package/dist/i18n/locales/ja.json +13 -16
- package/dist/i18n/locales/ko.json +10 -13
- package/dist/i18n/locales/nb.json +13 -16
- package/dist/i18n/locales/nl.json +21 -24
- package/dist/i18n/locales/pl.json +10 -13
- package/dist/i18n/locales/{pt.json → pt-BR.json} +19 -22
- package/dist/i18n/locales/pt-PT.json +137 -0
- package/dist/i18n/locales/ro.json +22 -25
- package/dist/i18n/locales/ru.json +11 -14
- package/dist/i18n/locales/sv.json +16 -19
- package/dist/i18n/locales/tr.json +14 -17
- package/dist/i18n/locales/uk.json +11 -14
- package/dist/i18n/locales/{zh-cn.json → zh-CN.json} +10 -13
- package/dist/i18n/locales/zh-HK.json +137 -0
- package/dist/i18n/locales/zh-TW.json +137 -0
- package/dist/i18n/regionHints.d.ts +16 -0
- package/dist/i18n/regionHints.js +49 -0
- package/dist/i18n/regions.d.ts +286 -0
- package/dist/i18n/regions.js +265 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +4 -4
- package/dist/llms-full.txt +1785 -1637
- package/dist/llms-medium.txt +74 -46
- package/dist/llms.txt +7 -7
- package/dist/locale-blueprint.json +16 -13
- package/dist/styles.css +2 -2
- package/dist/types/ptComponentMap.d.ts +1 -1
- package/dist/utilities/functions/slotKey.d.ts +2 -2
- package/dist/utils/versionCheck.js +1 -1
- package/dist/vite-plugin.d.ts +22 -19
- package/dist/vite.js +309 -297
- package/llms.txt +7 -7
- package/package.json +5 -3
- package/scripts/lib/agent-manifest.mjs +2 -1
- package/scripts/lib/eslint-disable.mjs +12 -4
- package/scripts/lib/eslint-plugin.d.ts +5 -1
- package/scripts/lib/eslint-plugin.mjs +187 -6
- package/scripts/lib/helper-canon.mjs +176 -0
- package/scripts/lib/helpers-add.mjs +1303 -0
- package/scripts/lib/local-components.mjs +33 -4
- package/scripts/lib/locale-check.mjs +165 -0
- package/scripts/lib/redundant-item-accessor.mjs +398 -0
- package/scripts/lib/renamed-item-field.mjs +343 -0
- package/scripts/lib/slot-key.mjs +2 -2
- package/scripts/lib/slot-renames.mjs +1 -1
- package/scripts/lib/validate-bb-markup.mjs +123 -56
- package/dist/i18n/index.js +0 -27
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: 'Migration v2→v3: BbDropdownButton'
|
|
3
|
-
summary: autoLoading renamed to disableAutoLoading, disabledWhileLoading and theme removed.
|
|
3
|
+
summary: autoLoading renamed to disableAutoLoading, disabledWhileLoading and theme removed; items are { label, value } rows like BbDropdown's.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# BbDropdownButton — v2 → v3
|
|
7
7
|
|
|
8
8
|
## Changes
|
|
9
9
|
|
|
10
|
-
| v2 | v3
|
|
11
|
-
| ------------------------------------------------- |
|
|
12
|
-
| `autoLoading?: boolean` (default `true`) | `disableAutoLoading?: boolean` (default `false`)
|
|
13
|
-
| `disabledWhileLoading?: boolean` (default `true`) | removed
|
|
14
|
-
| `theme?: string` | removed
|
|
15
|
-
| `arrowPadding` | removed
|
|
16
|
-
| — | `toggle:icon?: IconType`
|
|
10
|
+
| v2 | v3 | Kind |
|
|
11
|
+
| ------------------------------------------------- | ------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------- |
|
|
12
|
+
| `autoLoading?: boolean` (default `true`) | `disableAutoLoading?: boolean` (default `false`) | rename, polarity inverted — same effective default |
|
|
13
|
+
| `disabledWhileLoading?: boolean` (default `true`) | removed | always disabled while loading now; `BbButton`'s `interactive-while-loading` is the escape hatch on plain buttons |
|
|
14
|
+
| `theme?: string` | removed | use `variant` (shares `ButtonVariantType`) |
|
|
15
|
+
| `arrowPadding` | removed | dead prop (no arrow on dropdown surfaces) |
|
|
16
|
+
| — | `toggle:icon?: IconType` | additive — replaces the default toggle chevron (spelled `right:icon` up to beta.33) |
|
|
17
|
+
| items `{ key, text }` (v2, and v3 up to beta.48) | items `{ value, label }` — the same rows as `BbDropdown`; the main button reads `items[0].label` | hard rename — `npx bitboss-ui check --fix` rewrites literal items; see [bb-dropdown.md](./bb-dropdown.md) |
|
|
17
18
|
|
|
18
19
|
## Edits
|
|
19
20
|
|
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: 'Migration v2→v3: BbDropdown'
|
|
3
|
-
summary:
|
|
3
|
+
summary: Rows are { label, value } (v2 and v3 up to beta.48 { key, text }), groups are named by id; rows can carry variants/submenus; arrowPadding removed; adaptive mobile sheet on by default.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# BbDropdown / `v-bb-dropdown` — v2 → v3
|
|
7
7
|
|
|
8
8
|
## Changes
|
|
9
9
|
|
|
10
|
-
| v2 | v3
|
|
11
|
-
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
12
|
-
| items extended `BaseButtonProps` | items extend `BbBaseButtonProps`
|
|
13
|
-
| item label conventions | `text` is the expected label field; `description` renders a second line
|
|
14
|
-
| `arrowPadding` | removed
|
|
15
|
-
| exposed `loading` (via template ref) | removed
|
|
16
|
-
| — | item `variant?: DropdownItemVariantType` (`default, destructive`), recursive `items` submenus, config-driven **groups** (titled/selectable/async sections via `BbDropdownGroup`), `adaptive` + `offCanvasProps`, `anchor`
|
|
17
|
-
| async (pipeline) group rows copied `BbBaseButton` props, icons, `variant`, `onClick` and `disabled` off each raw item | a fetched row takes text/value from `itemText`/`itemValue` and **every other field only from `itemProps`**; per-row `disabled` becomes a `selectable` predicate on the group
|
|
18
|
-
| floating wrapper/bubble as `<span>` | rendered as `<div>`
|
|
19
|
-
| _(v3 prereleases up to beta.24 only; v2 had no panel)_ `span.bb-dropdown__panel` nested inside `.bb-common-popover__bubble` | one `<div>` carries both classes; `__header` / `__list` / `__footer` are its direct children
|
|
20
|
-
| _(v3 prereleases up to beta.30)_ a shared `item:append` lost to a row's `append:icon`; a named `#<key>:append` replaced the check and the submenu chevron; every row of a selectable group reserved its trailing region for the check | each row edge holds **one** occupant, strongest first. Trailing: the check (selected row only) → `#<key>:append` → the submenu chevron → `#<groupKey>:item:append` → `item:append` → `append:icon`. Leading: `#<key>:prepend` → `#<groupKey>:item:prepend` → `item:prepend` → `prepend:icon`
|
|
21
|
-
| _(v3 prereleases up to beta.33; v2 had no selectable groups)_ re-clicking the selected row of a single (non-`multiple`) selectable group cleared it (`item:unselected`, `v-model` → `null`) | the group behaves like a radio group: a re-click keeps the pick; the group field `clearable: true` restores clear-on-re-click
|
|
10
|
+
| v2 | v3 | Kind |
|
|
11
|
+
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
12
|
+
| items extended `BaseButtonProps` | items extend `BbBaseButtonProps` | transparent unless you typed items with the old export |
|
|
13
|
+
| item label conventions | `text` is the expected label field; `description` renders a second line | check items built as plain link objects |
|
|
14
|
+
| `arrowPadding` | removed | dead prop (dropdowns never show an arrow) |
|
|
15
|
+
| exposed `loading` (via template ref) | removed | read in-flight async state from the activator slot scope (`loading`) instead of a component ref. **⚠ silent**: a stale `dropdownRef.value?.loading` is `undefined`. |
|
|
16
|
+
| — | item `variant?: DropdownItemVariantType` (`default, destructive`), recursive `items` submenus, config-driven **groups** (titled/selectable/async sections via `BbDropdownGroup`), `adaptive` + `offCanvasProps`, `anchor` | additive |
|
|
17
|
+
| async (pipeline) group rows copied `BbBaseButton` props, icons, `variant`, `onClick` and `disabled` off each raw item | a fetched row takes text/value from `itemText`/`itemValue` and **every other field only from `itemProps`**; per-row `disabled` becomes a `selectable` predicate on the group | **⚠ silent**: a raw `href`/`prepend:icon`/`disabled` field is now ignored. Move it: `itemProps: { href: 'url', 'prepend:icon': 'icon' }`, `selectable: (item) => !item.disabled` |
|
|
18
|
+
| floating wrapper/bubble as `<span>` | rendered as `<div>` | DOM only — the menu is block content. Class hooks unchanged; only element selectors like `span.bb-common-popover` break. |
|
|
19
|
+
| _(v3 prereleases up to beta.24 only; v2 had no panel)_ `span.bb-dropdown__panel` nested inside `.bb-common-popover__bubble` | one `<div>` carries both classes; `__header` / `__list` / `__footer` are its direct children | DOM only, and only for projects already on a v3 prerelease. Every class name survives and the menu's sizes are unchanged; `span.bb-dropdown__panel` and `.bb-common-popover__bubble > .bb-dropdown__panel` now match nothing — write `.bb-dropdown__panel` alone. `pt:panel` used to reach an unpainted box inside the border; it now reaches the bordered surface itself. Submenus are unchanged. |
|
|
20
|
+
| _(v3 prereleases up to beta.30)_ a shared `item:append` lost to a row's `append:icon`; a named `#<key>:append` replaced the check and the submenu chevron; every row of a selectable group reserved its trailing region for the check | each row edge holds **one** occupant, strongest first. Trailing: the check (selected row only) → `#<key>:append` → the submenu chevron → `#<groupKey>:item:append` → `item:append` → `append:icon`. Leading: `#<key>:prepend` → `#<groupKey>:item:prepend` → `item:prepend` → `prepend:icon` | **⚠ silent**: an `item:append` now replaces the rows' `append:icon`; a `#<key>:append` on the selected row gives way to the check; unselected rows of a selectable group now show their `append:icon` or append slot. Nothing renders side by side — to keep an icon next to your slot content, draw both in the slot |
|
|
21
|
+
| _(v3 prereleases up to beta.33; v2 had no selectable groups)_ re-clicking the selected row of a single (non-`multiple`) selectable group cleared it (`item:unselected`, `v-model` → `null`) | the group behaves like a radio group: a re-click keeps the pick; the group field `clearable: true` restores clear-on-re-click | **⚠ silent**: no `item:unselected` and no `null` on a re-click. Add `clearable: true` to the group where click-to-clear was the UX |
|
|
22
|
+
| rows `{ key, text }` (v2, and v3 up to beta.48); groups `{ key, label }` (v3 only); a single-choice group with a `null` model showed no row checked | rows `{ value, label }` — `value` is the identity, any type (the selection value, compared by hash; the `#<value>` slots; the submenu id seed); groups `{ id, label }` (the `<BbDropdownGroup id>` word; `#<groupId>:item`); a `null` model checks the row whose `value` is `null`; slot scopes and `useBbDropdownContext` say `label` / `id` | hard rename, no alias — `npx bitboss-ui check --fix` (ESLint `bitboss-ui/no-renamed-item-field`) rewrites literal items; rows built in `.ts` or mapped from data need a hand pass (typed ones fail `vue-tsc`) |
|
|
22
23
|
|
|
23
24
|
## Edits
|
|
24
25
|
|
|
@@ -26,7 +27,7 @@ Fetched groups — raw-item fields move into `itemProps`:
|
|
|
26
27
|
|
|
27
28
|
```diff
|
|
28
29
|
{
|
|
29
|
-
|
|
30
|
+
id: 'assignee',
|
|
30
31
|
- selectable: true,
|
|
31
32
|
items: () => api.users(),
|
|
32
33
|
itemText: 'name',
|
|
@@ -11,4 +11,5 @@ surface, one set of changes. Everything is in
|
|
|
11
11
|
`legendPosition`, `direction` / `inputDirection` → `layout` / `listLayout`),
|
|
12
12
|
per-item `disabled` becoming inert (use `selectable`), the `bb-cr-container`
|
|
13
13
|
CSS block split per group, and the `--bb-checkbox-*` / `--bb-radio-*` /
|
|
14
|
-
`--bb-switch-*` variables becoming glyph locals
|
|
14
|
+
`--bb-switch-*` variables becoming glyph locals, and object items reading
|
|
15
|
+
their own `label` (else `text`) and `value` by default.
|
|
@@ -14,7 +14,7 @@ summary: flip and allowWriting inverted, arrow props removed, filterBy narrowed,
|
|
|
14
14
|
| `hideArrow` (default `true`), `arrowPadding` (default `10`) | removed | arrows are tooltip-only in v3; **⚠ silent** — `:hide-arrow="false"` (the only meaningful v2 use) now lands in `$attrs` and no arrow renders |
|
|
15
15
|
| `transitionDuration` default `300` | default `250` | visual — the panel now animates on the shared `transitions.medium` scale, like `BbDialog` |
|
|
16
16
|
| `filterBy` union (fn, `false`, `'not_stashed'`, …) | `filterBy?: string[]` (default `[]`) | retype — filter your `items`/provider instead |
|
|
17
|
-
| `itemText` / `itemValue` | `ItemAccessor<Item, …>` | retype
|
|
17
|
+
| `itemText` / `itemValue` | `ItemAccessor<Item, …>` | retype; left out, an object item reads its own `label` / `text` and `value` (see Behavior) |
|
|
18
18
|
| per-item `disabled` | inert — use `selectable` | **⚠ silent** |
|
|
19
19
|
| — | `anchor`, `adaptive` + `offCanvasProps`, `selectable`, `active` event, activator scope `text` / `selectedOptions` | additive |
|
|
20
20
|
|
|
@@ -52,6 +52,11 @@ the panel now has `#header` / `#footer`.
|
|
|
52
52
|
`(query, prefill, modelValue)`; `prefill === true` becomes
|
|
53
53
|
`reason !== 'search'`, a failure throws (never `return []`). **⚠ silent**
|
|
54
54
|
for untyped code — see [§6 item 37](../v2-to-v3.md).
|
|
55
|
+
- **Object items read their own `label` and `value`** (beta.49): no
|
|
56
|
+
`item-text` → the item's `label`, else `text`; no `item-value` → its
|
|
57
|
+
`value`, else the whole item. **⚠ silent** for items carrying a `value` key:
|
|
58
|
+
`v-model` gets that value, not the object. See
|
|
59
|
+
[§6 item 49](../v2-to-v3.md).
|
|
55
60
|
|
|
56
61
|
## Edits
|
|
57
62
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: 'Migration v2→v3: BbSelect'
|
|
3
|
-
summary: allowWriting inverted to disableWriting, filterBy narrowed to string[], prefill value renamed, chevron/options slots removed, and
|
|
3
|
+
summary: allowWriting inverted to disableWriting, filterBy narrowed to string[], prefill value renamed, chevron/options slots removed, and three behavior changes (second click, mount-time coherence, object items read their own label / value).
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# BbSelect — v2 → v3
|
|
@@ -17,7 +17,7 @@ summary: allowWriting inverted to disableWriting, filterBy narrowed to string[],
|
|
|
17
17
|
| `prefill?: boolean \| 'focus'` (default `'focus'`) | `prefill?: boolean \| 'interaction'` (default `'interaction'`) | value renamed; `'focus'` no longer compiles. Unset now genuinely inherits the default (v2's wrapper silently coerced an unset prop to `false`). |
|
|
18
18
|
| `prefill: false` (fetched on first open) | `prefill: false` is **search-first**: with a provider, nothing fetches until the user types — opening shows a "search to begin" hint (`select.searchToStart`) | **⚠ silent** — a v2 `prefill: false` select opens to the hint instead of options. If you meant "load on open", delete the prop: that is the default. Falls back to load-on-open for array `items`, `disable-writing`, or a non-empty model. |
|
|
19
19
|
| `transitionDuration` default `300` | default `250` | visual — the panel now animates on the shared `transitions.medium` scale, like `BbDialog` |
|
|
20
|
-
| `itemText` / `itemValue` | `ItemAccessor<T, …>` | retype — keys autocomplete, functions unchanged
|
|
20
|
+
| `itemText` / `itemValue` | `ItemAccessor<T, …>` | retype — keys autocomplete, functions unchanged; left out, an object item reads its own `label` (else `text`) and `value` (else the whole item) — see Behavior 7 |
|
|
21
21
|
| per-item `disabled` honored (deprecated) | inert — use `selectable?: boolean \| ((item) => boolean)` | **⚠ silent** — see below |
|
|
22
22
|
| — | `adaptive` + `offCanvasProps` (mobile sheet, on by default), `labelMode`, `description`, and the new `active` event (fires when the panel opens; `inactive` pre-existed) | additive |
|
|
23
23
|
| `name` + empty selection posts `name=null` (single) / omits the field (multi) | empty selection (`null`/`[]`) posts **no field**, like a native `<select multiple>` with nothing chosen | **⚠ behavioral** (bugfix 2026-07-18) — backends reading the literal `"null"` string must treat the absent field as empty. Note: `required` never participated in native validation here (hidden inputs are barred from constraint validation). |
|
|
@@ -68,6 +68,14 @@ summary: allowWriting inverted to disableWriting, filterBy narrowed to string[],
|
|
|
68
68
|
`(query, prefill, modelValue)`; `prefill === true` becomes
|
|
69
69
|
`reason !== 'search'`, a failure throws (never `return []`). **⚠ silent**
|
|
70
70
|
for untyped code — see [§6 item 37](../v2-to-v3.md).
|
|
71
|
+
7. **Object items read their own `label` and `value`** (beta.49). With no
|
|
72
|
+
`item-text`, an object item shows its `label`, else its `text`, else
|
|
73
|
+
`JSON.stringify(item)`; with no `item-value`, `v-model` gets its `value`
|
|
74
|
+
(whatever it holds, `null` included), else the whole item. Explicit
|
|
75
|
+
accessors win. **⚠ silent**: `{ value: 1, label: 'One' }` items with no
|
|
76
|
+
`item-value` used to put the object in `v-model`; now they put `1` — pass
|
|
77
|
+
`:item-value="(item) => item"` to keep the object. See
|
|
78
|
+
[§6 item 49](../v2-to-v3.md).
|
|
71
79
|
|
|
72
80
|
## Edits
|
|
73
81
|
|
|
@@ -11,4 +11,5 @@ surface, one set of changes. Everything is in
|
|
|
11
11
|
`legendPosition`, `direction` / `inputDirection` → `layout` / `listLayout`),
|
|
12
12
|
per-item `disabled` becoming inert (use `selectable`), the `bb-cr-container`
|
|
13
13
|
CSS block split per group, and the `--bb-checkbox-*` / `--bb-radio-*` /
|
|
14
|
-
`--bb-switch-*` variables becoming glyph locals
|
|
14
|
+
`--bb-switch-*` variables becoming glyph locals, and object items reading
|
|
15
|
+
their own `label` (else `text`) and `value` by default.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: 'Migration v2→v3: BbTabs (was BbTab)'
|
|
3
|
-
summary: Component renamed; querykey→queryKey; animations default on; label slots renamed, header:* slots → wrapper:*, and all dynamic names/URL slugs normalized; the entire .bb-tab BEM tree renamed to .bb-tabs / .bb-tabs-list / .bb-tabs-panels.
|
|
3
|
+
summary: Component renamed; item key→value (v-model carries it); querykey→queryKey; animations default on; label slots renamed, header:* slots → wrapper:*, and all dynamic names/URL slugs normalized; the entire .bb-tab BEM tree renamed to .bb-tabs / .bb-tabs-list / .bb-tabs-panels.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# BbTabs — v2 → v3
|
|
@@ -15,9 +15,9 @@ aliases survive as deprecated re-exports, the tag name does not).
|
|
|
15
15
|
| `<BbTab>` | `<BbTabs>` | rename |
|
|
16
16
|
| `querykey?: string` | `queryKey?: string` (default `'tab'`) | **⚠ silent** — a leftover `querykey` is ignored and URL sync moves to `?tab=` |
|
|
17
17
|
| `animateX` / `animateY` (default `true`) | `disableAnimateX` / `disableAnimateY` (default `false`) | polarity rename — bare `animate-x` → delete; `:animate-x="false"` → `disable-animate-x` |
|
|
18
|
-
| label slot `#label-<key>` (v3 ≤ beta.43: `#label:<key>`) | `#<slotKey(
|
|
18
|
+
| label slot `#label-<key>` (v3 ≤ beta.43: `#label:<key>`) | `#<slotKey(value)>:label` | rename + normalization — dev builds warn on `#label:<key>`, `bitboss-ui check --fix` rewrites it |
|
|
19
19
|
| `#header:prepend` / `#header:append` | `#wrapper:prepend` / `#wrapper:append` (same slot props) | a leftover `#header:*` renders nothing — `bitboss-ui check` flags it |
|
|
20
|
-
| pane slot `#<key>` (raw) | `#<slotKey(
|
|
20
|
+
| pane slot `#<key>` (raw) | `#<slotKey(value)>` | normalization |
|
|
21
21
|
| URL value = raw key | URL value = normalized slug | **⚠ breaking for deep links** |
|
|
22
22
|
| tab/panel DOM ids from raw key | normalized (also fixes invalid ids for spaced keys) | check E2E selectors |
|
|
23
23
|
| `.bb-tab*` CSS | `.bb-tabs*` / `.bb-tabs-list*` / `.bb-tabs-panels` | **⚠ silent** — the whole BEM tree renamed, see below |
|
|
@@ -25,13 +25,14 @@ aliases survive as deprecated re-exports, the tag name does not).
|
|
|
25
25
|
| — | `variant` (`pill` default, `line`, `none`, + registered) | additive — replaces hand-rolled underline / no-chrome strips, see below |
|
|
26
26
|
| `--pill-bg` / `--pill-border` / `--pill-shadow` on `.bb-tabs-list` (beta ≤ 28) | `--indicator-bg` / `--indicator-border` / `--indicator-shadow` | **⚠ silent** — inert locals, the strip reverts to its default pill |
|
|
27
27
|
|
|
28
|
-
`slotKey(
|
|
29
|
-
`in-review`, `"in_review"` → `in-review`, `"inReview"` → `in-review`.
|
|
28
|
+
`slotKey(value)` is kebab-case (lodash `kebabCase` rules): `"In Review"` →
|
|
29
|
+
`in-review`, `"in_review"` → `in-review`, `"inReview"` → `in-review`. Values that
|
|
30
30
|
are already lowercase kebab slugs are untouched — then only the
|
|
31
|
-
`#label-<key>` → `#<
|
|
31
|
+
`#label-<key>` → `#<value>:label` rename applies. (On a v3 beta ≤ 37 the rule was `_`: `in_review`.)
|
|
32
32
|
|
|
33
|
-
**What stays raw:** `v-model` and the item `
|
|
33
|
+
**What stays raw:** `v-model` and the item `value`. `v-model="'In Review'"`
|
|
34
34
|
still selects that tab; only slots, ids, and the URL use the slug.
|
|
35
|
+
| item `key` (v2, and v3 up to beta.48) | item `value` — what `v-model` carries and what names the `#<value>` / `#<value>:label` slots (the same characters as before); `useBbTabsContext().select(value)`; the `#label` / `#<value>:label` slot scope says `label` (was `text`) | hard rename — `npx bitboss-ui check --fix` rewrites literal items; `label` is unchanged |
|
|
35
36
|
|
|
36
37
|
## Edits
|
|
37
38
|
|
|
@@ -53,7 +54,7 @@ the kebab slug (`?section=in-review`, not `?section=In%20Review`). Bookmarks
|
|
|
53
54
|
with a v3 beta's underscore slug (`?section=in_review`) still land and are
|
|
54
55
|
rewritten in place; raw v2 values fall back to the default tab — add a
|
|
55
56
|
redirect if those links matter. App code that WRITES tab values (links,
|
|
56
|
-
`router.push`, redirects, emails) must use the kebab slug: `slotKey(
|
|
57
|
+
`router.push`, redirects, emails) must use the kebab slug: `slotKey(value)`.
|
|
57
58
|
|
|
58
59
|
## CSS: every class renamed with the component
|
|
59
60
|
|
|
@@ -9,7 +9,7 @@ summary: timeout renamed to delay; theme replaced by typed variant; hideArrow is
|
|
|
9
9
|
|
|
10
10
|
| v2 | v3 | Kind |
|
|
11
11
|
| -------------------------------------- | -------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
|
|
12
|
-
| `timeout?: number` | `delay?: number` (default `
|
|
12
|
+
| `timeout?: number` | `delay?: number` (default `100`) | rename (`BbAvatar.timeout` is unrelated and keeps its name) |
|
|
13
13
|
| `theme?: string` (deprecated) | `variant?: TooltipVariantType` (`default, destructive`; default `default`) | typed rename |
|
|
14
14
|
| arrow via undeclared fall-through | `hideArrow?: boolean` (default `false` — arrow shown) | now a real, typed prop |
|
|
15
15
|
| `activator` / `boundary` loose types | `ElementOrComponentRef*` | transparent in templates |
|
|
@@ -871,22 +871,26 @@ to the new name (`hide-close`).
|
|
|
871
871
|
|
|
872
872
|
### 5.3 Straight renames
|
|
873
873
|
|
|
874
|
-
| Component | v2 | v3
|
|
875
|
-
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------- |
|
|
876
|
-
| `BbPagination`, `BbTabs` | `querykey` | `queryKey` — **⚠ silent**: a leftover `querykey` falls through to the DOM and the component uses the default key (`'page'` / `'tab'`), quietly moving your URL params.
|
|
877
|
-
| `BbTooltip` | `timeout` | `delay`
|
|
878
|
-
| `toast()`, `confirm()` options | `timeout` | `duration` — same meaning (ms before auto-dismiss). `toast()` throws on `duration <= 0`; on `confirm()` it resolves the promise `false` quietly and implies `autoClose: true`.
|
|
879
|
-
| `useToast()` | `dismissAll()` | `dismiss()` with **no argument**. The v3 return shape is `{ toast, dismiss, update }`.
|
|
880
|
-
| `BbIcon` | `type` (required) | `icon`
|
|
881
|
-
| `BbColorPalette`, `BbColorInput` | `picker` | `eyeDropper`
|
|
882
|
-
| `BbCheckboxGroup`, `BbRadioGroup`, `BbSwitchGroup` | `labelPosition` | `legendPosition`
|
|
883
|
-
| Every form control — `BbTextInput`, `BbTextarea`, `BbNumberInput`, `BbColorInput`, `BbSelect`, `BbDatePickerInput`, `BbTimePickerInput`, `BbTag`, `BbCheckbox`, `BbRadio`, `BbSwitch`, `BbCheckboxGroup`, `BbRadioGroup`, `BbSwitchGroup`, `BbRating`, `BbSlider` | `direction` | `layout` — same values (`'auto'`, `'horizontal'`, `'vertical'`, a `'xx xxxxxx'` ratio), plus `'label-fill'` (the label takes the free space, the input keeps its size — with `reverse`, the settings row) and `'input-fill'`. **⚠ silent**: a leftover `direction` falls through to the root as an HTML attribute and the field keeps its default layout. The ESLint plugin's `--fix` renames it.
|
|
884
|
-
| `BbCheckboxGroup`, `BbRadioGroup`, `BbSwitchGroup` | `inputDirection` | `listLayout` — `'horizontal'` (default) / `'vertical'` / `'vertical-stretch'` / `'tiles'`. **⚠ silent**: v2 `'vertical'` rows spanned the list; v3 `'vertical'` rows keep their own width, and `'vertical-stretch'` is the v2 look — the ESLint plugin's `--fix` maps a static `'vertical'` to `'vertical-stretch'`, a bound value is only renamed. New beside it: `itemLayout` (each row's input against its label, the `layout` keywords) and `itemReverse`.
|
|
885
|
-
| `BbSelect` | `prefill: 'focus'` | `prefill: 'interaction'` (value rename; same default)
|
|
886
|
-
| `BbToast` (host) | `placement` (e.g. `bottom-start`) | `position` (corner set: `top-left` … `bottom-right`)
|
|
887
|
-
| `BbAlert`, `BbTooltip`, `toast()`, `confirm()` | `theme` | `variant` (typed — see section 4). On `confirm()` the v2 type was a free-form `theme?: string`; v3's is `ConfirmVariantType` (`default`, `destructive`).
|
|
888
|
-
| Every form control with a warning state — `BbTextInput`, `BbTextarea`, `BbNumberInput`, `BbColorInput`, `BbSelect`, `BbSelectPopover`, `BbDatePickerInput`, `BbTimePickerInput`, `BbTag`, `BbCheckbox`, `BbRadio`, `BbSwitch`, `BbCheckboxGroup`, `BbRadioGroup`, `BbSwitchGroup`, `BbRating`, `BbSlider`, `BbDropzone` — and the `BbBaseCheckboxIcon` / `BbBaseRadioIcon` / `BbBaseSwitchIcon` glyphs | `hasWarning` _(v3 ≤ beta.24; not in v2)_ | `hasWarnings` — plural, matching `hasErrors` and the `warnings` prop. **⚠ silent**: a leftover `has-warning` falls through to the root as an HTML attribute and the warning chrome never shows. The ESLint plugin's `--fix` renames it. Slot props that carried it (`#input`, `#label`) are renamed the same way.
|
|
889
|
-
| `BbForm` _(v3 ≤ beta.41; not in v2)_ | `modelValue` (`v-model`) | `model`, bound one way: `<BbForm :model="draft">` — any reactive object (`reactive()`, a `ref`, Pinia state, Inertia `useForm()`), written in place; watch it `{ deep: true }`. The form-level `update:modelValue` is gone (it carried the same object back). **⚠ silent**: a leftover `v-model` / `:model-value` falls through to the `<form>` as an attribute and the fields stop seeing the object. The ESLint rule `bitboss-ui/form-model` fixes both.
|
|
874
|
+
| Component | v2 | v3 |
|
|
875
|
+
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
876
|
+
| `BbPagination`, `BbTabs` | `querykey` | `queryKey` — **⚠ silent**: a leftover `querykey` falls through to the DOM and the component uses the default key (`'page'` / `'tab'`), quietly moving your URL params. |
|
|
877
|
+
| `BbTooltip` | `timeout` | `delay` |
|
|
878
|
+
| `toast()`, `confirm()` options | `timeout` | `duration` — same meaning (ms before auto-dismiss). `toast()` throws on `duration <= 0`; on `confirm()` it resolves the promise `false` quietly and implies `autoClose: true`. |
|
|
879
|
+
| `useToast()` | `dismissAll()` | `dismiss()` with **no argument**. The v3 return shape is `{ toast, dismiss, update }`. |
|
|
880
|
+
| `BbIcon` | `type` (required) | `icon` |
|
|
881
|
+
| `BbColorPalette`, `BbColorInput` | `picker` | `eyeDropper` |
|
|
882
|
+
| `BbCheckboxGroup`, `BbRadioGroup`, `BbSwitchGroup` | `labelPosition` | `legendPosition` |
|
|
883
|
+
| Every form control — `BbTextInput`, `BbTextarea`, `BbNumberInput`, `BbColorInput`, `BbSelect`, `BbDatePickerInput`, `BbTimePickerInput`, `BbTag`, `BbCheckbox`, `BbRadio`, `BbSwitch`, `BbCheckboxGroup`, `BbRadioGroup`, `BbSwitchGroup`, `BbRating`, `BbSlider` | `direction` | `layout` — same values (`'auto'`, `'horizontal'`, `'vertical'`, a `'xx xxxxxx'` ratio), plus `'label-fill'` (the label takes the free space, the input keeps its size — with `reverse`, the settings row) and `'input-fill'`. **⚠ silent**: a leftover `direction` falls through to the root as an HTML attribute and the field keeps its default layout. The ESLint plugin's `--fix` renames it. |
|
|
884
|
+
| `BbCheckboxGroup`, `BbRadioGroup`, `BbSwitchGroup` | `inputDirection` | `listLayout` — `'horizontal'` (default) / `'vertical'` / `'vertical-stretch'` / `'tiles'`. **⚠ silent**: v2 `'vertical'` rows spanned the list; v3 `'vertical'` rows keep their own width, and `'vertical-stretch'` is the v2 look — the ESLint plugin's `--fix` maps a static `'vertical'` to `'vertical-stretch'`, a bound value is only renamed. New beside it: `itemLayout` (each row's input against its label, the `layout` keywords) and `itemReverse`. |
|
|
885
|
+
| `BbSelect` | `prefill: 'focus'` | `prefill: 'interaction'` (value rename; same default) |
|
|
886
|
+
| `BbToast` (host) | `placement` (e.g. `bottom-start`) | `position` (corner set: `top-left` … `bottom-right`) |
|
|
887
|
+
| `BbAlert`, `BbTooltip`, `toast()`, `confirm()` | `theme` | `variant` (typed — see section 4). On `confirm()` the v2 type was a free-form `theme?: string`; v3's is `ConfirmVariantType` (`default`, `destructive`). |
|
|
888
|
+
| Every form control with a warning state — `BbTextInput`, `BbTextarea`, `BbNumberInput`, `BbColorInput`, `BbSelect`, `BbSelectPopover`, `BbDatePickerInput`, `BbTimePickerInput`, `BbTag`, `BbCheckbox`, `BbRadio`, `BbSwitch`, `BbCheckboxGroup`, `BbRadioGroup`, `BbSwitchGroup`, `BbRating`, `BbSlider`, `BbDropzone` — and the `BbBaseCheckboxIcon` / `BbBaseRadioIcon` / `BbBaseSwitchIcon` glyphs | `hasWarning` _(v3 ≤ beta.24; not in v2)_ | `hasWarnings` — plural, matching `hasErrors` and the `warnings` prop. **⚠ silent**: a leftover `has-warning` falls through to the root as an HTML attribute and the warning chrome never shows. The ESLint plugin's `--fix` renames it. Slot props that carried it (`#input`, `#label`) are renamed the same way. |
|
|
889
|
+
| `BbForm` _(v3 ≤ beta.41; not in v2)_ | `modelValue` (`v-model`) | `model`, bound one way: `<BbForm :model="draft">` — any reactive object (`reactive()`, a `ref`, Pinia state, Inertia `useForm()`), written in place; watch it `{ deep: true }`. The form-level `update:modelValue` is gone (it carried the same object back). **⚠ silent**: a leftover `v-model` / `:model-value` falls through to the `<form>` as an attribute and the fields stop seeing the object. The ESLint rule `bitboss-ui/form-model` fixes both. |
|
|
890
|
+
| `BbDropdown`, `v-bb-dropdown`, `BbDropdownButton` rows | `key`, `text` | `value`, `label` (also v3 ≤ beta.48). `value` is the row's identity, any type: the selection value a selectable group puts in `v-model` (compared by hash, so `null` and objects work), the `#<value>` slot name, the submenu id seed. A row with no `value` still renders and runs `onClick` (disabled in a selectable group). **⚠ silent**: an old `key` / `text` is ignored; `npx bitboss-ui check --fix` (or ESLint `bitboss-ui/no-renamed-item-field`) rewrites literal items. |
|
|
891
|
+
| `BbDropdown`, `v-bb-dropdown`, `BbDropdownButton` groups _(v3 ≤ beta.48; not in v2)_ | `key` | `id`, the word `<BbDropdownGroup id>` binds by (`#<groupId>:item` slots, same characters). **⚠ silent**: a group with `key` is not selectable and no companion binds it; `check --fix` rewrites it. |
|
|
892
|
+
| `BbTabs`, `BbTabsRoot` items | `key` | `value` — what `v-model` carries and what names `#<value>` / `#<value>:label` (the same characters as before); `server` tabs and `useBbTabsContext().select(value)` follow. `label` is unchanged. `check --fix` rewrites literal items. |
|
|
893
|
+
| `BbBreadcrumbs` items | `key`, `text` | `value`, `label` — `value` names the crumb's `#<value>` slots; a crumb hidden in the overflow menu is a dropdown row with the same fields. `check --fix` rewrites literal items. |
|
|
890
894
|
|
|
891
895
|
### 5.4 Removed props (no replacement needed — behavior became default or moved)
|
|
892
896
|
|
|
@@ -1340,7 +1344,7 @@ Nothing here fails to compile — these change what existing code does.
|
|
|
1340
1344
|
family's day slots are `#<YYYY-MM-DD>:append` and the shared
|
|
1341
1345
|
`#day:append` (v3 betas: `#append:<date>` / `#append:day`). The same
|
|
1342
1346
|
warnings and `check --fix` cover these.
|
|
1343
|
-
`BbTabs` goes further: the label slot is `#<
|
|
1347
|
+
`BbTabs` goes further: the label slot is `#<value>:label` (v2 `#label-<key>`,
|
|
1344
1348
|
v3 betas `#label:<key>`),
|
|
1345
1349
|
the URL query value is the kebab slug (`?tab=In%20Review` →
|
|
1346
1350
|
`?tab=in-review`; old `?tab=in_review` links from a v3 beta still land and
|
|
@@ -1751,6 +1755,99 @@ Nothing here fails to compile — these change what existing code does.
|
|
|
1751
1755
|
pseudo-class (Tailwind `active:`), and the current-route highlight stays
|
|
1752
1756
|
`activeClass` / `exactActiveClass`.
|
|
1753
1757
|
|
|
1758
|
+
48. **Tooltips wait 100 ms on hover** (since 3.0.0-beta.49). `BbTooltip` and
|
|
1759
|
+
`v-bb-tooltip` used to show on hover at once (`delay` defaulted to `0`);
|
|
1760
|
+
the default is now `100`, so a pointer passing over a row of buttons no
|
|
1761
|
+
longer flashes a bubble at each. Keyboard focus shows the tooltip at once
|
|
1762
|
+
whatever `delay` says, and a tooltip reached while another shows or
|
|
1763
|
+
within 300 ms of one closing skips its delay. A test that hovers and
|
|
1764
|
+
expects the bubble on the next tick now waits for it (`vi.waitFor`, or
|
|
1765
|
+
`:delay="0"` in that test); `:delay="0"` / `{ text, delay: 0 }` restores
|
|
1766
|
+
the instant hover open.
|
|
1767
|
+
|
|
1768
|
+
49. **`{ label, value }` items need no `item-text` / `item-value`** (since
|
|
1769
|
+
3.0.0-beta.49). With neither prop, an option on `BbSelect`,
|
|
1770
|
+
`BbSelectPopover`, `BbRadioGroup`, `BbCheckboxGroup`, `BbSwitchGroup` and a
|
|
1771
|
+
mapped `BbDropdown` group reads its own `label` (else its own `text`) as
|
|
1772
|
+
its text, and its own `value` as its value, whatever it holds (`null`
|
|
1773
|
+
included). Before, the text was `JSON.stringify(item)` and the value the
|
|
1774
|
+
whole object. The break: object items with a `value` key and no
|
|
1775
|
+
`item-value` used to put the whole object in `v-model`, and now put
|
|
1776
|
+
`item.value` there. To keep the old value, write it out:
|
|
1777
|
+
`:item-value="(item) => item"`. An explicit accessor always wins, and
|
|
1778
|
+
`BbTable` rows keep the whole row. `item-text="label"` /
|
|
1779
|
+
`item-value="value"` now restate the default: the
|
|
1780
|
+
`bitboss-ui/no-redundant-item-accessor` autofix deletes them.
|
|
1781
|
+
|
|
1782
|
+
50. **A dropdown group's "None" row shows checked** (since 3.0.0-beta.49).
|
|
1783
|
+
A single-choice `BbDropdown` / `BbDropdownButton` group whose `v-model`
|
|
1784
|
+
is `null` (or that has nothing selected) shows its row whose `value` is
|
|
1785
|
+
`null` as checked, as `BbSelect` and `BbRadioGroup` already do (they
|
|
1786
|
+
match by hash); picking it emits `null`. Before, nothing showed checked.
|
|
1787
|
+
A hand-written group's `v-model` holds its rows' `value`s, of any type,
|
|
1788
|
+
where it held their `key` strings (§ 5.3).
|
|
1789
|
+
|
|
1790
|
+
51. **Slot scopes and `useBbDropdownContext` follow the item fields** (since
|
|
1791
|
+
3.0.0-beta.49). The row slots of `BbDropdown` / `BbDropdownButton`
|
|
1792
|
+
(`#<value>`, `#<groupId>:item`, `#item:prepend`, …), `BbTabs`'
|
|
1793
|
+
`#<value>:label` / `#label` and `BbBreadcrumbs`' crumb slots hand
|
|
1794
|
+
`{ label }` where they handed `{ text }`; a row slot's `group` carries
|
|
1795
|
+
`id` (was `key`); the `#loading` / `#empty` slots' `groupKey` is
|
|
1796
|
+
`groupId`. `useBbDropdownContext(id).groups` is keyed by each group's
|
|
1797
|
+
`id`, and `selectedOptions[]` carry `label` (was `text`). A destructured
|
|
1798
|
+
`{ text }` reads `undefined`, with no error: rename it to `{ label }`.
|
|
1799
|
+
|
|
1800
|
+
52. **`BbPopover` is non-modal** (since 3.0.0-beta.49). Its panel is a
|
|
1801
|
+
`role="dialog"` without `aria-modal`, not a `<dialog>` opened with
|
|
1802
|
+
`showModal()`: the page behind stays clickable, focusable and scrollable,
|
|
1803
|
+
an outside click closes the popover and still reaches what was clicked,
|
|
1804
|
+
and Tab past the last control (or Shift+Tab before the first) leaves the
|
|
1805
|
+
panel and closes it. Escape still closes it and returns focus. A flow that
|
|
1806
|
+
relied on the page being blocked while the popover is open adds `modal`
|
|
1807
|
+
(`v-bb-popover="{ portal, modal: true }"` on the directive), which restores
|
|
1808
|
+
the old behaviour exactly. A test that queried `dialog.bb-popover` queries
|
|
1809
|
+
`.bb-popover[role="dialog"]`. The phone sheet is modal either way.
|
|
1810
|
+
|
|
1811
|
+
53. **A form locks while its save runs** (since 3.0.0-beta.49). While a
|
|
1812
|
+
`@submit` that returned a promise is pending, every field joined to the
|
|
1813
|
+
`BbForm` is read-only (never disabled: values stay visible and focusable,
|
|
1814
|
+
`aria-readonly`) and every `type="submit"` `BbButton` inside it shows its
|
|
1815
|
+
spinner; both end when the promise settles. A sync `@submit` never locks.
|
|
1816
|
+
A `:loading="isSubmitting"` on the submit button is now redundant (drop
|
|
1817
|
+
it); a submit button outside the form still binds `loading` itself. A
|
|
1818
|
+
page that wants the fields editable during the save sets
|
|
1819
|
+
`disable-submit-lock` on the form.
|
|
1820
|
+
|
|
1821
|
+
54. **A set of `group` toggle buttons is one Tab stop** (since
|
|
1822
|
+
3.0.0-beta.49). Adjacent `group` `BbButton`s that each bind a `v-model`
|
|
1823
|
+
take a roving `tabindex`: Tab lands on the pressed one (else the one last
|
|
1824
|
+
focused, else the first), ArrowLeft / ArrowRight and Home / End move
|
|
1825
|
+
between them, Space / Enter toggle. They keep `aria-pressed`. A keyboard
|
|
1826
|
+
test that pressed Tab once per button now presses an arrow key instead;
|
|
1827
|
+
`group` buttons without a `v-model` are unchanged.
|
|
1828
|
+
|
|
1829
|
+
55. **`BbNumberInput` formats live in the locale** (since 3.0.0-beta.49). The
|
|
1830
|
+
field shows `10.005,6` in Italian and `10,005.6` in English while the user
|
|
1831
|
+
types; the model is still the plain number. Code that reads the input's
|
|
1832
|
+
text (`event.target.value`, a `pt:input` listener, a consumer `maxlength`
|
|
1833
|
+
or `pattern`) now sees the formatted text, which is also wider: check
|
|
1834
|
+
narrow fixed-width fields at 200% zoom. `name` moves to a hidden input
|
|
1835
|
+
that posts the raw value (`10005.6`): `form.elements[name]` and
|
|
1836
|
+
`input[name=x]` find that one, so a test that typed into
|
|
1837
|
+
`input[name=x]` targets `input[role="spinbutton"]`. A pasted `1.000` in
|
|
1838
|
+
Italian is 1000 (it was 1), an English `1,234` is 1234, and a paste keeps
|
|
1839
|
+
only the first number (`$1,234.56 - $2,000` is 1234.56, `(1,234.56)` is negative, `1.2E+05` is 120000, `15 m²`
|
|
1840
|
+
is 15); a typed `,` or
|
|
1841
|
+
`.` is still always the decimal; with `maxPrecision` 0 it stays in the
|
|
1842
|
+
text and refuses the digits after it (`12,5` is 12, it was 125), and
|
|
1843
|
+
below 3 decimals (every currency field) a second `,` / `.` is refused.
|
|
1844
|
+
`-` typed anywhere flips the sign (it only counted at the start). While
|
|
1845
|
+
the text is a bare `-` the model keeps its last value instead of
|
|
1846
|
+
becoming `null`; blur rewrites the text from the value (`1,50` → `1,5`).
|
|
1847
|
+
With the new `currency` / `unit` the symbol is in that text too
|
|
1848
|
+
(`$1,234.50`, `20 kg`), so a `maxlength` counts it. `disable-formatting`
|
|
1849
|
+
restores the old field exactly.
|
|
1850
|
+
|
|
1754
1851
|
## 7. Class overrides → variants
|
|
1755
1852
|
|
|
1756
1853
|
### The v2 pattern to hunt down
|
|
@@ -118,6 +118,17 @@ All of these land in 3.0.0-beta.41.
|
|
|
118
118
|
- A new `warnings` array (never fails the run), with `severity: "warning"`:
|
|
119
119
|
`likely-squashed-slot` and `local-bb-component`.
|
|
120
120
|
|
|
121
|
+
In 3.0.0-beta.49 the dropdown kinds follow the item fields (Q64.2):
|
|
122
|
+
`missing-key` is `missing-value` (a row in a selectable group without a
|
|
123
|
+
`value`) or `missing-id` (a selectable group without an `id`), and
|
|
124
|
+
`duplicate-row-text` is `duplicate-row-label`. A new `renamed-item-field`
|
|
125
|
+
reports an item field spelled the old way (a dropdown row's `key` / `text`, a
|
|
126
|
+
dropdown group's `key`, a tab's `key`, a crumb's `key` / `text`) and
|
|
127
|
+
`check --fix` rewrites it; its ESLint twin is
|
|
128
|
+
`bitboss-ui/no-renamed-item-field` (`error` in `recommended`). A script that
|
|
129
|
+
matches the old kind names in `check --json` output needs the new ones;
|
|
130
|
+
`eslint-disable` comments name rules, which did not change.
|
|
131
|
+
|
|
121
132
|
After 3.0.0-beta.41, `check` alone (not MCP `validate`: it needs the project's
|
|
122
133
|
build config) adds `kind: "hand-imported-styles"`: `bitboss-ui/styles.css`
|
|
123
134
|
imported in a CSS file, a script, a `.vue` block or Nuxt's `css: [...]` while
|