bitboss-ui 3.0.0-beta.65 → 3.0.0-beta.67
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 +79 -16
- package/bin/bitboss-ui-mcp.mjs +48 -17
- package/bin/bitboss-ui.mjs +73 -12
- package/dist/_virtual/_plugin-vue_export-helper.js +1 -2
- package/dist/ai/BbAccordion.md +4 -3
- package/dist/ai/BbAlert.md +2 -2
- package/dist/ai/BbAvatar.md +1 -1
- package/dist/ai/BbBadge.md +2 -1
- package/dist/ai/BbBadgeButton.md +6 -5
- package/dist/ai/BbBaseButton.md +26 -21
- package/dist/ai/BbBaseCheckboxIcon.md +1 -0
- package/dist/ai/BbBaseRadioIcon.md +1 -0
- package/dist/ai/BbBaseSwitchIcon.md +1 -0
- package/dist/ai/BbBreadcrumbs.md +9 -1
- package/dist/ai/BbButton.md +74 -22
- package/dist/ai/BbCalendar.md +156 -23
- package/dist/ai/BbCheckbox.md +5 -1
- package/dist/ai/BbCheckboxGroup.md +45 -9
- package/dist/ai/BbColorInput.md +5 -3
- package/dist/ai/BbColorPalette.md +7 -3
- package/dist/ai/BbConfirm.md +38 -81
- package/dist/ai/BbConfirmPortal.md +1 -1
- package/dist/ai/BbDatePicker.md +70 -22
- package/dist/ai/BbDatePickerInput.md +121 -27
- package/dist/ai/BbDialog.md +69 -61
- package/dist/ai/BbDropdown.md +30 -29
- package/dist/ai/BbDropdownButton.md +9 -13
- package/dist/ai/BbDropzone.md +2 -3
- package/dist/ai/BbForm.md +70 -46
- package/dist/ai/BbHost.md +29 -41
- package/dist/ai/BbIcon.md +3 -0
- package/dist/ai/BbNumberInput.md +17 -13
- package/dist/ai/BbOffCanvas.md +21 -14
- package/dist/ai/BbPagination.md +18 -18
- package/dist/ai/BbPopover.md +8 -3
- package/dist/ai/BbPtScope.md +5 -5
- package/dist/ai/BbRadio.md +5 -1
- package/dist/ai/BbRadioGroup.md +45 -8
- package/dist/ai/BbRating.md +5 -4
- package/dist/ai/BbSelect.md +150 -24
- package/dist/ai/BbSelectPopover.md +19 -16
- package/dist/ai/BbSlider.md +6 -4
- package/dist/ai/BbSwitch.md +5 -1
- package/dist/ai/BbTable.md +69 -44
- package/dist/ai/BbTabs.md +128 -64
- package/dist/ai/BbTabsList.md +5 -3
- package/dist/ai/BbTabsPanels.md +3 -1
- package/dist/ai/BbTabsRoot.md +4 -4
- package/dist/ai/BbTag.md +3 -3
- package/dist/ai/BbTextInput.md +23 -9
- package/dist/ai/BbTextarea.md +3 -3
- package/dist/ai/BbTimePicker.md +8 -6
- package/dist/ai/BbTimePickerInput.md +9 -12
- package/dist/ai/BbToast.md +33 -87
- package/dist/ai/BbToastPortal.md +1 -1
- package/dist/ai/BbTooltip.md +2 -2
- package/dist/ai/BbTree.md +2 -2
- package/dist/ai/ChipsBox.md +1 -1
- package/dist/ai/CommonField.md +2 -2
- package/dist/ai/CommonFieldInput.md +2 -1
- package/dist/ai/FlatListBox.md +2 -2
- package/dist/ai/GroupedListBox.md +2 -2
- package/dist/ai/ListBox.md +2 -2
- package/dist/ai/OptionsContainer.md +2 -2
- package/dist/ai/changelog.json +595 -525
- package/dist/ai/components.json +92 -88
- package/dist/ai/composables/useBbConfig.md +2 -2
- package/dist/ai/composables/{useBbDialogContext.md → useBbDialog.md} +18 -18
- package/dist/ai/composables/{useBbDropdownContext.md → useBbDropdown.md} +31 -31
- package/dist/ai/composables/{useBbFormContext.md → useBbForm.md} +11 -11
- package/dist/ai/composables/useBbFormField.md +2 -2
- package/dist/ai/composables/{useBbOffCanvasContext.md → useBbOffCanvas.md} +13 -13
- package/dist/ai/composables/{useBbTableContext.md → useBbTable.md} +20 -20
- package/dist/ai/composables/{useBbTabsContext.md → useBbTabs.md} +12 -12
- package/dist/ai/composables/useConfirm.md +42 -54
- package/dist/ai/composables/useToast.md +9 -26
- package/dist/ai/guides/agent-contract.md +57 -43
- package/dist/ai/guides/ai-router.md +1 -1
- package/dist/ai/guides/app-layout.md +32 -23
- package/dist/ai/guides/coherence-playbook.md +4 -2
- package/dist/ai/guides/component-picker.md +37 -33
- package/dist/ai/guides/design-language.md +51 -14
- package/dist/ai/guides/design-tokens.md +99 -44
- package/dist/ai/guides/eslint-rules.md +8 -4
- package/dist/ai/guides/fetch-items-playbook.md +4 -3
- package/dist/ai/guides/floating-bottom-panel.md +1 -1
- package/dist/ai/guides/icons-policy.md +1 -1
- package/dist/ai/guides/inertia-helpers.md +661 -210
- package/dist/ai/guides/inline-edit-playbook.md +1 -1
- package/dist/ai/guides/installation-and-plugin-setup.md +22 -19
- package/dist/ai/guides/migration/adoption-checklist.md +44 -2
- package/dist/ai/guides/migration/components/bb-dialog.md +13 -13
- package/dist/ai/guides/migration/components/bb-dropdown.md +16 -16
- package/dist/ai/guides/migration/components/bb-host.md +15 -14
- package/dist/ai/guides/migration/components/bb-offcanvas.md +10 -10
- package/dist/ai/guides/migration/components/bb-pagination.md +9 -9
- package/dist/ai/guides/migration/components/bb-select.md +2 -3
- package/dist/ai/guides/migration/components/bb-table.md +15 -15
- package/dist/ai/guides/migration/components/bb-tabs.md +1 -1
- package/dist/ai/guides/migration/from-async-validator.md +9 -9
- package/dist/ai/guides/migration/v2-to-v3.md +206 -13
- package/dist/ai/guides/migration/v3-beta-tooling.md +3 -3
- package/dist/ai/guides/options-items-playbook.md +2 -2
- package/dist/ai/guides/page-shell.md +15 -3
- package/dist/ai/guides/passthrough.md +60 -15
- package/dist/ai/guides/preset-components.md +102 -43
- package/dist/ai/guides/typescript-generic-components.md +21 -5
- package/dist/ai/guides/validated-forms.md +23 -14
- package/dist/ai/guides/validation-libraries.md +11 -13
- package/dist/ai/guides/validation-providers.md +3 -3
- package/dist/ai/helpers/definePreset.json +11 -4
- package/dist/ai/helpers/definePreset.ts +98 -41
- package/dist/ai/helpers/inertia/manifest.json +235 -77
- package/dist/ai/helpers/inertia/useConfirmOnRouteLeave.ts +24 -12
- package/dist/ai/helpers/inertia/usePromiseForm.ts +38 -151
- package/dist/ai/helpers/inertia/usePromiseRouter.ts +295 -0
- package/dist/ai/helpers/inertia/useQueryObject.ts +36 -5
- package/dist/ai/helpers/inertia/useRouteQuery.ts +28 -9
- package/dist/ai/helpers/inertia/utils.ts +53 -10
- package/dist/ai/index.md +15 -15
- package/dist/ai/manifest/common.json +5 -2
- package/dist/ai/manifest/components/BbAccordion.tree.json +3 -1
- package/dist/ai/manifest/components/BbAlert.json +1 -1
- package/dist/ai/manifest/components/BbAvatar.tree.json +1 -1
- package/dist/ai/manifest/components/BbBadge.json +2 -2
- package/dist/ai/manifest/components/BbBadge.tree.json +4 -2
- package/dist/ai/manifest/components/BbBadgeButton.json +11 -6
- package/dist/ai/manifest/components/BbBadgeButton.tree.json +2 -1
- package/dist/ai/manifest/components/BbBaseButton.json +11 -6
- package/dist/ai/manifest/components/BbBaseCheckboxIcon.json +1 -1
- package/dist/ai/manifest/components/BbBaseCheckboxIcon.tree.json +3 -1
- package/dist/ai/manifest/components/BbBaseRadioIcon.json +1 -1
- package/dist/ai/manifest/components/BbBaseRadioIcon.tree.json +3 -1
- package/dist/ai/manifest/components/BbBaseSwitchIcon.json +1 -1
- package/dist/ai/manifest/components/BbBaseSwitchIcon.tree.json +3 -1
- package/dist/ai/manifest/components/BbBreadcrumbs.json +3 -3
- package/dist/ai/manifest/components/BbBreadcrumbs.tree.json +7 -3
- package/dist/ai/manifest/components/BbButton.json +10 -5
- package/dist/ai/manifest/components/BbButton.tree.json +10 -3
- package/dist/ai/manifest/components/BbCalendar.json +29 -26
- package/dist/ai/manifest/components/BbCalendar.tree.json +25 -2
- package/dist/ai/manifest/components/BbCheckbox.json +2 -2
- package/dist/ai/manifest/components/BbCheckbox.tree.json +5 -2
- package/dist/ai/manifest/components/BbCheckboxGroup.json +2 -2
- package/dist/ai/manifest/components/BbCheckboxGroup.tree.json +62 -3
- package/dist/ai/manifest/components/BbCollapsible.json +4 -1
- package/dist/ai/manifest/components/BbColorInput.json +18 -17
- package/dist/ai/manifest/components/BbColorInput.tree.json +5 -3
- package/dist/ai/manifest/components/BbColorPalette.json +4 -1
- package/dist/ai/manifest/components/BbColorPalette.tree.json +7 -2
- package/dist/ai/manifest/components/BbConfirm.json +2 -1
- package/dist/ai/manifest/components/BbConfirm.tree.json +2 -2
- package/dist/ai/manifest/components/BbDatePicker.json +33 -27
- package/dist/ai/manifest/components/BbDatePicker.tree.json +3 -4
- package/dist/ai/manifest/components/BbDatePickerInput.json +38 -35
- package/dist/ai/manifest/components/BbDatePickerInput.tree.json +7 -4
- package/dist/ai/manifest/components/BbDialog.json +4 -4
- package/dist/ai/manifest/components/BbDialog.tree.json +6 -3
- package/dist/ai/manifest/components/BbDropdown.json +11 -11
- package/dist/ai/manifest/components/BbDropdown.tree.json +3 -3
- package/dist/ai/manifest/components/BbDropdownButton.json +13 -8
- package/dist/ai/manifest/components/BbDropdownButton.tree.json +2 -3
- package/dist/ai/manifest/components/BbDropzone.json +5 -2
- package/dist/ai/manifest/components/BbForm.json +2 -2
- package/dist/ai/manifest/components/BbHost.json +1 -1
- package/dist/ai/manifest/components/BbHost.tree.json +1 -1
- package/dist/ai/manifest/components/BbHoverCard.json +1 -1
- package/dist/ai/manifest/components/BbNumberInput.json +8 -8
- package/dist/ai/manifest/components/BbNumberInput.tree.json +1 -1
- package/dist/ai/manifest/components/BbOffCanvas.json +4 -4
- package/dist/ai/manifest/components/BbOffCanvas.tree.json +9 -4
- package/dist/ai/manifest/components/BbPagination.json +5 -5
- package/dist/ai/manifest/components/BbPagination.tree.json +3 -2
- package/dist/ai/manifest/components/BbPopover.json +1 -1
- package/dist/ai/manifest/components/BbPopover.tree.json +1 -1
- package/dist/ai/manifest/components/BbProgress.json +4 -1
- package/dist/ai/manifest/components/BbRadio.json +2 -2
- package/dist/ai/manifest/components/BbRadio.tree.json +5 -2
- package/dist/ai/manifest/components/BbRadioGroup.json +6 -6
- package/dist/ai/manifest/components/BbRadioGroup.tree.json +62 -3
- package/dist/ai/manifest/components/BbRating.json +7 -7
- package/dist/ai/manifest/components/BbRating.tree.json +5 -3
- package/dist/ai/manifest/components/BbSelect.json +25 -25
- package/dist/ai/manifest/components/BbSelect.tree.json +3 -3
- package/dist/ai/manifest/components/BbSelectPopover.json +16 -12
- package/dist/ai/manifest/components/BbSelectPopover.tree.json +3 -2
- package/dist/ai/manifest/components/BbSlider.json +14 -14
- package/dist/ai/manifest/components/BbSlider.tree.json +3 -0
- package/dist/ai/manifest/components/BbSmoothHeight.json +4 -1
- package/dist/ai/manifest/components/BbSwitch.json +2 -2
- package/dist/ai/manifest/components/BbSwitch.tree.json +5 -2
- package/dist/ai/manifest/components/BbSwitchGroup.json +1 -1
- package/dist/ai/manifest/components/BbSwitchGroup.tree.json +1 -1
- package/dist/ai/manifest/components/BbTable.json +28 -24
- package/dist/ai/manifest/components/BbTable.tree.json +6 -1
- package/dist/ai/manifest/components/BbTabs.json +13 -16
- package/dist/ai/manifest/components/BbTabs.tree.json +4 -1
- package/dist/ai/manifest/components/BbTabsList.json +6 -9
- package/dist/ai/manifest/components/BbTabsList.tree.json +4 -1
- package/dist/ai/manifest/components/BbTabsPanels.json +3 -3
- package/dist/ai/manifest/components/BbTabsPanels.tree.json +4 -1
- package/dist/ai/manifest/components/BbTabsRoot.json +5 -5
- package/dist/ai/manifest/components/BbTag.json +2 -2
- package/dist/ai/manifest/components/BbTag.tree.json +2 -2
- package/dist/ai/manifest/components/BbTextInput.json +4 -4
- package/dist/ai/manifest/components/BbTextInput.tree.json +3 -3
- package/dist/ai/manifest/components/BbTextarea.json +3 -3
- package/dist/ai/manifest/components/BbTextarea.tree.json +1 -1
- package/dist/ai/manifest/components/BbTimePicker.json +10 -7
- package/dist/ai/manifest/components/BbTimePicker.tree.json +5 -3
- package/dist/ai/manifest/components/BbTimePickerInput.json +19 -19
- package/dist/ai/manifest/components/BbTimePickerInput.tree.json +5 -3
- package/dist/ai/manifest/components/BbToast.json +1 -1
- package/dist/ai/manifest/components/BbToast.tree.json +3 -1
- package/dist/ai/manifest/components/BbTooltip.json +3 -0
- package/dist/ai/manifest/components/BbTooltip.tree.json +2 -2
- package/dist/ai/manifest/components/BbTree.json +3 -3
- package/dist/ai/manifest/components/BbTree.tree.json +1 -1
- package/dist/ai/manifest/components/ChipsBox.tree.json +1 -1
- package/dist/ai/manifest/components/CommonField.json +2 -2
- package/dist/ai/manifest/components/CommonField.tree.json +1 -0
- package/dist/ai/manifest/components/CommonFieldInput.tree.json +4 -2
- package/dist/ai/manifest/components/CommonPopover.tree.json +3 -0
- package/dist/ai/manifest/components/CommonTimeSelector.tree.json +1 -0
- package/dist/ai/manifest/components/FlatListBox.json +2 -2
- package/dist/ai/manifest/components/GroupedListBox.json +2 -2
- package/dist/ai/manifest/components/ListBox.json +2 -2
- package/dist/ai/manifest/components/OptionsContainer.json +3 -3
- package/dist/ai/manifest/index.json +3 -3
- package/dist/ai/manifest/meta.json +31 -16
- package/dist/ai/manifest/types.advanced.json +17 -13
- package/dist/ai/manifest/types.api.json +2 -2
- package/dist/ai/recipes/inertia/approvals-inbox.md +86 -115
- package/dist/ai/recipes/inertia/inline-edit-workspace.md +112 -120
- package/dist/ai/recipes/inertia/layout-scaffold.md +15 -4
- package/dist/ai/recipes/inertia/onboarding.md +76 -58
- package/dist/ai/recipes/inertia/ownership-atlas.md +74 -105
- package/dist/ai/recipes/inertia/record-form.md +18 -7
- package/dist/ai/recipes/inertia/records-workspace.md +106 -127
- package/dist/ai/recipes/inertia/settings-workspace.md +131 -73
- package/dist/ai/recipes/inertia/upload-center.md +97 -121
- package/dist/ai/recipes/inertia/wizard-form.md +25 -15
- package/dist/ai/recipes/nuxt/approvals-inbox.md +67 -48
- package/dist/ai/recipes/nuxt/inline-edit-workspace.md +73 -58
- package/dist/ai/recipes/nuxt/layout-scaffold.md +15 -4
- package/dist/ai/recipes/nuxt/onboarding.md +27 -10
- package/dist/ai/recipes/nuxt/ownership-atlas.md +40 -22
- package/dist/ai/recipes/nuxt/record-form.md +20 -7
- package/dist/ai/recipes/nuxt/records-workspace.md +120 -96
- package/dist/ai/recipes/nuxt/settings-workspace.md +36 -23
- package/dist/ai/recipes/nuxt/upload-center.md +63 -37
- package/dist/ai/recipes/nuxt/wizard-form.md +28 -16
- package/dist/ai/recipes/vue/approvals-inbox.md +74 -46
- package/dist/ai/recipes/vue/inline-edit-workspace.md +83 -56
- package/dist/ai/recipes/vue/layout-scaffold.md +15 -4
- package/dist/ai/recipes/vue/onboarding.md +27 -10
- package/dist/ai/recipes/vue/ownership-atlas.md +40 -22
- package/dist/ai/recipes/vue/record-form.md +20 -7
- package/dist/ai/recipes/vue/records-workspace.md +132 -95
- package/dist/ai/recipes/vue/settings-workspace.md +36 -23
- package/dist/ai/recipes/vue/upload-center.md +73 -37
- package/dist/ai/recipes/vue/wizard-form.md +28 -16
- package/dist/ai/source/BbAccordion.md +36 -6
- package/dist/ai/source/BbAlert.md +11 -5
- package/dist/ai/source/BbAsterisk.md +4 -1
- package/dist/ai/source/BbAvatar.md +12 -6
- package/dist/ai/source/BbBadge.md +72 -21
- package/dist/ai/source/BbBadgeButton.md +71 -18
- package/dist/ai/source/BbBaseButton.md +321 -276
- package/dist/ai/source/BbBaseCheckboxIcon.md +92 -64
- package/dist/ai/source/BbBaseRadioIcon.md +81 -54
- package/dist/ai/source/BbBaseSwitchIcon.md +87 -59
- package/dist/ai/source/BbBreadcrumbs.md +94 -56
- package/dist/ai/source/BbButton.md +180 -31
- package/dist/ai/source/BbCalendar.md +1069 -408
- package/dist/ai/source/BbCheckbox.md +233 -178
- package/dist/ai/source/BbCheckboxGroup.md +36 -21
- package/dist/ai/source/BbCollapsible.md +15 -6
- package/dist/ai/source/BbColorInput.md +142 -38
- package/dist/ai/source/BbColorPalette.md +242 -144
- package/dist/ai/source/BbConfirm.md +25 -7
- package/dist/ai/source/BbConfirmPortal.md +17 -7
- package/dist/ai/source/BbDatePicker.md +302 -178
- package/dist/ai/source/BbDatePickerInput.md +394 -65
- package/dist/ai/source/BbDialog.md +204 -174
- package/dist/ai/source/BbDropdown.md +92 -42
- package/dist/ai/source/BbDropdownButton.md +79 -30
- package/dist/ai/source/BbDropdownGroup.md +53 -15
- package/dist/ai/source/BbDropzone.md +138 -93
- package/dist/ai/source/BbForm.md +18 -7
- package/dist/ai/source/BbHost.md +25 -12
- package/dist/ai/source/BbHoverCard.md +20 -9
- package/dist/ai/source/BbIcon.md +9 -3
- package/dist/ai/source/BbIndicator.md +11 -4
- package/dist/ai/source/BbNumberInput.md +83 -28
- package/dist/ai/source/BbOffCanvas.md +227 -171
- package/dist/ai/source/BbPagination.md +151 -111
- package/dist/ai/source/BbPopover.md +28 -16
- package/dist/ai/source/BbProgress.md +13 -5
- package/dist/ai/source/BbRadio.md +220 -169
- package/dist/ai/source/BbRadioGroup.md +32 -19
- package/dist/ai/source/BbRating.md +208 -154
- package/dist/ai/source/BbSelect.md +133 -35
- package/dist/ai/source/BbSelectPopover.md +462 -371
- package/dist/ai/source/BbSlider.md +308 -217
- package/dist/ai/source/BbSmoothHeight.md +16 -7
- package/dist/ai/source/BbSpinner.md +9 -3
- package/dist/ai/source/BbSwitch.md +95 -17
- package/dist/ai/source/BbSwitchGroup.md +38 -23
- package/dist/ai/source/BbTable.md +641 -423
- package/dist/ai/source/BbTabs.md +120 -62
- package/dist/ai/source/BbTabsList.md +171 -72
- package/dist/ai/source/BbTabsPanels.md +127 -53
- package/dist/ai/source/BbTabsRoot.md +97 -46
- package/dist/ai/source/BbTag.md +58 -24
- package/dist/ai/source/BbTextInput.md +65 -14
- package/dist/ai/source/BbTextarea.md +54 -8
- package/dist/ai/source/BbTimePicker.md +195 -122
- package/dist/ai/source/BbTimePickerInput.md +127 -23
- package/dist/ai/source/BbToast.md +46 -21
- package/dist/ai/source/BbToastPortal.md +47 -22
- package/dist/ai/source/BbTooltip.md +18 -10
- package/dist/ai/source/BbTree.md +26 -6
- package/dist/ai/source/ClearableButton.md +5 -1
- package/dist/ai/source/CommonField.md +67 -11
- package/dist/ai/source/CommonFieldInput.md +61 -27
- package/dist/ai/source/CommonPopover.md +24 -6
- package/dist/ai/source/CommonTimeSelector.md +24 -3
- package/dist/ai/source/ErrorIcon.md +4 -0
- package/dist/ai/source/FlatListBox.md +1 -1
- package/dist/ai/source/GroupedListBox.md +1 -1
- package/dist/ai/source/ListBox.md +10 -2
- package/dist/ai/source/OptionsContainer.md +6 -2
- package/dist/ai/source/WarningIcon.md +4 -0
- package/dist/assets/css/reset.css_inline.js +1 -2
- package/dist/assets/svgs/alert.svg_raw.js +1 -2
- package/dist/assets/svgs/calendar.svg_raw.js +1 -2
- package/dist/assets/svgs/check_stroke.svg_raw.js +1 -2
- package/dist/assets/svgs/chevron_down.svg_raw.js +1 -2
- package/dist/assets/svgs/chevron_right.svg_raw.js +1 -2
- package/dist/assets/svgs/clear.svg_raw.js +1 -2
- package/dist/assets/svgs/clock.svg_raw.js +1 -2
- package/dist/assets/svgs/error.svg_raw.js +1 -2
- package/dist/assets/svgs/search.svg_raw.js +1 -2
- package/dist/assets/svgs/spinner.svg_raw.js +1 -2
- package/dist/assets/svgs/star.svg_raw.js +1 -2
- package/dist/assets/svgs/user.svg_raw.js +1 -2
- package/dist/components/BbAccordion/BbAccordion.vue.d.ts +2 -1
- package/dist/components/BbAccordion/BbAccordion.vue.js +1 -2
- package/dist/components/BbAccordion/BbAccordion.vue_vue_type_script_setup_true_lang.js +21 -22
- package/dist/components/BbAccordion/types.js +1 -2
- package/dist/components/BbAlert/BbAlert.vue.d.ts +2 -1
- package/dist/components/BbAlert/BbAlert.vue.js +1 -2
- package/dist/components/BbAlert/BbAlert.vue_vue_type_script_setup_true_lang.js +28 -29
- package/dist/components/BbAlert/types.js +1 -2
- package/dist/components/BbAsterisk/BbAsterisk.vue.d.ts +3 -1
- package/dist/components/BbAsterisk/BbAsterisk.vue.js +1 -2
- package/dist/components/BbAsterisk/BbAsterisk.vue_vue_type_script_setup_true_lang.js +1 -2
- package/dist/components/BbAsterisk/types.js +1 -2
- package/dist/components/BbAvatar/BbAvatar.vue.d.ts +3 -1
- package/dist/components/BbAvatar/BbAvatar.vue.js +1 -2
- package/dist/components/BbAvatar/BbAvatar.vue_vue_type_script_setup_true_lang.js +23 -24
- package/dist/components/BbAvatar/types.js +1 -2
- package/dist/components/BbBadge/BadgeBodyContent.vue.js +1 -2
- package/dist/components/BbBadge/BadgeBodyContent.vue_vue_type_script_setup_true_lang.js +13 -14
- package/dist/components/BbBadge/BbBadge.vue.d.ts +5 -3
- package/dist/components/BbBadge/BbBadge.vue.js +1 -2
- package/dist/components/BbBadge/BbBadge.vue_vue_type_script_setup_true_lang.js +31 -33
- package/dist/components/BbBadge/BbBadgeButton.vue.d.ts +3 -1
- package/dist/components/BbBadge/BbBadgeButton.vue.js +1 -2
- package/dist/components/BbBadge/BbBadgeButton.vue_vue_type_script_setup_true_lang.js +6 -11
- package/dist/components/BbBadge/badgeButtonContext.js +1 -2
- package/dist/components/BbBadge/types.d.ts +20 -4
- package/dist/components/BbBadge/types.js +7 -2
- package/dist/components/BbBaseButton/BbBaseButton.vue.d.ts +3 -1
- package/dist/components/BbBaseButton/BbBaseButton.vue.js +1 -2
- package/dist/components/BbBaseButton/BbBaseButton.vue_vue_type_script_setup_true_lang.js +89 -90
- package/dist/components/BbBaseButton/RouterComponent.vue.js +1 -2
- package/dist/components/BbBaseButton/RouterComponent.vue_vue_type_script_setup_true_lang.js +8 -9
- package/dist/components/BbBaseButton/types.d.ts +11 -6
- package/dist/components/BbBaseButton/types.js +6 -2
- package/dist/components/BbBaseButton/useLinkState.d.ts +2 -0
- package/dist/components/BbBaseButton/useLinkState.js +24 -24
- package/dist/components/BbBaseCheckboxIcon/BbBaseCheckboxIcon.vue.d.ts +3 -1
- package/dist/components/BbBaseCheckboxIcon/BbBaseCheckboxIcon.vue.js +1 -2
- package/dist/components/BbBaseCheckboxIcon/BbBaseCheckboxIcon.vue_vue_type_script_setup_true_lang.js +16 -17
- package/dist/components/BbBaseCheckboxIcon/types.d.ts +4 -2
- package/dist/components/BbBaseCheckboxIcon/types.js +3 -3
- package/dist/components/BbBaseRadioIcon/BbBaseRadioIcon.vue.d.ts +3 -1
- package/dist/components/BbBaseRadioIcon/BbBaseRadioIcon.vue.js +1 -2
- package/dist/components/BbBaseRadioIcon/BbBaseRadioIcon.vue_vue_type_script_setup_true_lang.js +13 -14
- package/dist/components/BbBaseRadioIcon/types.d.ts +4 -2
- package/dist/components/BbBaseRadioIcon/types.js +3 -3
- package/dist/components/BbBaseSwitchIcon/BbBaseSwitchIcon.vue.d.ts +3 -1
- package/dist/components/BbBaseSwitchIcon/BbBaseSwitchIcon.vue.js +1 -2
- package/dist/components/BbBaseSwitchIcon/BbBaseSwitchIcon.vue_vue_type_script_setup_true_lang.js +15 -16
- package/dist/components/BbBaseSwitchIcon/types.d.ts +4 -2
- package/dist/components/BbBaseSwitchIcon/types.js +3 -3
- package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue.d.ts +3 -1
- package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue.js +1 -2
- package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue_vue_type_script_setup_true_lang.js +158 -169
- package/dist/components/BbBreadcrumbs/estimateBreadcrumbItemWidth.js +1 -2
- package/dist/components/BbBreadcrumbs/types.d.ts +19 -5
- package/dist/components/BbBreadcrumbs/types.js +8 -3
- package/dist/components/BbButton/BbButton.vue.d.ts +2 -1
- package/dist/components/BbButton/BbButton.vue.js +1 -2
- package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +96 -97
- package/dist/components/BbButton/toggleRoving.js +2 -3
- package/dist/components/BbButton/types.d.ts +11 -6
- package/dist/components/BbButton/types.js +8 -2
- package/dist/components/BbCalendar/BbCalendar.vue.d.ts +127 -30
- package/dist/components/BbCalendar/BbCalendar.vue.js +1 -2
- package/dist/components/BbCalendar/BbCalendar.vue_vue_type_script_setup_true_lang.js +434 -420
- package/dist/components/BbCalendar/CalendarMonthPanel.vue.js +1 -2
- package/dist/components/BbCalendar/CalendarMonthPanel.vue_vue_type_script_setup_true_lang.js +15 -17
- package/dist/components/BbCalendar/CalendarYearPanel.vue.js +1 -2
- package/dist/components/BbCalendar/CalendarYearPanel.vue_vue_type_script_setup_true_lang.js +55 -57
- package/dist/components/BbCalendar/calendarHost.js +1 -2
- package/dist/components/BbCalendar/types.d.ts +110 -37
- package/dist/components/BbCalendar/types.js +54 -3
- package/dist/components/BbCalendar/useCalendarContext.js +1 -2
- package/dist/components/BbCalendar/useCalendarGrid.d.ts +133 -0
- package/dist/components/BbCalendar/useCalendarGrid.js +201 -204
- package/dist/components/BbCalendar/useDayGrid.d.ts +33 -11
- package/dist/components/BbCalendar/useDayGrid.js +169 -162
- package/dist/components/BbCalendar/useDayjsLocale.d.ts +6 -0
- package/dist/components/BbCalendar/useDayjsLocale.js +10 -4
- package/dist/components/BbCalendar/useToday.js +1 -2
- package/dist/components/BbCheckbox/BbCheckbox.vue.d.ts +4 -2
- package/dist/components/BbCheckbox/BbCheckbox.vue.js +1 -2
- package/dist/components/BbCheckbox/BbCheckbox.vue_vue_type_script_setup_true_lang.js +109 -116
- package/dist/components/BbCheckbox/types.d.ts +4 -2
- package/dist/components/BbCheckbox/types.js +3 -3
- package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue.d.ts +345 -2
- package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue.js +1 -2
- package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +126 -132
- package/dist/components/BbCheckboxGroup/types.d.ts +12 -6
- package/dist/components/BbCheckboxGroup/types.js +8 -9
- package/dist/components/BbCollapsible/BbCollapsible.vue.d.ts +3 -1
- package/dist/components/BbCollapsible/BbCollapsible.vue.js +1 -2
- package/dist/components/BbCollapsible/BbCollapsible.vue_vue_type_script_setup_true_lang.js +9 -10
- package/dist/components/BbCollapsible/types.js +1 -2
- package/dist/components/BbColorInput/BbColorInput.vue.d.ts +8 -5
- package/dist/components/BbColorInput/BbColorInput.vue.js +1 -2
- package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +171 -151
- package/dist/components/BbColorInput/types.d.ts +28 -11
- package/dist/components/BbColorInput/types.js +18 -9
- package/dist/components/BbColorPalette/BbColorPalette.vue.d.ts +7 -5
- package/dist/components/BbColorPalette/BbColorPalette.vue.js +1 -2
- package/dist/components/BbColorPalette/BbColorPalette.vue_vue_type_script_setup_true_lang.js +212 -219
- package/dist/components/BbColorPalette/types.d.ts +12 -4
- package/dist/components/BbColorPalette/types.js +4 -3
- package/dist/components/BbConfirm/BbConfirm.vue.js +1 -2
- package/dist/components/BbConfirm/BbConfirm.vue_vue_type_script_setup_true_lang.js +111 -100
- package/dist/components/BbConfirm/BbConfirmHost.js +9 -10
- package/dist/components/BbConfirm/BbConfirmPortal.vue.js +1 -2
- package/dist/components/BbConfirm/BbConfirmPortal.vue_vue_type_script_setup_true_lang.js +2 -3
- package/dist/components/BbConfirm/confirmEntry.js +1 -2
- package/dist/components/BbConfirm/types.d.ts +8 -4
- package/dist/components/BbConfirm/types.js +3 -3
- package/dist/components/BbDatePicker/BbDatePicker.vue.d.ts +162 -41
- package/dist/components/BbDatePicker/BbDatePicker.vue.js +1 -2
- package/dist/components/BbDatePicker/BbDatePicker.vue_vue_type_script_setup_true_lang.js +167 -219
- package/dist/components/BbDatePicker/types.d.ts +69 -25
- package/dist/components/BbDatePicker/types.js +6 -3
- package/dist/components/BbDatePickerInput/BbDatePickerInput.vue.d.ts +395 -37
- package/dist/components/BbDatePickerInput/BbDatePickerInput.vue.js +1 -2
- package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +485 -597
- package/dist/components/BbDatePickerInput/dateFieldLayout.js +1 -2
- package/dist/components/BbDatePickerInput/types.d.ts +92 -22
- package/dist/components/BbDatePickerInput/types.js +67 -7
- package/dist/components/BbDialog/BbDialog.vue.d.ts +7 -6
- package/dist/components/BbDialog/BbDialog.vue.js +1 -2
- package/dist/components/BbDialog/BbDialog.vue_vue_type_script_setup_true_lang.js +233 -238
- package/dist/components/BbDialog/types.d.ts +12 -10
- package/dist/components/BbDialog/types.js +3 -3
- package/dist/components/BbDialog/useDialogStack.d.ts +2 -0
- package/dist/components/BbDialog/useDialogStack.js +7 -4
- package/dist/components/BbDropdown/AdaptiveDropdown.vue.js +1 -2
- package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +58 -59
- package/dist/components/BbDropdown/BbDropdown.vue.d.ts +8 -6
- package/dist/components/BbDropdown/BbDropdown.vue.js +1 -2
- package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +306 -340
- package/dist/components/BbDropdown/BbDropdownGroup.vue.js +1 -2
- package/dist/components/BbDropdown/BbDropdownGroup.vue_vue_type_script_setup_true_lang.js +19 -22
- package/dist/components/BbDropdown/BbDropdownList.vue.js +1 -2
- package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +340 -357
- package/dist/components/BbDropdown/DropdownPipelineResolver.vue.js +1 -2
- package/dist/components/BbDropdown/DropdownPipelineResolver.vue_vue_type_script_setup_true_lang.js +127 -127
- package/dist/components/BbDropdown/DropdownRow.vue.js +1 -2
- package/dist/components/BbDropdown/DropdownRow.vue_vue_type_script_setup_true_lang.js +21 -22
- package/dist/components/BbDropdown/normalizeGroups.js +11 -12
- package/dist/components/BbDropdown/types.d.ts +25 -9
- package/dist/components/BbDropdown/types.js +28 -2
- package/dist/components/BbDropdown/useDropdownContext.js +2 -3
- package/dist/components/BbDropdown/useDropdownGroupRegistry.d.ts +1 -1
- package/dist/components/BbDropdown/useDropdownGroupRegistry.js +1 -2
- package/dist/components/BbDropdownButton/BbDropdownButton.vue.d.ts +6 -4
- package/dist/components/BbDropdownButton/BbDropdownButton.vue.js +1 -2
- package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +65 -68
- package/dist/components/BbDropdownButton/types.d.ts +16 -5
- package/dist/components/BbDropdownButton/types.js +17 -12
- package/dist/components/BbDropzone/BbDropzone.vue.d.ts +65 -22
- package/dist/components/BbDropzone/BbDropzone.vue.js +1 -2
- package/dist/components/BbDropzone/BbDropzone.vue_vue_type_script_setup_true_lang.js +141 -150
- package/dist/components/BbDropzone/types.d.ts +19 -5
- package/dist/components/BbDropzone/types.js +8 -2
- package/dist/components/BbForm/BbForm.vue.d.ts +52 -4
- package/dist/components/BbForm/BbForm.vue.js +1 -2
- package/dist/components/BbForm/BbForm.vue_vue_type_script_setup_true_lang.js +154 -159
- package/dist/components/BbForm/BbFormCustomField.js +2 -3
- package/dist/components/BbForm/bindFormField.js +2 -3
- package/dist/components/BbForm/formFields.js +1 -2
- package/dist/components/BbForm/formSchema.js +15 -53
- package/dist/components/BbHost/BbHost.vue.js +1 -2
- package/dist/components/BbHost/BbHost.vue_vue_type_script_setup_true_lang.js +20 -25
- package/dist/components/BbHost/BbHostOpening.js +12 -14
- package/dist/components/BbHoverCard/BbHoverCard.vue.d.ts +5 -4
- package/dist/components/BbHoverCard/BbHoverCard.vue.js +1 -2
- package/dist/components/BbHoverCard/BbHoverCard.vue_vue_type_script_setup_true_lang.js +160 -165
- package/dist/components/BbHoverCard/BbHoverCardPortal.vue.js +1 -2
- package/dist/components/BbHoverCard/BbHoverCardPortal.vue_vue_type_script_setup_true_lang.js +1 -2
- package/dist/components/BbHoverCard/hoverCardFocus.js +1 -2
- package/dist/components/BbHoverCard/types.js +1 -2
- package/dist/components/BbIcon/BbIcon.vue.d.ts +3 -1
- package/dist/components/BbIcon/BbIcon.vue.js +1 -2
- package/dist/components/BbIcon/BbIcon.vue_vue_type_script_setup_true_lang.js +24 -25
- package/dist/components/BbIcon/iconCache.js +1 -2
- package/dist/components/BbIcon/types.js +1 -2
- package/dist/components/BbIndicator/BbIndicator.vue.d.ts +3 -1
- package/dist/components/BbIndicator/BbIndicator.vue.js +1 -2
- package/dist/components/BbIndicator/BbIndicator.vue_vue_type_script_setup_true_lang.js +9 -10
- package/dist/components/BbIndicator/types.js +1 -2
- package/dist/components/BbNumberInput/BbNumberInput.vue.d.ts +6 -3
- package/dist/components/BbNumberInput/BbNumberInput.vue.js +1 -2
- package/dist/components/BbNumberInput/BbNumberInput.vue_vue_type_script_setup_true_lang.js +336 -369
- package/dist/components/BbNumberInput/numberDisplay.js +1 -2
- package/dist/components/BbNumberInput/platform.js +1 -2
- package/dist/components/BbNumberInput/types.d.ts +29 -6
- package/dist/components/BbNumberInput/types.js +11 -10
- package/dist/components/BbOffCanvas/BbOffCanvas.vue.d.ts +6 -5
- package/dist/components/BbOffCanvas/BbOffCanvas.vue.js +1 -2
- package/dist/components/BbOffCanvas/BbOffCanvas.vue_vue_type_script_setup_true_lang.js +347 -373
- package/dist/components/BbOffCanvas/hostCloseLabel.js +1 -2
- package/dist/components/BbOffCanvas/sheetAttrs.d.ts +9 -0
- package/dist/components/BbOffCanvas/sheetAttrs.js +9 -0
- package/dist/components/BbOffCanvas/sheetSnap.js +3 -8
- package/dist/components/BbOffCanvas/types.d.ts +12 -10
- package/dist/components/BbOffCanvas/types.js +3 -3
- package/dist/components/BbOffCanvas/useOffCanvasStack.d.ts +2 -0
- package/dist/components/BbOffCanvas/useOffCanvasStack.js +8 -5
- package/dist/components/BbPagination/BbPagination.vue.d.ts +2 -1
- package/dist/components/BbPagination/BbPagination.vue.js +1 -2
- package/dist/components/BbPagination/BbPagination.vue_vue_type_script_setup_true_lang.js +84 -85
- package/dist/components/BbPagination/paginationFit.js +0 -1
- package/dist/components/BbPagination/types.d.ts +17 -9
- package/dist/components/BbPagination/types.js +4 -3
- package/dist/components/BbPopover/BbPopover.vue.d.ts +5 -4
- package/dist/components/BbPopover/BbPopover.vue.js +1 -2
- package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +139 -157
- package/dist/components/BbPopover/BbPopoverPortal.vue.js +1 -2
- package/dist/components/BbPopover/BbPopoverPortal.vue_vue_type_script_setup_true_lang.js +1 -2
- package/dist/components/BbPopover/types.js +1 -2
- package/dist/components/BbProgress/BbProgress.vue.d.ts +6 -1
- package/dist/components/BbProgress/BbProgress.vue.js +1 -2
- package/dist/components/BbProgress/BbProgress.vue_vue_type_script_setup_true_lang.js +16 -17
- package/dist/components/BbProgress/types.js +1 -2
- package/dist/components/BbPtScope/BbPtScope.vue.js +1 -2
- package/dist/components/BbPtScope/BbPtScope.vue_vue_type_script_setup_true_lang.js +1 -2
- package/dist/components/BbRadio/BbRadio.vue.d.ts +4 -2
- package/dist/components/BbRadio/BbRadio.vue.js +1 -2
- package/dist/components/BbRadio/BbRadio.vue_vue_type_script_setup_true_lang.js +46 -50
- package/dist/components/BbRadio/types.d.ts +4 -2
- package/dist/components/BbRadio/types.js +3 -3
- package/dist/components/BbRadioGroup/BbRadioGroup.vue.d.ts +299 -1
- package/dist/components/BbRadioGroup/BbRadioGroup.vue.js +1 -2
- package/dist/components/BbRadioGroup/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +178 -184
- package/dist/components/BbRadioGroup/types.d.ts +12 -6
- package/dist/components/BbRadioGroup/types.js +8 -9
- package/dist/components/BbRating/BbRating.vue.d.ts +4 -2
- package/dist/components/BbRating/BbRating.vue.js +1 -2
- package/dist/components/BbRating/BbRating.vue_vue_type_script_setup_true_lang.js +143 -155
- package/dist/components/BbRating/types.d.ts +15 -5
- package/dist/components/BbRating/types.js +10 -3
- package/dist/components/BbSelect/BbSelect.vue.d.ts +553 -4
- package/dist/components/BbSelect/BbSelect.vue.js +1 -2
- package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +173 -205
- package/dist/components/BbSelect/types.d.ts +41 -7
- package/dist/components/BbSelect/types.js +17 -2
- package/dist/components/BbSelectPopover/BbSelectPopover.vue.d.ts +103 -3
- package/dist/components/BbSelectPopover/BbSelectPopover.vue.js +1 -2
- package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +571 -630
- package/dist/components/BbSelectPopover/knownItems.js +1 -2
- package/dist/components/BbSelectPopover/sheetChipAttrs.js +1 -2
- package/dist/components/BbSelectPopover/types.d.ts +29 -7
- package/dist/components/BbSelectPopover/types.js +9 -3
- package/dist/components/BbSlider/BbSlider.vue.d.ts +136 -33
- package/dist/components/BbSlider/BbSlider.vue.js +1 -2
- package/dist/components/BbSlider/BbSlider.vue_vue_type_script_setup_true_lang.js +213 -235
- package/dist/components/BbSlider/types.d.ts +32 -7
- package/dist/components/BbSlider/types.js +10 -3
- package/dist/components/BbSmoothHeight/BbSmoothHeight.vue.d.ts +3 -1
- package/dist/components/BbSmoothHeight/BbSmoothHeight.vue.js +1 -2
- package/dist/components/BbSmoothHeight/BbSmoothHeight.vue_vue_type_script_setup_true_lang.js +14 -21
- package/dist/components/BbSmoothHeight/types.js +1 -2
- package/dist/components/BbSpinner/BbSpinner.vue.d.ts +3 -1
- package/dist/components/BbSpinner/BbSpinner.vue.js +1 -2
- package/dist/components/BbSpinner/BbSpinner.vue_vue_type_script_setup_true_lang.js +14 -15
- package/dist/components/BbSpinner/types.js +1 -2
- package/dist/components/BbSwitch/BbSwitch.vue.d.ts +4 -2
- package/dist/components/BbSwitch/BbSwitch.vue.js +1 -2
- package/dist/components/BbSwitch/BbSwitch.vue_vue_type_script_setup_true_lang.js +110 -117
- package/dist/components/BbSwitch/types.d.ts +21 -2
- package/dist/components/BbSwitch/types.js +8 -5
- package/dist/components/BbSwitchGroup/BbSwitchGroup.vue.d.ts +145 -1
- package/dist/components/BbSwitchGroup/BbSwitchGroup.vue.js +1 -2
- package/dist/components/BbSwitchGroup/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +155 -160
- package/dist/components/BbSwitchGroup/types.d.ts +11 -4
- package/dist/components/BbSwitchGroup/types.js +4 -5
- package/dist/components/BbTable/BbTable.vue.d.ts +5 -2
- package/dist/components/BbTable/BbTable.vue.js +1 -2
- package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +1143 -1301
- package/dist/components/BbTable/BbTableDataRow.js +1 -2
- package/dist/components/BbTable/BbTableEdgeRow.js +1 -2
- package/dist/components/BbTable/BbTableExpandRow.js +1 -2
- package/dist/components/BbTable/BbTableSelectToggle.js +17 -18
- package/dist/components/BbTable/gridWidgets.js +2 -7
- package/dist/components/BbTable/measuredFloors.js +67 -65
- package/dist/components/BbTable/textRuler.d.ts +3 -1
- package/dist/components/BbTable/textRuler.js +40 -39
- package/dist/components/BbTable/types.d.ts +54 -9
- package/dist/components/BbTable/types.js +45 -3
- package/dist/components/BbTable/useRowReorder.js +179 -203
- package/dist/components/BbTable/utils.d.ts +9 -2
- package/dist/components/BbTable/utils.js +66 -72
- package/dist/components/BbTabs/BbTabs.vue.d.ts +103 -2
- package/dist/components/BbTabs/BbTabs.vue.js +1 -2
- package/dist/components/BbTabs/BbTabs.vue_vue_type_script_setup_true_lang.js +26 -30
- package/dist/components/BbTabs/BbTabsList.vue.d.ts +11 -1
- package/dist/components/BbTabs/BbTabsList.vue.js +1 -2
- package/dist/components/BbTabs/BbTabsList.vue_vue_type_script_setup_true_lang.js +112 -107
- package/dist/components/BbTabs/BbTabsPanels.vue.d.ts +9 -1
- package/dist/components/BbTabs/BbTabsPanels.vue.js +1 -2
- package/dist/components/BbTabs/BbTabsPanels.vue_vue_type_script_setup_true_lang.js +22 -22
- package/dist/components/BbTabs/BbTabsRoot.vue.js +1 -2
- package/dist/components/BbTabs/BbTabsRoot.vue_vue_type_script_setup_true_lang.js +6 -7
- package/dist/components/BbTabs/tablistName.js +1 -2
- package/dist/components/BbTabs/types.d.ts +71 -33
- package/dist/components/BbTabs/types.js +11 -3
- package/dist/components/BbTag/BbTag.vue.d.ts +5 -2
- package/dist/components/BbTag/BbTag.vue.js +1 -2
- package/dist/components/BbTag/BbTag.vue_vue_type_script_setup_true_lang.js +218 -243
- package/dist/components/BbTag/types.d.ts +22 -12
- package/dist/components/BbTag/types.js +19 -9
- package/dist/components/BbTextInput/BbTextInput.vue.d.ts +209 -2
- package/dist/components/BbTextInput/BbTextInput.vue.js +1 -2
- package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +136 -142
- package/dist/components/BbTextInput/types.d.ts +17 -5
- package/dist/components/BbTextInput/types.js +22 -12
- package/dist/components/BbTextarea/BbTextarea.vue.d.ts +207 -2
- package/dist/components/BbTextarea/BbTextarea.vue.js +1 -2
- package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +142 -144
- package/dist/components/BbTextarea/types.d.ts +17 -5
- package/dist/components/BbTextarea/types.js +22 -12
- package/dist/components/BbTimePicker/BbTimePicker.vue.d.ts +84 -38
- package/dist/components/BbTimePicker/BbTimePicker.vue.js +1 -2
- package/dist/components/BbTimePicker/BbTimePicker.vue_vue_type_script_setup_true_lang.js +166 -171
- package/dist/components/BbTimePicker/types.d.ts +31 -7
- package/dist/components/BbTimePicker/types.js +4 -3
- package/dist/components/BbTimePickerInput/BbTimePickerInput.vue.d.ts +272 -33
- package/dist/components/BbTimePickerInput/BbTimePickerInput.vue.js +1 -2
- package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +295 -327
- package/dist/components/BbTimePickerInput/types.d.ts +45 -9
- package/dist/components/BbTimePickerInput/types.js +17 -7
- package/dist/components/BbToast/BbToast.vue.js +1 -2
- package/dist/components/BbToast/BbToast.vue_vue_type_script_setup_true_lang.js +12 -17
- package/dist/components/BbToast/BbToastMessage.vue.js +1 -2
- package/dist/components/BbToast/BbToastMessage.vue_vue_type_script_setup_true_lang.js +72 -74
- package/dist/components/BbToast/BbToastPortal.vue.js +1 -2
- package/dist/components/BbToast/BbToastPortal.vue_vue_type_script_setup_true_lang.js +2 -3
- package/dist/components/BbToast/BbToastRegion.vue.js +1 -2
- package/dist/components/BbToast/BbToastRegion.vue_vue_type_script_setup_true_lang.js +27 -28
- package/dist/components/BbToast/types.d.ts +17 -5
- package/dist/components/BbToast/types.js +12 -13
- package/dist/components/BbTooltip/BbTooltip.vue.d.ts +3 -2
- package/dist/components/BbTooltip/BbTooltip.vue.js +1 -2
- package/dist/components/BbTooltip/BbTooltip.vue_vue_type_script_setup_true_lang.js +69 -70
- package/dist/components/BbTooltip/tooltipWarmup.js +0 -1
- package/dist/components/BbTooltip/types.js +1 -2
- package/dist/components/BbTree/BbTree.vue.d.ts +2 -3
- package/dist/components/BbTree/BbTree.vue.js +1 -2
- package/dist/components/BbTree/BbTree.vue_vue_type_script_setup_true_lang.js +28 -27
- package/dist/components/BbTree/BbTreeLevel.vue.js +1 -2
- package/dist/components/BbTree/BbTreeLevel.vue_vue_type_script_setup_true_lang.js +12 -20
- package/dist/components/BbTree/context.js +1 -2
- package/dist/components/BbTree/types.d.ts +13 -3
- package/dist/components/BbTree/types.js +4 -3
- package/dist/components/ChipsBox/ChipsBox.vue.js +1 -2
- package/dist/components/ChipsBox/ChipsBox.vue_vue_type_script_setup_true_lang.js +24 -26
- package/dist/components/ClearableButton/ClearableButton.vue.d.ts +3 -1
- package/dist/components/ClearableButton/ClearableButton.vue.js +1 -2
- package/dist/components/ClearableButton/ClearableButton.vue_vue_type_script_setup_true_lang.js +1 -2
- package/dist/components/CloseIcon/CloseButton.vue.d.ts +3 -1
- package/dist/components/CloseIcon/CloseButton.vue.js +2 -3
- package/dist/components/CloseIcon/CloseButton.vue_vue_type_script_setup_true_lang.js +3 -4
- package/dist/components/CommaBox/CommaBox.vue.js +1 -2
- package/dist/components/CommaBox/CommaBox.vue_vue_type_script_setup_true_lang.js +20 -22
- package/dist/components/CommonField/CommonField.vue.d.ts +3 -1
- package/dist/components/CommonField/CommonField.vue.js +1 -2
- package/dist/components/CommonField/CommonField.vue_vue_type_script_setup_true_lang.js +78 -73
- package/dist/components/CommonField/types.d.ts +2 -2
- package/dist/components/CommonFieldInput/CommonFieldInput.vue.d.ts +5 -3
- package/dist/components/CommonFieldInput/CommonFieldInput.vue.js +1 -2
- package/dist/components/CommonFieldInput/CommonFieldInput.vue_vue_type_script_setup_true_lang.js +20 -21
- package/dist/components/CommonPopover/CommonPopover.vue.d.ts +5 -4
- package/dist/components/CommonPopover/CommonPopover.vue.js +1 -2
- package/dist/components/CommonPopover/CommonPopover.vue_vue_type_script_setup_true_lang.js +90 -89
- package/dist/components/CommonTimeSelector/CommonTimeSelector.vue.js +1 -2
- package/dist/components/CommonTimeSelector/CommonTimeSelector.vue_vue_type_script_setup_true_lang.js +29 -38
- package/dist/components/CommonTimeSelector/useMeridiem.js +1 -2
- package/dist/components/ErrorIcon/ErrorIcon.vue.d.ts +3 -1
- package/dist/components/ErrorIcon/ErrorIcon.vue.js +1 -2
- package/dist/components/ErrorIcon/ErrorIcon.vue_vue_type_script_setup_true_lang.js +1 -2
- package/dist/components/FlatListBox/FlatListBox.vue.js +1 -2
- package/dist/components/FlatListBox/FlatListBox.vue_vue_type_script_setup_true_lang.js +87 -94
- package/dist/components/FlatListBox/types.d.ts +1 -1
- package/dist/components/GroupedListBox/GroupedListBox.vue.js +1 -2
- package/dist/components/GroupedListBox/GroupedListBox.vue_vue_type_script_setup_true_lang.js +55 -62
- package/dist/components/GroupedListBox/types.d.ts +1 -1
- package/dist/components/ListBox/ListBox.vue.d.ts +1 -1
- package/dist/components/ListBox/ListBox.vue.js +1 -2
- package/dist/components/ListBox/ListBox.vue_vue_type_script_setup_true_lang.js +21 -22
- package/dist/components/ListBox/types.d.ts +1 -1
- package/dist/components/OptionsContainer/OptionsContainer.vue.d.ts +1 -1
- package/dist/components/OptionsContainer/OptionsContainer.vue.js +1 -2
- package/dist/components/OptionsContainer/OptionsContainer.vue_vue_type_script_setup_true_lang.js +23 -27
- package/dist/components/OptionsContainer/types.d.ts +1 -1
- package/dist/components/Transitions/ScaleFade.vue.js +1 -2
- package/dist/components/Transitions/ScaleFade.vue_vue_type_script_setup_true_lang.js +1 -2
- package/dist/components/Transitions/Slide.vue.d.ts +1 -1
- package/dist/components/Transitions/Slide.vue.js +4 -5
- package/dist/components/Transitions/Slide.vue_vue_type_script_setup_true_lang.js +4 -5
- package/dist/components/WarningIcon/WarningIcon.vue.d.ts +3 -1
- package/dist/components/WarningIcon/WarningIcon.vue.js +1 -2
- package/dist/components/WarningIcon/WarningIcon.vue_vue_type_script_setup_true_lang.js +1 -2
- package/dist/composables/autoHost.d.ts +22 -0
- package/dist/composables/autoHost.js +19 -0
- package/dist/composables/formSubmitLock.js +1 -2
- package/dist/composables/hostOpenings.d.ts +3 -3
- package/dist/composables/hostOpenings.js +7 -12
- package/dist/composables/hostRegistry.d.ts +10 -2
- package/dist/composables/hostRegistry.js +6 -5
- package/dist/composables/overlayRegistry.d.ts +1 -1
- package/dist/composables/overlayRegistry.js +4 -5
- package/dist/composables/ssrMarker.js +1 -2
- package/dist/composables/useActiveInactiveState.js +1 -2
- package/dist/composables/useArray.js +1 -2
- package/dist/composables/useBaseOptions.js +19 -20
- package/dist/composables/useBbConfig.js +1 -2
- package/dist/composables/{useBbDialogContext.d.ts → useBbDialog.d.ts} +9 -9
- package/dist/composables/{useBbDialogContext.js → useBbDialog.js} +19 -23
- package/dist/composables/{useBbDropdownContext.d.ts → useBbDropdown.d.ts} +14 -14
- package/dist/composables/{useBbDropdownContext.js → useBbDropdown.js} +4 -5
- package/dist/composables/{useBbFormContext.d.ts → useBbForm.d.ts} +8 -8
- package/dist/composables/{useBbFormContext.js → useBbForm.js} +8 -12
- package/dist/composables/useBbFormField.js +1 -2
- package/dist/composables/useBbOffCanvas.d.ts +23 -0
- package/dist/composables/useBbOffCanvas.js +7 -0
- package/dist/composables/{useBbTableContext.d.ts → useBbTable.d.ts} +29 -29
- package/dist/composables/{useBbTableContext.js → useBbTable.js} +3 -4
- package/dist/composables/{useBbTabsContext.d.ts → useBbTabs.d.ts} +19 -3
- package/dist/composables/useBbTabs.js +254 -0
- package/dist/composables/useBodyScrollLock.js +1 -2
- package/dist/composables/useBreakpoint.js +1 -2
- package/dist/composables/useCancelableFunction.js +1 -2
- package/dist/composables/useCharacterCounter.js +2 -3
- package/dist/composables/useChoiceIndicator.js +4 -9
- package/dist/composables/useClosingInert.js +3 -8
- package/dist/composables/useCoarsePointer.js +1 -2
- package/dist/composables/useCoherence.js +1 -2
- package/dist/composables/useConfig.js +1 -2
- package/dist/composables/useConfirm.d.ts +28 -31
- package/dist/composables/useConfirm.js +8 -9
- package/dist/composables/useCountdown.js +6 -7
- package/dist/composables/useEscapeStackEntry.js +1 -2
- package/dist/composables/useFormBinding.js +6 -9
- package/dist/composables/useFrameworkDetection.js +1 -2
- package/dist/composables/useHashedWatcher.js +1 -2
- package/dist/composables/useHydrated.js +1 -2
- package/dist/composables/useId.js +1 -2
- package/dist/composables/useImeDismissBlur.js +2 -7
- package/dist/composables/useIndexById.js +1 -2
- package/dist/composables/useInertiaPage.js +1 -2
- package/dist/composables/useItemText.js +3 -3
- package/dist/composables/useItemValue.js +1 -2
- package/dist/composables/useItemsGetter.js +12 -19
- package/dist/composables/useKeyboardInset.js +0 -1
- package/dist/composables/useListboxFocus.js +1 -2
- package/dist/composables/useLocale.js +7 -8
- package/dist/composables/useLogger.js +1 -2
- package/dist/composables/useMobile.js +1 -2
- package/dist/composables/useOnDemandOpener.d.ts +4 -4
- package/dist/composables/useOnDemandOpener.js +12 -13
- package/dist/composables/useOnFalsy.js +1 -2
- package/dist/composables/useOnTruthy.js +1 -2
- package/dist/composables/useOverlayNavigation.js +6 -11
- package/dist/composables/useOverlayYield.js +1 -2
- package/dist/composables/usePassthrough.js +207 -123
- package/dist/composables/usePrefill.js +11 -16
- package/dist/composables/useQuery.js +9 -22
- package/dist/composables/useRefusedCloseAnnouncement.js +1 -2
- package/dist/composables/useRoute.js +1 -2
- package/dist/composables/useRouter.js +1 -2
- package/dist/composables/useSafeArea.js +10 -11
- package/dist/composables/useSafeAreaInternal.js +4 -5
- package/dist/composables/useSegmentedFields.js +5 -17
- package/dist/composables/useServerPrefetch.js +1 -2
- package/dist/composables/useSheetSurface.js +1 -2
- package/dist/composables/useSsrState.js +1 -2
- package/dist/composables/useTableWidthContext.js +2 -3
- package/dist/composables/useToast.d.ts +4 -5
- package/dist/composables/useToast.js +4 -5
- package/dist/composables/useToggleInput.js +1 -2
- package/dist/composables/useTopLayer.js +1 -2
- package/dist/composables/useTypeahead.js +0 -1
- package/dist/composables/useUntil.js +1 -2
- package/dist/composables/useUrlQueryParam.d.ts +1 -1
- package/dist/composables/useUrlQueryParam.js +1 -2
- package/dist/composables/useViewportWidth.js +2 -3
- package/dist/deprecation/ai-deprecations.json.js +1 -2
- package/dist/deprecation/removedProps.js +1 -2
- package/dist/directives/bbColor.js +7 -8
- package/dist/directives/bbDate.js +7 -8
- package/dist/directives/bbDialog.d.ts +1 -1
- package/dist/directives/bbDialog.js +1 -2
- package/dist/directives/bbDropdown.js +14 -15
- package/dist/directives/bbHoverCard.js +8 -9
- package/dist/directives/bbOffCanvas.d.ts +1 -1
- package/dist/directives/bbOffCanvas.js +1 -2
- package/dist/directives/bbPopover.js +12 -13
- package/dist/directives/bbTime.js +7 -8
- package/dist/directives/bbTooltip.js +1 -2
- package/dist/directives/createPopoverDirective.js +6 -17
- package/dist/directives/directivePortal.js +1 -2
- package/dist/directives/overlayTrigger.js +20 -21
- package/dist/directives/renderingInstance.js +4 -8
- package/dist/i18n/locales/cs.json +8 -1
- package/dist/i18n/locales/da.json +8 -1
- package/dist/i18n/locales/de-CH.json +8 -1
- package/dist/i18n/locales/de.json +8 -1
- package/dist/i18n/locales/el.json +8 -1
- package/dist/i18n/locales/en-GB.json +8 -1
- package/dist/i18n/locales/en.json +8 -1
- package/dist/i18n/locales/es-MX.json +8 -1
- package/dist/i18n/locales/es.json +8 -1
- package/dist/i18n/locales/fi.json +8 -1
- package/dist/i18n/locales/fr.json +8 -1
- package/dist/i18n/locales/hu.json +8 -1
- package/dist/i18n/locales/it.json +8 -1
- package/dist/i18n/locales/ja.json +8 -1
- package/dist/i18n/locales/ko.json +8 -1
- package/dist/i18n/locales/nb.json +8 -1
- package/dist/i18n/locales/nl.json +8 -1
- package/dist/i18n/locales/pl.json +8 -1
- package/dist/i18n/locales/pt-BR.json +8 -1
- package/dist/i18n/locales/pt-PT.json +8 -1
- package/dist/i18n/locales/ro.json +8 -1
- package/dist/i18n/locales/ru.json +8 -1
- package/dist/i18n/locales/sv.json +8 -1
- package/dist/i18n/locales/tr.json +8 -1
- package/dist/i18n/locales/uk.json +8 -1
- package/dist/i18n/locales/zh-CN.json +8 -1
- package/dist/i18n/locales/zh-HK.json +8 -1
- package/dist/i18n/locales/zh-TW.json +8 -1
- package/dist/i18n/regionHints.js +1 -2
- package/dist/i18n/regions.js +1 -2
- package/dist/icon-scan.js +6 -11
- package/dist/index.d.ts +15 -15
- package/dist/index.js +88 -88
- package/dist/llms-full.txt +4886 -2972
- package/dist/llms-medium.txt +170 -112
- package/dist/llms.txt +12 -12
- package/dist/locale-blueprint.json +8 -1
- package/dist/nuxt-auto-imports.js +7 -8
- package/dist/nuxt.js +21 -22
- package/dist/passthrough-deduper.js +1 -2
- package/dist/plugin.js +24 -23
- package/dist/project-dts.js +1 -2
- package/dist/runtime/nuxt-plugin.js +39 -38
- package/dist/styles.css +2 -2
- package/dist/types/AlertVariant.js +1 -2
- package/dist/types/BadgeVariant.js +1 -2
- package/dist/types/ButtonVariant.js +1 -2
- package/dist/types/CheckboxVariant.js +1 -2
- package/dist/types/ConfirmVariant.js +1 -2
- package/dist/types/DatePickerType.d.ts +10 -5
- package/dist/types/DatePickerType.js +3 -4
- package/dist/types/DropdownItemVariant.js +1 -2
- package/dist/types/FieldLayout.js +1 -2
- package/dist/types/IndicatorVariant.js +1 -2
- package/dist/types/InputVariant.js +1 -2
- package/dist/types/RadioVariant.js +1 -2
- package/dist/types/ShapeErased.d.ts +15 -0
- package/dist/types/TabsVariant.js +1 -2
- package/dist/types/ToastVariant.js +1 -2
- package/dist/types/TooltipVariant.js +1 -2
- package/dist/types/fallthrough.d.ts +134 -0
- package/dist/types/passthrough.d.ts +112 -2
- package/dist/types/passthrough.js +19 -13
- package/dist/types/ptComponentMap.d.ts +31 -31
- package/dist/utilities/functions/animationsSettled.js +1 -2
- package/dist/utilities/functions/bytesToUnit.js +1 -2
- package/dist/utilities/functions/chunk.js +1 -2
- package/dist/utilities/functions/clamp.js +1 -2
- package/dist/utilities/functions/clampPrecision.js +1 -2
- package/dist/utilities/functions/convertDateValue.d.ts +5 -2
- package/dist/utilities/functions/convertDateValue.js +19 -13
- package/dist/utilities/functions/curry.js +1 -2
- package/dist/utilities/functions/deburr.js +1 -2
- package/dist/utilities/functions/elementLabel.js +1 -2
- package/dist/utilities/functions/empty.js +1 -2
- package/dist/utilities/functions/extractDomContainer.js +1 -2
- package/dist/utilities/functions/findInTree.js +1 -2
- package/dist/utilities/functions/flattenTree.js +1 -2
- package/dist/utilities/functions/get.js +1 -2
- package/dist/utilities/functions/hasVnodeListener.js +1 -2
- package/dist/utilities/functions/hash.js +1 -2
- package/dist/utilities/functions/head.js +1 -2
- package/dist/utilities/functions/identity.js +1 -2
- package/dist/utilities/functions/indexBy.js +1 -2
- package/dist/utilities/functions/isDateDisabled.js +23 -19
- package/dist/utilities/functions/isEqual.js +1 -2
- package/dist/utilities/functions/isHex.js +1 -2
- package/dist/utilities/functions/isImeComposing.js +1 -2
- package/dist/utilities/functions/isNil.js +1 -2
- package/dist/utilities/functions/isNotEmpty.js +1 -2
- package/dist/utilities/functions/isNotNil.js +1 -2
- package/dist/utilities/functions/isTextEntry.js +1 -2
- package/dist/utilities/functions/isoWeek.d.ts +36 -0
- package/dist/utilities/functions/isoWeek.js +21 -0
- package/dist/utilities/functions/itemProps.js +1 -2
- package/dist/utilities/functions/last.js +1 -2
- package/dist/utilities/functions/matchAnyKey.js +1 -2
- package/dist/utilities/functions/noop.js +1 -2
- package/dist/utilities/functions/normalizeDateBound.d.ts +11 -5
- package/dist/utilities/functions/normalizeDateBound.js +6 -5
- package/dist/utilities/functions/parsePaginationNumber.js +1 -2
- package/dist/utilities/functions/parseSize.js +1 -2
- package/dist/utilities/functions/parseWidthString.js +1 -2
- package/dist/utilities/functions/percentage.js +1 -2
- package/dist/utilities/functions/pickBy.js +1 -2
- package/dist/utilities/functions/range.js +1 -2
- package/dist/utilities/functions/readableValue.js +1 -2
- package/dist/utilities/functions/reject.js +1 -2
- package/dist/utilities/functions/resolveEnumProp.js +1 -2
- package/dist/utilities/functions/responsiveDefault.js +1 -2
- package/dist/utilities/functions/settlesVisible.js +1 -2
- package/dist/utilities/functions/slotKey.js +1 -2
- package/dist/utilities/functions/snapToStep.js +1 -2
- package/dist/utilities/functions/sort.js +1 -2
- package/dist/utilities/functions/throttle.js +1 -2
- package/dist/utilities/functions/toggleInput.js +1 -2
- package/dist/utilities/functions/transpose.js +1 -2
- package/dist/utilities/functions/validateDateFormat.js +1 -2
- package/dist/utilities/functions/wait.js +1 -2
- package/dist/utilities/functions/waitFor.js +2 -7
- package/dist/utilities/functions/warnRemovedAttrs.js +2 -5
- package/dist/utilities/functions/when.js +1 -2
- package/dist/utilities/misc/autofocus.js +1 -2
- package/dist/utilities/misc/iconsInjectionKey.js +1 -2
- package/dist/utilities/misc/listboxMetrics.js +1 -2
- package/dist/utilities/misc/maskaDataOptions.d.ts +12 -0
- package/dist/utilities/misc/maskaDataOptions.js +36 -0
- package/dist/utilities/misc/pageText.d.ts +16 -0
- package/dist/utilities/misc/pageText.js +10 -0
- package/dist/utilities/misc/ssrStateInjectionKey.js +1 -2
- package/dist/utilities/misc/ssrValue.js +1 -2
- package/dist/utilities/misc/transitions.js +1 -2
- package/dist/utils/copyData.js +1 -2
- package/dist/utils/cssLayers.js +1 -2
- package/dist/utils/focusVisibility.js +1 -2
- package/dist/utils/injectLibraryStyles.js +3 -12
- package/dist/utils/overlayEscapeStack.js +1 -2
- package/dist/utils/overlaySurfaceIsolation.js +1 -2
- package/dist/utils/passthrough.js +2 -3
- package/dist/utils/ptScope.js +1 -2
- package/dist/utils/versionCheck.js +2 -3
- package/dist/vite-plugin.d.ts +1 -1
- package/dist/vite.js +364 -437
- package/llms.txt +12 -12
- package/package.json +14 -10
- package/scripts/lib/adoption-checklist.json +3 -2
- package/scripts/lib/check-queue.mjs +102 -0
- package/scripts/lib/consumer-install.mjs +64 -0
- package/scripts/lib/css-class-surface.mjs +39 -3
- package/scripts/lib/css-comment-text.mjs +16 -0
- package/scripts/lib/eslint-disable.mjs +9 -1
- package/scripts/lib/eslint-plugin.d.ts +7 -1
- package/scripts/lib/eslint-plugin.mjs +286 -7
- package/scripts/lib/form-v-model.mjs +2 -2
- package/scripts/lib/helper-canon.mjs +34 -2
- package/scripts/lib/helpers-add.mjs +80 -13
- package/scripts/lib/hidden-label-placeholder.mjs +151 -0
- package/scripts/lib/html-attributes.mjs +82 -0
- package/scripts/lib/idiom-scan.mjs +175 -2
- package/scripts/lib/mcp-config.mjs +1 -1
- package/scripts/lib/pack.mjs +55 -0
- package/scripts/lib/portal-names.mjs +3 -3
- package/scripts/lib/prefer-v-bb-dialog.mjs +1 -1
- package/scripts/lib/quiet-gate.mjs +385 -0
- package/scripts/lib/reactive-v-model.mjs +11 -5
- package/scripts/lib/tab-links.mjs +209 -0
- package/scripts/lib/token-color-mix.mjs +114 -0
- package/scripts/lib/toolchain-check.mjs +34 -3
- package/scripts/lib/unstyled-variants.mjs +57 -0
- package/scripts/lib/validate-bb-markup.mjs +149 -4
- package/dist/composables/useBbOffCanvasContext.d.ts +0 -23
- package/dist/composables/useBbOffCanvasContext.js +0 -8
- package/dist/composables/useBbTabsContext.js +0 -252
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The quiet gate (owner 2026-10-29): browser runs start on a machine quiet
|
|
3
|
+
* enough to trust their timings. beta.66's release run went red only because
|
|
4
|
+
* six tabs ran browser suites at once (1-minute load 30–60 on 8 cores, Firefox
|
|
5
|
+
* delaying animation frames by 1–8.5 s, pt-matrix cases timing out); the same
|
|
6
|
+
* files were green 564/564 at load ~20.
|
|
7
|
+
*
|
|
8
|
+
* Two parts, both here so every runner shares one rule:
|
|
9
|
+
*
|
|
10
|
+
* LOAD GUARD (`waitForLowLoad`). Before a browser run, wait until the 1-minute
|
|
11
|
+
* load is at most LOAD_FACTOR × cores. A first reading already under the line
|
|
12
|
+
* starts at once; once over, the load must stay under for SETTLE_MS. Polls,
|
|
13
|
+
* never blocks forever: after LOAD_MAX_WAIT_MS it runs anyway and says so
|
|
14
|
+
* loudly (the caller also puts it in its results).
|
|
15
|
+
*
|
|
16
|
+
* QUIET WINDOW (`claimQuiet` / `waitForQuietWindow`). A heavy run (release:local,
|
|
17
|
+
* test:engines, a full test:ci:browser) claims `<git-common-dir>/bb-quiet/claim`
|
|
18
|
+
* (pid, lane, start, token; O_EXCL, dead holders reaped), machine-wide for every
|
|
19
|
+
* worktree of the repo. Any other browser run waits while a live claim that is
|
|
20
|
+
* not its own exists, printing who holds it. The holder exports its token in
|
|
21
|
+
* BB_QUIET_TOKEN, so its own children (release:check's chunked browser run,
|
|
22
|
+
* test:fixtures, the vitest processes) see the claim as theirs and never wait
|
|
23
|
+
* on it; they skip the load guard too, which the holder already passed.
|
|
24
|
+
*
|
|
25
|
+
* Off switch: BB_QUIET_GATE=off (a deliberate run) skips every wait; a heavy
|
|
26
|
+
* run still claims a FREE window, so the other tabs keep out of its way. CI
|
|
27
|
+
* (one job per machine) skips the whole gate. Node-only suites are never
|
|
28
|
+
* guarded. `node scripts/quiet-gate.mjs` is the shell side (status, wait,
|
|
29
|
+
* claim around any command).
|
|
30
|
+
*
|
|
31
|
+
* The claim is advisory, like `.git/night-wall.lock`: reaping a dead holder
|
|
32
|
+
* deletes the file only if it is byte-for-byte the dead claim (random token),
|
|
33
|
+
* without gate.mjs's takeover mutex. The worst a race there can do is let two
|
|
34
|
+
* heavy runs overlap once; it can never block a run (every wait has a max).
|
|
35
|
+
*
|
|
36
|
+
* Everything external (load, cores, clock, sleep, pids, log) is injectable, so
|
|
37
|
+
* the node tests drive it with fakes and never really wait.
|
|
38
|
+
*/
|
|
39
|
+
import { randomBytes } from 'node:crypto';
|
|
40
|
+
import {
|
|
41
|
+
mkdirSync,
|
|
42
|
+
readFileSync,
|
|
43
|
+
rmSync,
|
|
44
|
+
statSync,
|
|
45
|
+
writeFileSync,
|
|
46
|
+
} from 'node:fs';
|
|
47
|
+
import os from 'node:os';
|
|
48
|
+
import path from 'node:path';
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Load per core above which a browser run waits. Measured 2026-10-29 on the
|
|
52
|
+
* 8-core dev machine: green 564/564 at a 1-minute load ~20 (2.5×), 13 timeouts
|
|
53
|
+
* at ~35 (4.4×), the release run red around 60 (7.5×). 3× keeps the green
|
|
54
|
+
* reading in and both red ones out.
|
|
55
|
+
*/
|
|
56
|
+
export const LOAD_FACTOR = 3;
|
|
57
|
+
/** Once over the line, how long the load must stay under before a run starts. */
|
|
58
|
+
export const SETTLE_MS = 30_000;
|
|
59
|
+
export const LOAD_POLL_MS = 5_000;
|
|
60
|
+
/** The load guard runs anyway after this, loudly. */
|
|
61
|
+
export const LOAD_MAX_WAIT_MS = 20 * 60_000;
|
|
62
|
+
export const CLAIM_POLL_MS = 15_000;
|
|
63
|
+
/** A run waits this long for someone else's quiet window, then runs, loudly. */
|
|
64
|
+
export const QUIET_MAX_WAIT_MS = 90 * 60_000;
|
|
65
|
+
/** A claim file with no readable pid is "being written" this long. */
|
|
66
|
+
const CLAIM_BIRTH_MS = 10_000;
|
|
67
|
+
/** How often a waiting run repeats its status line. */
|
|
68
|
+
const REPORT_EVERY_MS = 60_000;
|
|
69
|
+
|
|
70
|
+
export const TOKEN_ENV = 'BB_QUIET_TOKEN';
|
|
71
|
+
const TAG = '[quiet-gate]';
|
|
72
|
+
|
|
73
|
+
const realSleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
74
|
+
|
|
75
|
+
export function pidAlive(pid) {
|
|
76
|
+
try {
|
|
77
|
+
process.kill(pid, 0);
|
|
78
|
+
return true;
|
|
79
|
+
} catch (e) {
|
|
80
|
+
return e.code === 'EPERM';
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** "40 s", "3 min", "3 min 20 s": a wait under a minute is not "0 min". */
|
|
85
|
+
const minutes = (ms) => {
|
|
86
|
+
const s = Math.round(ms / 1000);
|
|
87
|
+
if (s < 60) return `${s} s`;
|
|
88
|
+
return s % 60 ? `${Math.floor(s / 60)} min ${s % 60} s` : `${s / 60} min`;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
/** Why the waiting is off, or null. */
|
|
92
|
+
export function gateDisabled(env = process.env) {
|
|
93
|
+
if (env.BB_QUIET_GATE === 'off') return 'BB_QUIET_GATE=off';
|
|
94
|
+
if (env.CI) return 'CI';
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export const loadThreshold = (cores) => Math.max(1, cores * LOAD_FACTOR);
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Wait until the 1-minute load is low enough for a browser run.
|
|
102
|
+
* @returns {Promise<{ waitedMs: number, gaveUp: boolean, load: number, threshold: number }>}
|
|
103
|
+
*/
|
|
104
|
+
export async function waitForLowLoad({
|
|
105
|
+
label = 'browser run',
|
|
106
|
+
loadavg = () => os.loadavg()[0],
|
|
107
|
+
cores = os.cpus().length,
|
|
108
|
+
now = Date.now,
|
|
109
|
+
sleep = realSleep,
|
|
110
|
+
log = console.log,
|
|
111
|
+
settleMs = SETTLE_MS,
|
|
112
|
+
pollMs = LOAD_POLL_MS,
|
|
113
|
+
maxWaitMs = LOAD_MAX_WAIT_MS,
|
|
114
|
+
} = {}) {
|
|
115
|
+
const threshold = loadThreshold(cores);
|
|
116
|
+
const start = now();
|
|
117
|
+
let calmSince = null;
|
|
118
|
+
let reported = -Infinity;
|
|
119
|
+
let wasOver = false;
|
|
120
|
+
for (;;) {
|
|
121
|
+
const load = loadavg();
|
|
122
|
+
const waitedMs = now() - start;
|
|
123
|
+
if (load <= threshold) {
|
|
124
|
+
if (!wasOver) return { waitedMs, gaveUp: false, load, threshold };
|
|
125
|
+
calmSince ??= now();
|
|
126
|
+
if (now() - calmSince >= settleMs) {
|
|
127
|
+
log(
|
|
128
|
+
`${TAG} ${label}: load ${load.toFixed(1)} ≤ ${threshold} for ${Math.round(settleMs / 1000)}s, starting after ${minutes(waitedMs)}`
|
|
129
|
+
);
|
|
130
|
+
return { waitedMs, gaveUp: false, load, threshold };
|
|
131
|
+
}
|
|
132
|
+
} else {
|
|
133
|
+
wasOver = true;
|
|
134
|
+
calmSince = null;
|
|
135
|
+
}
|
|
136
|
+
if (waitedMs >= maxWaitMs) {
|
|
137
|
+
log(
|
|
138
|
+
`${TAG} GAVE UP: ${label} starts on a LOADED machine (1-min load ${load.toFixed(1)} > ${threshold} = ${LOAD_FACTOR} × ${cores} cores after ${minutes(waitedMs)}). Expect timing failures; rerun when it is quiet.`
|
|
139
|
+
);
|
|
140
|
+
return { waitedMs, gaveUp: true, load, threshold };
|
|
141
|
+
}
|
|
142
|
+
if (load > threshold && now() - reported >= REPORT_EVERY_MS) {
|
|
143
|
+
reported = now();
|
|
144
|
+
log(
|
|
145
|
+
`${TAG} ${label}: 1-min load ${load.toFixed(1)} > ${threshold} (${LOAD_FACTOR} × ${cores} cores), waiting (${minutes(waitedMs)} so far, runs anyway at ${minutes(maxWaitMs)}; BB_QUIET_GATE=off skips)`
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
await sleep(pollMs);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const readText = (file) => {
|
|
153
|
+
try {
|
|
154
|
+
return readFileSync(file, 'utf8');
|
|
155
|
+
} catch {
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
export const claimFile = (dir) => path.join(dir, 'claim');
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* The current claim: its fields, `text` (to clear it only if unchanged) and
|
|
164
|
+
* `alive`; null when there is none.
|
|
165
|
+
*/
|
|
166
|
+
export function readClaim(dir, { isAlive = pidAlive, now = Date.now } = {}) {
|
|
167
|
+
const file = claimFile(dir);
|
|
168
|
+
let stat;
|
|
169
|
+
try {
|
|
170
|
+
stat = statSync(file);
|
|
171
|
+
} catch {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
const text = readText(file);
|
|
175
|
+
if (text === null) return null;
|
|
176
|
+
let claim = null;
|
|
177
|
+
try {
|
|
178
|
+
claim = JSON.parse(text);
|
|
179
|
+
} catch {
|
|
180
|
+
claim = null;
|
|
181
|
+
}
|
|
182
|
+
if (!claim || !Number.isInteger(claim.pid))
|
|
183
|
+
return { text, alive: now() - stat.mtimeMs < CLAIM_BIRTH_MS };
|
|
184
|
+
return { ...claim, text, alive: isAlive(claim.pid) };
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/** Delete the claim only if it still holds exactly `text` (a dead holder's). */
|
|
188
|
+
function clearIfUnchanged(dir, text) {
|
|
189
|
+
if (readText(claimFile(dir)) === text)
|
|
190
|
+
rmSync(claimFile(dir), { force: true });
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/** "release:local (pid 123, /repo, for 4 min)" */
|
|
194
|
+
export const holderText = (claim, now = Date.now()) =>
|
|
195
|
+
claim.pid === undefined
|
|
196
|
+
? 'a heavy run that is starting'
|
|
197
|
+
: `${claim.lane ?? 'a heavy run'} (pid ${claim.pid}${claim.cwd ? `, ${claim.cwd}` : ''}, for ${minutes(now - (claim.started ?? now))})`;
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Wait while a live claim that is not ours exists.
|
|
201
|
+
* @returns {Promise<{ waitedMs: number, gaveUp: boolean, holder: object | null }>}
|
|
202
|
+
*/
|
|
203
|
+
export async function waitForQuietWindow({
|
|
204
|
+
label = 'browser run',
|
|
205
|
+
dir,
|
|
206
|
+
env = process.env,
|
|
207
|
+
isAlive = pidAlive,
|
|
208
|
+
now = Date.now,
|
|
209
|
+
sleep = realSleep,
|
|
210
|
+
log = console.log,
|
|
211
|
+
pollMs = CLAIM_POLL_MS,
|
|
212
|
+
maxWaitMs = QUIET_MAX_WAIT_MS,
|
|
213
|
+
} = {}) {
|
|
214
|
+
const start = now();
|
|
215
|
+
let reported = -Infinity;
|
|
216
|
+
let holder = null;
|
|
217
|
+
for (;;) {
|
|
218
|
+
const claim = readClaim(dir, { isAlive, now });
|
|
219
|
+
const waitedMs = now() - start;
|
|
220
|
+
if (claim && !claim.alive) {
|
|
221
|
+
clearIfUnchanged(dir, claim.text);
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
if (!claim || (claim.token && claim.token === env[TOKEN_ENV])) {
|
|
225
|
+
if (holder)
|
|
226
|
+
log(
|
|
227
|
+
`${TAG} ${label}: the quiet window is free, starting after ${minutes(waitedMs)}`
|
|
228
|
+
);
|
|
229
|
+
return { waitedMs, gaveUp: false, holder };
|
|
230
|
+
}
|
|
231
|
+
holder = claim;
|
|
232
|
+
if (waitedMs >= maxWaitMs) {
|
|
233
|
+
log(
|
|
234
|
+
`${TAG} GAVE UP: ${label} starts INSIDE ${holderText(claim, now())}'s quiet window after ${minutes(waitedMs)}. Both runs may go red on timings.`
|
|
235
|
+
);
|
|
236
|
+
return { waitedMs, gaveUp: true, holder };
|
|
237
|
+
}
|
|
238
|
+
if (now() - reported >= REPORT_EVERY_MS) {
|
|
239
|
+
reported = now();
|
|
240
|
+
log(
|
|
241
|
+
`${TAG} ${label}: waiting, ${holderText(claim, now())} holds the quiet window (${minutes(waitedMs)} so far, runs anyway at ${minutes(maxWaitMs)})`
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
await sleep(pollMs);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Take the quiet window for a heavy run, waiting for another holder first.
|
|
250
|
+
* Inside a run that already holds it (our token), a no-op handle. Sets
|
|
251
|
+
* BB_QUIET_TOKEN in `env` so child processes inherit it; release() (also on
|
|
252
|
+
* exit) deletes the claim only while it is still ours.
|
|
253
|
+
* @returns {Promise<{ token: string | null, nested: boolean, gaveUp: boolean, release: () => void }>}
|
|
254
|
+
*/
|
|
255
|
+
export async function claimQuiet({
|
|
256
|
+
lane,
|
|
257
|
+
dir,
|
|
258
|
+
env = process.env,
|
|
259
|
+
pid = process.pid,
|
|
260
|
+
cwd = process.cwd(),
|
|
261
|
+
isAlive = pidAlive,
|
|
262
|
+
now = Date.now,
|
|
263
|
+
sleep = realSleep,
|
|
264
|
+
log = console.log,
|
|
265
|
+
wait = !gateDisabled(env),
|
|
266
|
+
pollMs = CLAIM_POLL_MS,
|
|
267
|
+
maxWaitMs = QUIET_MAX_WAIT_MS,
|
|
268
|
+
onExit = (release) => process.on('exit', release),
|
|
269
|
+
} = {}) {
|
|
270
|
+
const mine = env[TOKEN_ENV];
|
|
271
|
+
const current = readClaim(dir, { isAlive, now });
|
|
272
|
+
if (mine && current?.alive && current.token === mine)
|
|
273
|
+
return { token: mine, nested: true, gaveUp: false, release: () => {} };
|
|
274
|
+
mkdirSync(dir, { recursive: true });
|
|
275
|
+
const token = randomBytes(8).toString('hex');
|
|
276
|
+
const text = `${JSON.stringify({ pid, lane, started: now(), cwd, token })}\n`;
|
|
277
|
+
const start = now();
|
|
278
|
+
let reported = -Infinity;
|
|
279
|
+
for (;;) {
|
|
280
|
+
try {
|
|
281
|
+
writeFileSync(claimFile(dir), text, { flag: 'wx' });
|
|
282
|
+
env[TOKEN_ENV] = token;
|
|
283
|
+
const release = () => {
|
|
284
|
+
if (readText(claimFile(dir)) === text)
|
|
285
|
+
rmSync(claimFile(dir), { force: true });
|
|
286
|
+
};
|
|
287
|
+
onExit(release);
|
|
288
|
+
log(`${TAG} ${lane} holds the quiet window: other browser runs wait`);
|
|
289
|
+
return { token, nested: false, gaveUp: false, release };
|
|
290
|
+
} catch (e) {
|
|
291
|
+
if (e.code !== 'EEXIST') throw e;
|
|
292
|
+
}
|
|
293
|
+
const holder = readClaim(dir, { isAlive, now });
|
|
294
|
+
if (holder && !holder.alive) {
|
|
295
|
+
clearIfUnchanged(dir, holder.text);
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
if (!holder) continue;
|
|
299
|
+
const waitedMs = now() - start;
|
|
300
|
+
if (!wait || waitedMs >= maxWaitMs) {
|
|
301
|
+
log(
|
|
302
|
+
`${TAG} ${wait ? 'GAVE UP: ' : ''}${lane} runs WITHOUT the quiet window: ${holderText(holder, now())} holds it${wait ? ` after ${minutes(waitedMs)}` : ` (${gateDisabled(env)})`}.`
|
|
303
|
+
);
|
|
304
|
+
return { token: null, nested: false, gaveUp: wait, release: () => {} };
|
|
305
|
+
}
|
|
306
|
+
if (now() - reported >= REPORT_EVERY_MS) {
|
|
307
|
+
reported = now();
|
|
308
|
+
log(
|
|
309
|
+
`${TAG} ${lane}: waiting for the quiet window, ${holderText(holder, now())} holds it`
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
await sleep(pollMs);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* Where the claim lives: the repo's common git dir, shared by every worktree
|
|
318
|
+
* (the gate worktrees under ~/.bb-gate too). Null outside a git checkout.
|
|
319
|
+
*/
|
|
320
|
+
export async function quietDir(env = process.env) {
|
|
321
|
+
// Tests point it elsewhere.
|
|
322
|
+
if (env.BB_QUIET_DIR) return env.BB_QUIET_DIR;
|
|
323
|
+
const { commonDir } = await import('./gate.mjs');
|
|
324
|
+
try {
|
|
325
|
+
return path.join(commonDir(), 'bb-quiet');
|
|
326
|
+
} catch {
|
|
327
|
+
return null;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/** Which lane a run belongs to, for the "who holds it" line. */
|
|
332
|
+
export const laneName = (env = process.env, cwd = process.cwd()) =>
|
|
333
|
+
env.BB_LANE || path.basename(cwd);
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Before an ordinary browser run (a lane's vitest browser project, the
|
|
337
|
+
* fixtures runner): wait for someone else's quiet window, then for low load.
|
|
338
|
+
* Inside a heavy run's tree (BB_QUIET_TOKEN set and live): nothing to do.
|
|
339
|
+
*/
|
|
340
|
+
export async function browserGate({ label, env = process.env, ...deps } = {}) {
|
|
341
|
+
const off = gateDisabled(env);
|
|
342
|
+
if (off) return { skipped: off };
|
|
343
|
+
const dir = deps.dir ?? (await quietDir(env));
|
|
344
|
+
if (!dir) return { skipped: 'not in a git checkout' };
|
|
345
|
+
const claim = readClaim(dir, deps);
|
|
346
|
+
if (env[TOKEN_ENV] && claim?.alive && claim.token === env[TOKEN_ENV])
|
|
347
|
+
return { inside: true };
|
|
348
|
+
const quiet = await waitForQuietWindow({ label, dir, env, ...deps });
|
|
349
|
+
const load = await waitForLowLoad({ label, ...deps });
|
|
350
|
+
return { quiet, load };
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/**
|
|
354
|
+
* Before a heavy run: take the quiet window, then wait for low load (which
|
|
355
|
+
* the other tabs' runs, now waiting, let drop). Nested inside a run that
|
|
356
|
+
* holds it: nothing to do.
|
|
357
|
+
*/
|
|
358
|
+
export async function heavyGate({
|
|
359
|
+
lane,
|
|
360
|
+
label = lane,
|
|
361
|
+
env = process.env,
|
|
362
|
+
...deps
|
|
363
|
+
} = {}) {
|
|
364
|
+
// CI runs one job per machine: nothing to coordinate, nothing to claim.
|
|
365
|
+
if (env.CI) return { skipped: 'CI' };
|
|
366
|
+
const dir = deps.dir ?? (await quietDir(env));
|
|
367
|
+
if (!dir) return { skipped: 'not in a git checkout' };
|
|
368
|
+
const claim = await claimQuiet({ lane, dir, env, ...deps });
|
|
369
|
+
if (claim.nested) return { claim, nested: true };
|
|
370
|
+
const off = gateDisabled(env);
|
|
371
|
+
const load = off
|
|
372
|
+
? { skipped: off }
|
|
373
|
+
: await waitForLowLoad({ label, ...deps });
|
|
374
|
+
return { claim, load };
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/** One results line for a load-guard outcome, or null when it had nothing to say. */
|
|
378
|
+
export function guardSummary(name, load) {
|
|
379
|
+
if (!load || load.skipped || load.inside) return null;
|
|
380
|
+
if (load.gaveUp)
|
|
381
|
+
return `WARN ${name}: started on a loaded machine (1-min load ${load.load.toFixed(1)} > ${load.threshold}) after ${minutes(load.waitedMs)}`;
|
|
382
|
+
if (load.waitedMs >= 60_000)
|
|
383
|
+
return `note ${name}: waited ${minutes(load.waitedMs)} for the load to drop`;
|
|
384
|
+
return null;
|
|
385
|
+
}
|
|
@@ -12,9 +12,11 @@
|
|
|
12
12
|
* expression (`ctx.draft`, `draft.name`) writes a property.
|
|
13
13
|
*
|
|
14
14
|
* Read from `compileScript(...).bindings`, never by compiling the template
|
|
15
|
-
* with `inlineTemplate` and looking for the assignment
|
|
16
|
-
*
|
|
17
|
-
*
|
|
15
|
+
* with `inlineTemplate` and looking for the assignment. Vue 3.5.26+ demotes a
|
|
16
|
+
* v-model'd reactive `const` to `let` (with a warning, so its build passes)
|
|
17
|
+
* and reports it `setup-let`: that binding still counts when the AST shows the
|
|
18
|
+
* `const`, so the finding does not hang on the Vue `check` resolves, and
|
|
19
|
+
* matches the ESLint twin on a consumer still on ≤ 3.5.25. When compileScript cannot run on a file
|
|
18
20
|
* (a type it would have to resolve from disk), the same classification is
|
|
19
21
|
* made from the script AST: a `const` whose initializer is a call of the
|
|
20
22
|
* `reactive` imported from `vue` — Vue's own rule.
|
|
@@ -34,7 +36,7 @@ const PROP_DIRECTIVE = 7;
|
|
|
34
36
|
const IDENTIFIER = /^[A-Za-z_$][\w$]*$/;
|
|
35
37
|
|
|
36
38
|
export const REACTIVE_V_MODEL_MESSAGE = (name) =>
|
|
37
|
-
`\`${name}\` is a const reactive(); a production build
|
|
39
|
+
`\`${name}\` is a const reactive(); v-model reassigns it (a production build on Vue ≤ 3.5.25 fails, later Vue turns it into a \`let\`) — use ref() and \`.value\` in script`;
|
|
38
40
|
|
|
39
41
|
/** Strip TS wrappers and parentheses Vue's own classification looks through. */
|
|
40
42
|
export function unwrapExpression(node) {
|
|
@@ -172,7 +174,11 @@ function reactiveBindings(descriptor) {
|
|
|
172
174
|
const confirmed = fromAst();
|
|
173
175
|
const names = new Set();
|
|
174
176
|
for (const [name, type] of Object.entries(bindings ?? {}))
|
|
175
|
-
if (
|
|
177
|
+
if (
|
|
178
|
+
(type === 'setup-reactive-const' || type === 'setup-let') &&
|
|
179
|
+
confirmed.has(name)
|
|
180
|
+
)
|
|
181
|
+
names.add(name);
|
|
176
182
|
return names;
|
|
177
183
|
}
|
|
178
184
|
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `tab-link-navigation` / `tab-link-missing` (Q6.1 link mode, owner
|
|
3
|
+
* 2026-10-29): a BbTabs / BbTabsRoot whose items carry `href` or `to` is a
|
|
4
|
+
* `<nav>` of links, each going to its own page. Two spellings read as
|
|
5
|
+
* something else and are caught here, statically, never by a console warning:
|
|
6
|
+
*
|
|
7
|
+
* - `navigation` on a link strip: it syncs a query parameter, and links have
|
|
8
|
+
* none to sync, so it does nothing. Drop it (an `href` used only as the
|
|
9
|
+
* query base of a `navigation` strip is gone: drop the `href` instead, query
|
|
10
|
+
* mode keeps the current URL).
|
|
11
|
+
* - an item with neither `href` nor `to` beside items that have one: it
|
|
12
|
+
* renders as a disabled link. Give it its page.
|
|
13
|
+
*
|
|
14
|
+
* Reach: the literal `items` array the file spells, inline or a `<script
|
|
15
|
+
* setup>` const bound by name (`scriptSetupArrayConsts`). An item that
|
|
16
|
+
* spreads another object is not judged (its fields are out of sight).
|
|
17
|
+
*/
|
|
18
|
+
import { babelParse, parse } from 'vue/compiler-sfc';
|
|
19
|
+
import { libraryAliases, localBbImports } from './local-components.mjs';
|
|
20
|
+
|
|
21
|
+
const NODE_ELEMENT = 1;
|
|
22
|
+
const NODE_ATTRIBUTE = 6;
|
|
23
|
+
const PROP_DIRECTIVE = 7;
|
|
24
|
+
|
|
25
|
+
const TABS = new Set(['BbTabs', 'BbTabsRoot']);
|
|
26
|
+
|
|
27
|
+
export const TAB_LINK_MESSAGES = {
|
|
28
|
+
navigation: (component) =>
|
|
29
|
+
`\`navigation\` does nothing on a ${component} whose items have \`href\` / \`to\`: those items are links to their own pages, with no query parameter to sync. Drop \`navigation\` (or, if the \`href\` was only the query base, drop the \`href\`: query mode keeps the current URL).`,
|
|
30
|
+
missing: (component, value) =>
|
|
31
|
+
`${value ? `The \`${value}\` item` : 'This item'} of a ${component} whose other items have \`href\` / \`to\` has neither: in link mode it renders as a disabled link. Give it its \`href\` (Inertia) or \`to\` (Vue Router / Nuxt).`,
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export const TAB_LINK_HINT =
|
|
35
|
+
'link mode: every item an `href` / `to`, the current one by `:model-value`, no `navigation`';
|
|
36
|
+
|
|
37
|
+
const pascal = (tag) =>
|
|
38
|
+
tag.includes('-')
|
|
39
|
+
? tag.replace(/(?:^|-)([a-z0-9])/g, (_, c) => c.toUpperCase())
|
|
40
|
+
: tag;
|
|
41
|
+
|
|
42
|
+
const unwrap = (node) => {
|
|
43
|
+
let current = node;
|
|
44
|
+
while (
|
|
45
|
+
current &&
|
|
46
|
+
[
|
|
47
|
+
'TSAsExpression',
|
|
48
|
+
'TSSatisfiesExpression',
|
|
49
|
+
'TSNonNullExpression',
|
|
50
|
+
'TSTypeAssertion',
|
|
51
|
+
'ParenthesizedExpression',
|
|
52
|
+
].includes(current.type)
|
|
53
|
+
)
|
|
54
|
+
current = current.expression;
|
|
55
|
+
return current;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const keyName = (property) =>
|
|
59
|
+
property.type === 'ObjectProperty' && !property.computed
|
|
60
|
+
? property.key.type === 'Identifier'
|
|
61
|
+
? property.key.name
|
|
62
|
+
: property.key.type === 'StringLiteral'
|
|
63
|
+
? property.key.value
|
|
64
|
+
: undefined
|
|
65
|
+
: undefined;
|
|
66
|
+
|
|
67
|
+
const has = (object, key) => object.properties.some((p) => keyName(p) === key);
|
|
68
|
+
|
|
69
|
+
const stringValue = (object, key) => {
|
|
70
|
+
const property = object.properties.find((p) => keyName(p) === key);
|
|
71
|
+
const value = unwrap(property?.value);
|
|
72
|
+
return value?.type === 'StringLiteral' ? value.value : undefined;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const arrayOf = (node, arrays) => {
|
|
76
|
+
const value = unwrap(node);
|
|
77
|
+
if (value?.type === 'ArrayExpression') return value;
|
|
78
|
+
if (value?.type === 'Identifier') return arrays?.get(value.name) ?? null;
|
|
79
|
+
return null;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
const parseExpression = (content) => {
|
|
83
|
+
try {
|
|
84
|
+
return (
|
|
85
|
+
babelParse(`(${content})`, {
|
|
86
|
+
sourceType: 'module',
|
|
87
|
+
plugins: ['typescript'],
|
|
88
|
+
}).program.body[0]?.expression ?? null
|
|
89
|
+
);
|
|
90
|
+
} catch {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
/** `navigation`, `:navigation="true"`; never `:navigation="false"`. */
|
|
96
|
+
const navigationProp = (node) =>
|
|
97
|
+
(node.props ?? []).find((prop) => {
|
|
98
|
+
if (prop.type === NODE_ATTRIBUTE) return prop.name === 'navigation';
|
|
99
|
+
if (prop.type !== PROP_DIRECTIVE || prop.name !== 'bind') return false;
|
|
100
|
+
if (!prop.arg?.isStatic || prop.arg.content !== 'navigation') return false;
|
|
101
|
+
return prop.exp?.content.trim() !== 'false';
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* @param {string} code a whole SFC (ranges are offsets into it) or a snippet
|
|
106
|
+
* @param {{ templateAst?: any, arrays?: Map<string, any>, library?: Parameters<typeof localBbImports>[1] }} [options]
|
|
107
|
+
* @returns {Array<{ component: string, attr: string, kind: 'tab-link-navigation' | 'tab-link-missing', line: number, message: string, hint: string, range?: [number, number] }>}
|
|
108
|
+
*/
|
|
109
|
+
export function tabLinkFindings(code, options = {}) {
|
|
110
|
+
if (!/\b(href|to)\b/.test(code)) return [];
|
|
111
|
+
let descriptor = null;
|
|
112
|
+
try {
|
|
113
|
+
({ descriptor } = parse(code, { sourceMap: false }));
|
|
114
|
+
} catch {
|
|
115
|
+
descriptor = null;
|
|
116
|
+
}
|
|
117
|
+
const ast = options.templateAst ?? descriptor?.template?.ast;
|
|
118
|
+
if (!ast) return [];
|
|
119
|
+
const ranged =
|
|
120
|
+
!options.templateAst || options.templateAst === descriptor?.template?.ast;
|
|
121
|
+
const arrays = options.arrays;
|
|
122
|
+
const scriptArrays = new Set(arrays ? [...arrays.values()] : []);
|
|
123
|
+
const scriptOffset = descriptor?.scriptSetup?.loc.start.offset ?? 0;
|
|
124
|
+
const scriptLine = descriptor?.scriptSetup?.loc.start.line ?? 1;
|
|
125
|
+
const aliases = libraryAliases(code);
|
|
126
|
+
const own = localBbImports(code, options.library);
|
|
127
|
+
const findings = [];
|
|
128
|
+
|
|
129
|
+
const check = (node, component, itemsProp) => {
|
|
130
|
+
const array = arrayOf(
|
|
131
|
+
parseExpression(itemsProp.exp?.content ?? ''),
|
|
132
|
+
arrays
|
|
133
|
+
);
|
|
134
|
+
if (!array) return;
|
|
135
|
+
const entries = array.elements
|
|
136
|
+
.map(unwrap)
|
|
137
|
+
.filter((entry) => entry?.type === 'ObjectExpression');
|
|
138
|
+
const isLink = (entry) => has(entry, 'href') || has(entry, 'to');
|
|
139
|
+
if (!entries.some(isLink)) return;
|
|
140
|
+
const inScript = scriptArrays.has(array);
|
|
141
|
+
// `(` was prepended to the template expression before parsing.
|
|
142
|
+
const base = inScript
|
|
143
|
+
? {
|
|
144
|
+
offset: ranged && descriptor?.scriptSetup ? scriptOffset : null,
|
|
145
|
+
line: scriptLine,
|
|
146
|
+
}
|
|
147
|
+
: {
|
|
148
|
+
offset: ranged ? itemsProp.exp.loc.start.offset - 1 : null,
|
|
149
|
+
line: itemsProp.exp.loc.start.line,
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
const navigation = navigationProp(node);
|
|
153
|
+
if (navigation)
|
|
154
|
+
findings.push({
|
|
155
|
+
component,
|
|
156
|
+
attr: 'navigation',
|
|
157
|
+
kind: 'tab-link-navigation',
|
|
158
|
+
line: navigation.loc.start.line,
|
|
159
|
+
message: TAB_LINK_MESSAGES.navigation(component),
|
|
160
|
+
hint: TAB_LINK_HINT,
|
|
161
|
+
...(ranged
|
|
162
|
+
? {
|
|
163
|
+
range: [navigation.loc.start.offset, navigation.loc.end.offset],
|
|
164
|
+
}
|
|
165
|
+
: {}),
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
for (const entry of entries) {
|
|
169
|
+
if (isLink(entry)) continue;
|
|
170
|
+
if (entry.properties.some((p) => p.type === 'SpreadElement')) continue;
|
|
171
|
+
findings.push({
|
|
172
|
+
component,
|
|
173
|
+
attr: ':items',
|
|
174
|
+
kind: 'tab-link-missing',
|
|
175
|
+
line: base.line + entry.loc.start.line - 1,
|
|
176
|
+
message: TAB_LINK_MESSAGES.missing(
|
|
177
|
+
component,
|
|
178
|
+
stringValue(entry, 'value')
|
|
179
|
+
),
|
|
180
|
+
hint: TAB_LINK_HINT,
|
|
181
|
+
...(base.offset !== null
|
|
182
|
+
? { range: [base.offset + entry.start, base.offset + entry.end] }
|
|
183
|
+
: {}),
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
const walk = (node) => {
|
|
189
|
+
if (!node || typeof node !== 'object') return;
|
|
190
|
+
if (node.type === NODE_ELEMENT && !own.has(node.tag)) {
|
|
191
|
+
const written = pascal(node.tag);
|
|
192
|
+
const component =
|
|
193
|
+
aliases.get(node.tag) ?? aliases.get(written) ?? written;
|
|
194
|
+
if (TABS.has(component)) {
|
|
195
|
+
const items = (node.props ?? []).find(
|
|
196
|
+
(prop) =>
|
|
197
|
+
prop.type === PROP_DIRECTIVE &&
|
|
198
|
+
prop.name === 'bind' &&
|
|
199
|
+
prop.arg?.isStatic &&
|
|
200
|
+
prop.arg.content === 'items'
|
|
201
|
+
);
|
|
202
|
+
if (items) check(node, component, items);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
for (const child of node.children ?? []) walk(child);
|
|
206
|
+
};
|
|
207
|
+
walk(ast);
|
|
208
|
+
return findings;
|
|
209
|
+
}
|