bitboss-ui 3.0.0-beta.3 → 3.0.0-beta.30
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 +190 -35
- package/bin/bitboss-ui-mcp.mjs +472 -16
- package/bin/bitboss-ui.mjs +300 -23
- package/dist/ai/BbAccordion.md +150 -32
- package/dist/ai/BbAlert.md +124 -21
- package/dist/ai/BbAsterisk.md +53 -1
- package/dist/ai/BbAvatar.md +179 -27
- package/dist/ai/BbBadge.md +221 -35
- package/dist/ai/BbBadgeButton.md +68 -16
- package/dist/ai/BbBaseButton.md +123 -46
- package/dist/ai/BbBaseCheckboxIcon.md +114 -26
- package/dist/ai/BbBaseRadioIcon.md +111 -26
- package/dist/ai/BbBaseSwitchIcon.md +119 -28
- package/dist/ai/BbBreadcrumbs.md +192 -43
- package/dist/ai/BbButton.md +323 -76
- package/dist/ai/BbCalendar.md +548 -0
- package/dist/ai/BbCheckbox.md +216 -56
- package/dist/ai/BbCheckboxGroup.md +267 -30
- package/dist/ai/BbCollapsible.md +154 -39
- package/dist/ai/BbColorInput.md +280 -44
- package/dist/ai/BbColorPalette.md +227 -45
- package/dist/ai/BbConfirm.md +201 -41
- package/dist/ai/BbDatePicker.md +214 -25
- package/dist/ai/BbDatePickerInput.md +289 -54
- package/dist/ai/BbDialog.md +464 -73
- package/dist/ai/BbDropdown.md +699 -54
- package/dist/ai/BbDropdownButton.md +172 -43
- package/dist/ai/BbDropdownGroup.md +9 -1
- package/dist/ai/BbDropzone.md +122 -16
- package/dist/ai/BbForm.md +49 -14
- package/dist/ai/BbIcon.md +92 -31
- package/dist/ai/BbIndicator.md +73 -10
- package/dist/ai/BbNumberInput.md +211 -45
- package/dist/ai/BbOffCanvas.md +357 -66
- package/dist/ai/BbPagination.md +165 -26
- package/dist/ai/BbPopover.md +201 -34
- package/dist/ai/BbProgress.md +96 -55
- package/dist/ai/BbPtScope.md +136 -0
- package/dist/ai/BbRadio.md +205 -26
- package/dist/ai/BbRadioGroup.md +346 -39
- package/dist/ai/BbRating.md +130 -25
- package/dist/ai/BbSelect.md +583 -77
- package/dist/ai/BbSelectPopover.md +359 -82
- package/dist/ai/BbSlider.md +226 -51
- package/dist/ai/BbSmoothHeight.md +136 -32
- package/dist/ai/BbSpinner.md +166 -74
- package/dist/ai/BbSwitch.md +219 -31
- package/dist/ai/BbSwitchGroup.md +267 -29
- package/dist/ai/BbTable.md +1310 -162
- package/dist/ai/BbTabs.md +568 -101
- package/dist/ai/BbTabsList.md +56 -2
- package/dist/ai/BbTabsPanes.md +33 -1
- package/dist/ai/BbTabsRoot.md +61 -10
- package/dist/ai/BbTag.md +220 -42
- package/dist/ai/BbTextInput.md +429 -55
- package/dist/ai/BbTextarea.md +263 -51
- package/dist/ai/BbTimePicker.md +125 -11
- package/dist/ai/BbTimePickerInput.md +236 -22
- package/dist/ai/BbToast.md +183 -38
- package/dist/ai/BbToastPortal.md +28 -1
- package/dist/ai/BbTooltip.md +170 -30
- package/dist/ai/BbTree.md +225 -73
- package/dist/ai/ChipsBox.md +41 -1
- package/dist/ai/ClearableButton.md +12 -0
- package/dist/ai/CommaBox.md +1 -0
- package/dist/ai/{BbBaseInputContainer.md → CommonField.md} +19 -17
- package/dist/ai/CommonFieldInput.md +90 -0
- package/dist/ai/CommonPopover.md +12 -7
- package/dist/ai/CommonTimeSelector.md +61 -0
- package/dist/ai/ErrorIcon.md +20 -0
- package/dist/ai/FlatListBox.md +33 -5
- package/dist/ai/GroupedListBox.md +33 -5
- package/dist/ai/ListBox.md +37 -4
- package/dist/ai/OptionsContainer.md +6 -5
- package/dist/ai/WarningIcon.md +20 -0
- package/dist/ai/changelog.json +1183 -44
- package/dist/ai/components.json +41195 -9996
- package/dist/ai/composables/useBbConfig.md +72 -11
- package/dist/ai/composables/useConfirm.md +10 -5
- package/dist/ai/composables/useToast.md +4 -2
- package/dist/ai/guides/agent-contract.md +95 -10
- package/dist/ai/guides/ai-router.md +54 -26
- package/dist/ai/guides/app-layout.md +3 -1
- package/dist/ai/guides/component-picker.md +24 -18
- package/dist/ai/guides/design-language.md +217 -61
- package/dist/ai/guides/design-tokens.md +448 -105
- package/dist/ai/guides/fetch-items-playbook.md +1 -1
- package/dist/ai/guides/icons-policy.md +50 -19
- package/dist/ai/guides/inline-edit-playbook.md +1 -1
- package/dist/ai/guides/installation-and-plugin-setup.md +618 -42
- package/dist/ai/guides/migration/components/bb-accordion.md +29 -0
- package/dist/ai/guides/migration/components/bb-alert.md +2 -2
- package/dist/ai/guides/migration/components/bb-avatar.md +13 -14
- package/dist/ai/guides/migration/components/bb-breadcrumbs.md +8 -7
- package/dist/ai/guides/migration/components/bb-button.md +80 -20
- package/dist/ai/guides/migration/components/bb-checkbox-group.md +61 -28
- package/dist/ai/guides/migration/components/bb-checkbox.md +45 -10
- package/dist/ai/guides/migration/components/bb-collapsible.md +5 -5
- package/dist/ai/guides/migration/components/bb-color-palette.md +9 -9
- package/dist/ai/guides/migration/components/bb-date-picker-input.md +39 -29
- package/dist/ai/guides/migration/components/bb-dialog.md +68 -35
- package/dist/ai/guides/migration/components/bb-dropdown.md +29 -8
- package/dist/ai/guides/migration/components/bb-offcanvas.md +29 -13
- package/dist/ai/guides/migration/components/bb-popover.md +12 -11
- package/dist/ai/guides/migration/components/bb-rating.md +52 -17
- package/dist/ai/guides/migration/components/bb-select-popover.md +8 -0
- package/dist/ai/guides/migration/components/bb-select.md +18 -2
- package/dist/ai/guides/migration/components/bb-table.md +560 -28
- package/dist/ai/guides/migration/components/bb-tabs.md +56 -14
- package/dist/ai/guides/migration/components/bb-text-input.md +12 -12
- package/dist/ai/guides/migration/components/bb-tooltip.md +18 -0
- package/dist/ai/guides/migration/v2-to-v3.md +526 -192
- package/dist/ai/guides/options-items-playbook.md +57 -1
- package/dist/ai/guides/passthrough.md +725 -0
- package/dist/ai/guides/ssr-prefill.md +120 -0
- package/dist/ai/guides/validated-forms.md +5 -0
- package/dist/ai/index.md +24 -36
- package/dist/ai/recipes/inertia/approvals-inbox.md +3 -4
- package/dist/ai/recipes/inertia/inline-edit-workspace.md +10 -11
- package/dist/ai/recipes/inertia/layout-scaffold.md +5 -1
- package/dist/ai/recipes/inertia/onboarding.md +2 -2
- package/dist/ai/recipes/inertia/ownership-atlas.md +66 -44
- package/dist/ai/recipes/inertia/record-form.md +5 -6
- package/dist/ai/recipes/inertia/records-workspace.md +133 -12
- package/dist/ai/recipes/inertia/upload-center.md +8 -9
- package/dist/ai/recipes/inertia/wizard-form.md +68 -5
- package/dist/ai/recipes/nuxt/approvals-inbox.md +3 -4
- package/dist/ai/recipes/nuxt/inline-edit-workspace.md +10 -11
- package/dist/ai/recipes/nuxt/layout-scaffold.md +5 -1
- package/dist/ai/recipes/nuxt/onboarding.md +2 -2
- package/dist/ai/recipes/nuxt/record-form.md +5 -6
- package/dist/ai/recipes/nuxt/records-workspace.md +135 -12
- package/dist/ai/recipes/nuxt/upload-center.md +8 -9
- package/dist/ai/recipes/nuxt/wizard-form.md +68 -5
- package/dist/ai/recipes/vue/approvals-inbox.md +3 -4
- package/dist/ai/recipes/vue/inline-edit-workspace.md +10 -11
- package/dist/ai/recipes/vue/layout-scaffold.md +5 -1
- package/dist/ai/recipes/vue/onboarding.md +2 -2
- package/dist/ai/recipes/vue/record-form.md +10 -10
- package/dist/ai/recipes/vue/records-workspace.md +129 -12
- package/dist/ai/recipes/vue/upload-center.md +8 -9
- package/dist/ai/recipes/vue/wizard-form.md +65 -5
- package/dist/ai/source/BbAccordion.md +83 -21
- package/dist/ai/source/BbAlert.md +188 -60
- package/dist/ai/source/BbAsterisk.md +54 -4
- package/dist/ai/source/BbAvatar.md +63 -16
- package/dist/ai/source/BbBadge.md +193 -59
- package/dist/ai/source/BbBadgeButton.md +108 -41
- package/dist/ai/source/BbBaseButton.md +103 -9
- package/dist/ai/source/BbBaseCheckboxIcon.md +151 -36
- package/dist/ai/source/BbBaseRadioIcon.md +121 -17
- package/dist/ai/source/BbBaseSwitchIcon.md +138 -28
- package/dist/ai/source/BbBreadcrumbs.md +241 -57
- package/dist/ai/source/BbButton.md +457 -165
- package/dist/ai/source/BbCalendar.md +1617 -0
- package/dist/ai/source/BbCheckbox.md +433 -59
- package/dist/ai/source/BbCheckboxGroup.md +722 -77
- package/dist/ai/source/BbCollapsible.md +90 -8
- package/dist/ai/source/BbColorInput.md +505 -58
- package/dist/ai/source/BbColorPalette.md +1160 -51
- package/dist/ai/source/BbConfirm.md +134 -4
- package/dist/ai/source/BbConfirmPortal.md +83 -0
- package/dist/ai/source/BbDatePicker.md +447 -367
- package/dist/ai/source/BbDatePickerInput.md +1970 -106
- package/dist/ai/source/BbDialog.md +435 -45
- package/dist/ai/source/BbDropdown.md +693 -130
- package/dist/ai/source/BbDropdownButton.md +279 -68
- package/dist/ai/source/BbDropdownGroup.md +535 -64
- package/dist/ai/source/BbDropzone.md +93 -14
- package/dist/ai/source/BbForm.md +93 -5
- package/dist/ai/source/BbIcon.md +114 -48
- package/dist/ai/source/BbIndicator.md +85 -42
- package/dist/ai/source/BbNumberInput.md +574 -73
- package/dist/ai/source/BbOffCanvas.md +789 -249
- package/dist/ai/source/BbPagination.md +124 -19
- package/dist/ai/source/BbPopover.md +226 -77
- package/dist/ai/source/BbProgress.md +53 -5
- package/dist/ai/source/BbPtScope.md +54 -0
- package/dist/ai/source/BbRadio.md +369 -52
- package/dist/ai/source/BbRadioGroup.md +707 -91
- package/dist/ai/source/BbRating.md +645 -73
- package/dist/ai/source/BbSelect.md +939 -76
- package/dist/ai/source/BbSelectPopover.md +611 -66
- package/dist/ai/source/BbSlider.md +1205 -81
- package/dist/ai/source/BbSmoothHeight.md +48 -2
- package/dist/ai/source/BbSpinner.md +62 -6
- package/dist/ai/source/BbSwitch.md +277 -55
- package/dist/ai/source/BbSwitchGroup.md +568 -77
- package/dist/ai/source/BbTable.md +5729 -1779
- package/dist/ai/source/BbTabs.md +176 -87
- package/dist/ai/source/BbTabsList.md +207 -88
- package/dist/ai/source/BbTabsPanes.md +179 -83
- package/dist/ai/source/BbTabsRoot.md +171 -82
- package/dist/ai/source/BbTag.md +670 -76
- package/dist/ai/source/BbTextInput.md +439 -59
- package/dist/ai/source/BbTextarea.md +483 -54
- package/dist/ai/source/BbTimePicker.md +302 -56
- package/dist/ai/source/BbTimePickerInput.md +1143 -91
- package/dist/ai/source/BbToast.md +121 -36
- package/dist/ai/source/BbToastPortal.md +77 -27
- package/dist/ai/source/BbTooltip.md +147 -22
- package/dist/ai/source/BbTree.md +55 -3
- package/dist/ai/source/ChipsBox.md +12 -2
- package/dist/ai/source/CommaBox.md +10 -2
- package/dist/ai/source/{BbBaseInputContainer.md → CommonField.md} +318 -210
- package/dist/ai/source/CommonFieldInput.md +799 -0
- package/dist/ai/source/CommonPopover.md +107 -22
- package/dist/ai/source/CommonTimeSelector.md +642 -0
- package/dist/ai/source/ErrorIcon.md +2 -2
- package/dist/ai/source/FlatListBox.md +172 -11
- package/dist/ai/source/GroupedListBox.md +198 -11
- package/dist/ai/source/GuidesComponent.md +14 -7
- package/dist/ai/source/ListBox.md +29 -2
- package/dist/ai/source/OptionsContainer.md +197 -26
- package/dist/ai/source/WarningIcon.md +2 -2
- package/dist/components/BbAccordion/BbAccordion.vue_vue_type_script_setup_true_lang.js +49 -32
- package/dist/components/BbAccordion/types.d.ts +32 -1
- package/dist/components/BbAccordion/types.js +11 -0
- package/dist/components/BbAlert/BbAlert.vue_vue_type_script_setup_true_lang.js +45 -29
- package/dist/components/BbAlert/types.d.ts +35 -1
- package/dist/components/BbAlert/types.js +13 -0
- package/dist/components/BbAsterisk/BbAsterisk.vue.d.ts +3 -1
- package/dist/components/BbAsterisk/BbAsterisk.vue_vue_type_script_setup_true_lang.js +23 -8
- package/dist/components/BbAsterisk/types.d.ts +18 -0
- package/dist/components/BbAsterisk/types.js +7 -0
- package/dist/components/BbAvatar/BbAvatar.vue.d.ts +1 -1
- package/dist/components/BbAvatar/BbAvatar.vue_vue_type_script_setup_true_lang.js +57 -44
- package/dist/components/BbAvatar/types.d.ts +23 -0
- package/dist/components/BbAvatar/types.js +7 -0
- package/dist/components/BbBadge/BadgeBodyContent.vue_vue_type_script_setup_true_lang.js +22 -16
- package/dist/components/BbBadge/BbBadge.vue_vue_type_script_setup_true_lang.js +95 -52
- package/dist/components/BbBadge/BbBadgeButton.vue_vue_type_script_setup_true_lang.js +3 -0
- package/dist/components/BbBadge/badgeButtonContext.d.ts +25 -8
- package/dist/components/BbBadge/types.d.ts +44 -3
- package/dist/components/BbBadge/types.js +13 -0
- package/dist/components/BbBaseButton/BbBaseButton.vue_vue_type_script_setup_true_lang.js +110 -97
- package/dist/components/BbBaseButton/RouterComponent.vue_vue_type_script_setup_true_lang.js +11 -11
- package/dist/components/BbBaseButton/types.d.ts +28 -0
- package/dist/components/BbBaseButton/types.js +9 -2
- package/dist/components/BbBaseCheckboxIcon/BbBaseCheckboxIcon.vue_vue_type_script_setup_true_lang.js +50 -18
- package/dist/components/BbBaseCheckboxIcon/types.d.ts +31 -2
- package/dist/components/BbBaseCheckboxIcon/types.js +8 -0
- package/dist/components/BbBaseRadioIcon/BbBaseRadioIcon.vue_vue_type_script_setup_true_lang.js +45 -15
- package/dist/components/BbBaseRadioIcon/types.d.ts +31 -2
- package/dist/components/BbBaseRadioIcon/types.js +8 -0
- package/dist/components/BbBaseSwitchIcon/BbBaseSwitchIcon.vue_vue_type_script_setup_true_lang.js +48 -16
- package/dist/components/BbBaseSwitchIcon/types.d.ts +31 -2
- package/dist/components/BbBaseSwitchIcon/types.js +8 -0
- package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue_vue_type_script_setup_true_lang.js +151 -110
- package/dist/components/BbBreadcrumbs/types.d.ts +35 -0
- package/dist/components/BbBreadcrumbs/types.js +12 -0
- package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +104 -77
- package/dist/components/BbButton/types.d.ts +49 -2
- package/dist/components/BbButton/types.js +12 -0
- package/dist/components/BbCalendar/BbCalendar.vue.d.ts +34 -0
- package/dist/components/BbCalendar/BbCalendar.vue.js +6 -0
- package/dist/components/BbCalendar/BbCalendar.vue_vue_type_script_setup_true_lang.js +576 -0
- package/dist/components/BbCalendar/CalendarMonthPanel.vue.js +5 -0
- package/dist/components/BbCalendar/CalendarMonthPanel.vue_vue_type_script_setup_true_lang.js +124 -0
- package/dist/components/BbCalendar/CalendarYearPanel.vue.js +5 -0
- package/dist/components/BbCalendar/CalendarYearPanel.vue_vue_type_script_setup_true_lang.js +126 -0
- package/dist/components/BbCalendar/calendarHost.d.ts +29 -0
- package/dist/components/BbCalendar/calendarHost.js +10 -0
- package/dist/components/BbCalendar/types.d.ts +211 -0
- package/dist/components/BbCalendar/types.js +28 -0
- package/dist/components/{BbBaseDatePicker/useDatePickerContext.d.ts → BbCalendar/useCalendarContext.d.ts} +10 -7
- package/dist/components/BbCalendar/useCalendarContext.js +11 -0
- package/dist/components/BbCalendar/useCalendarGrid.d.ts +208 -0
- package/dist/components/BbCalendar/useCalendarGrid.js +269 -0
- package/dist/components/BbCalendar/useDayGrid.d.ts +79 -0
- package/dist/components/BbCalendar/useDayGrid.js +203 -0
- package/dist/components/BbCheckbox/BbCheckbox.vue.d.ts +1 -1
- package/dist/components/BbCheckbox/BbCheckbox.vue_vue_type_script_setup_true_lang.js +194 -67
- package/dist/components/BbCheckbox/types.d.ts +164 -9
- package/dist/components/BbCheckbox/types.js +8 -0
- package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue.d.ts +3 -3
- package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +310 -80
- package/dist/components/BbCheckboxGroup/types.d.ts +152 -8
- package/dist/components/BbCheckboxGroup/types.js +10 -0
- package/dist/components/BbCollapsible/BbCollapsible.vue.d.ts +2 -1
- package/dist/components/BbCollapsible/BbCollapsible.vue_vue_type_script_setup_true_lang.js +41 -19
- package/dist/components/BbCollapsible/types.d.ts +44 -1
- package/dist/components/BbCollapsible/types.js +7 -0
- package/dist/components/BbColorInput/BbColorInput.vue.d.ts +11 -1
- package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +306 -81
- package/dist/components/BbColorInput/types.d.ts +204 -6
- package/dist/components/BbColorInput/types.js +24 -0
- package/dist/components/BbColorPalette/BbColorPalette.vue.d.ts +10 -2
- package/dist/components/BbColorPalette/BbColorPalette.vue_vue_type_script_setup_true_lang.js +508 -104
- package/dist/components/BbColorPalette/types.d.ts +69 -3
- package/dist/components/BbColorPalette/types.js +12 -0
- package/dist/components/BbConfirm/BbConfirm.vue.d.ts +2 -1
- package/dist/components/BbConfirm/BbConfirm.vue_vue_type_script_setup_true_lang.js +116 -76
- package/dist/components/BbConfirm/types.d.ts +49 -0
- package/dist/components/BbConfirm/types.js +17 -0
- package/dist/components/BbDatePicker/BbDatePicker.vue.d.ts +16 -10
- package/dist/components/BbDatePicker/BbDatePicker.vue_vue_type_script_setup_true_lang.js +291 -218
- package/dist/components/BbDatePicker/types.d.ts +95 -15
- package/dist/components/BbDatePicker/types.js +32 -0
- package/dist/components/BbDatePickerInput/BbDatePickerInput.vue.d.ts +14 -2
- package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +1148 -82
- package/dist/components/BbDatePickerInput/types.d.ts +198 -11
- package/dist/components/BbDatePickerInput/types.js +38 -0
- package/dist/components/BbDialog/BbDialog.vue.d.ts +4 -4
- package/dist/components/BbDialog/BbDialog.vue_vue_type_script_setup_true_lang.js +218 -136
- package/dist/components/BbDialog/types.d.ts +86 -2
- package/dist/components/BbDialog/types.js +16 -0
- package/dist/components/BbDialog/useDialogStack.d.ts +12 -0
- package/dist/components/BbDialog/useDialogStack.js +9 -2
- package/dist/components/BbDropdown/AdaptiveDropdown.vue.d.ts +2 -0
- package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +103 -96
- package/dist/components/BbDropdown/BbDropdown.vue.d.ts +10 -2
- package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +346 -281
- package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +285 -257
- package/dist/components/BbDropdown/DropdownPipelineResolver.vue_vue_type_script_setup_true_lang.js +100 -89
- package/dist/components/BbDropdown/normalizeGroups.js +34 -31
- package/dist/components/BbDropdown/types.d.ts +161 -8
- package/dist/components/BbDropdown/types.js +20 -2
- package/dist/components/BbDropdown/useDropdownContext.d.ts +7 -1
- package/dist/components/BbDropdown/useDropdownGroupRegistry.d.ts +1 -0
- package/dist/components/BbDropdownButton/BbDropdownButton.vue.d.ts +13 -3
- package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +122 -35
- package/dist/components/BbDropdownButton/types.d.ts +94 -1
- package/dist/components/BbDropdownButton/types.js +30 -0
- package/dist/components/BbDropzone/BbDropzone.vue_vue_type_script_setup_true_lang.js +169 -138
- package/dist/components/BbDropzone/types.d.ts +32 -1
- package/dist/components/BbDropzone/types.js +16 -0
- package/dist/components/BbIcon/BbIcon.vue_vue_type_script_setup_true_lang.js +58 -48
- package/dist/components/BbIcon/iconCache.d.ts +63 -0
- package/dist/components/BbIcon/iconCache.js +35 -0
- package/dist/components/BbIcon/types.d.ts +22 -2
- package/dist/components/BbIcon/types.js +7 -0
- package/dist/components/BbIndicator/BbIndicator.vue_vue_type_script_setup_true_lang.js +33 -20
- package/dist/components/BbIndicator/types.d.ts +24 -0
- package/dist/components/BbIndicator/types.js +7 -0
- package/dist/components/BbNumberInput/BbNumberInput.vue.d.ts +6 -1
- package/dist/components/BbNumberInput/BbNumberInput.vue_vue_type_script_setup_true_lang.js +272 -80
- package/dist/components/BbNumberInput/types.d.ts +178 -11
- package/dist/components/BbNumberInput/types.js +8 -0
- package/dist/components/BbOffCanvas/BbOffCanvas.vue.d.ts +4 -4
- package/dist/components/BbOffCanvas/BbOffCanvas.vue_vue_type_script_setup_true_lang.js +294 -207
- package/dist/components/BbOffCanvas/types.d.ts +73 -5
- package/dist/components/BbOffCanvas/types.js +15 -0
- package/dist/components/BbPagination/BbPagination.vue.d.ts +1 -1
- package/dist/components/BbPagination/BbPagination.vue_vue_type_script_setup_true_lang.js +119 -96
- package/dist/components/BbPagination/types.d.ts +32 -0
- package/dist/components/BbPagination/types.js +11 -0
- package/dist/components/BbPopover/BbPopover.vue.d.ts +5 -5
- package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +184 -154
- package/dist/components/BbPopover/types.d.ts +48 -2
- package/dist/components/BbPopover/types.js +14 -0
- package/dist/components/BbProgress/BbProgress.vue_vue_type_script_setup_true_lang.js +27 -15
- package/dist/components/BbProgress/types.d.ts +21 -0
- package/dist/components/BbProgress/types.js +7 -0
- package/dist/components/BbPtScope/BbPtScope.vue.d.ts +12 -0
- package/dist/components/BbPtScope/BbPtScope.vue.js +5 -0
- package/dist/components/BbPtScope/BbPtScope.vue_vue_type_script_setup_true_lang.js +13 -0
- package/dist/components/BbPtScope/types.d.ts +15 -0
- package/dist/components/BbRadio/BbRadio.vue.d.ts +1 -1
- package/dist/components/BbRadio/BbRadio.vue_vue_type_script_setup_true_lang.js +166 -56
- package/dist/components/BbRadio/types.d.ts +137 -9
- package/dist/components/BbRadio/types.js +8 -0
- package/dist/components/BbRadioGroup/BbRadioGroup.vue.d.ts +2 -2
- package/dist/components/BbRadioGroup/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +292 -82
- package/dist/components/BbRadioGroup/types.d.ts +155 -10
- package/dist/components/BbRadioGroup/types.js +10 -0
- package/dist/components/BbRating/BbRating.vue.d.ts +4 -2
- package/dist/components/BbRating/BbRating.vue_vue_type_script_setup_true_lang.js +245 -73
- package/dist/components/BbRating/types.d.ts +152 -6
- package/dist/components/BbRating/types.js +21 -0
- package/dist/components/BbSelect/BbSelect.vue.d.ts +3 -3
- package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +474 -75
- package/dist/components/BbSelect/types.d.ts +174 -8
- package/dist/components/BbSelect/types.js +26 -0
- package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +460 -349
- package/dist/components/BbSelectPopover/types.d.ts +114 -4
- package/dist/components/BbSelectPopover/types.js +24 -0
- package/dist/components/BbSlider/BbSlider.vue.d.ts +10 -4
- package/dist/components/BbSlider/BbSlider.vue_vue_type_script_setup_true_lang.js +396 -92
- package/dist/components/BbSlider/types.d.ts +175 -6
- package/dist/components/BbSlider/types.js +21 -0
- package/dist/components/BbSmoothHeight/BbSmoothHeight.vue.d.ts +1 -1
- package/dist/components/BbSmoothHeight/BbSmoothHeight.vue_vue_type_script_setup_true_lang.js +60 -48
- package/dist/components/BbSmoothHeight/types.d.ts +19 -0
- package/dist/components/BbSmoothHeight/types.js +7 -0
- package/dist/components/BbSpinner/BbSpinner.vue_vue_type_script_setup_true_lang.js +27 -14
- package/dist/components/BbSpinner/types.d.ts +22 -1
- package/dist/components/BbSpinner/types.js +7 -0
- package/dist/components/BbSwitch/BbSwitch.vue.d.ts +1 -1
- package/dist/components/BbSwitch/BbSwitch.vue_vue_type_script_setup_true_lang.js +202 -75
- package/dist/components/BbSwitch/types.d.ts +25 -10
- package/dist/components/BbSwitch/types.js +5 -0
- package/dist/components/BbSwitchGroup/BbSwitchGroup.vue.d.ts +2 -2
- package/dist/components/BbSwitchGroup/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +310 -80
- package/dist/components/BbSwitchGroup/types.d.ts +29 -6
- package/dist/components/BbSwitchGroup/types.js +5 -0
- package/dist/components/BbTable/BbTable.vue.d.ts +10 -4
- package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +1577 -654
- package/dist/components/BbTable/BbTableDataRow.d.ts +169 -0
- package/dist/components/BbTable/BbTableDataRow.js +133 -0
- package/dist/components/BbTable/BbTableExpandRow.d.ts +73 -0
- package/dist/components/BbTable/BbTableExpandRow.js +52 -0
- package/dist/components/BbTable/BbTableSelectToggle.d.ts +103 -0
- package/dist/components/BbTable/BbTableSelectToggle.js +114 -0
- package/dist/components/BbTable/types.d.ts +366 -111
- package/dist/components/BbTable/types.js +18 -0
- package/dist/components/BbTable/utils.d.ts +92 -4
- package/dist/components/BbTable/utils.js +71 -36
- package/dist/components/BbTabs/BbTabs.vue_vue_type_script_setup_true_lang.js +32 -20
- package/dist/components/BbTabs/BbTabsList.vue.d.ts +3 -10
- package/dist/components/BbTabs/BbTabsList.vue_vue_type_script_setup_true_lang.js +39 -33
- package/dist/components/BbTabs/BbTabsPanes.vue_vue_type_script_setup_true_lang.js +14 -13
- package/dist/components/BbTabs/BbTabsRoot.vue_vue_type_script_setup_true_lang.js +12 -1
- package/dist/components/BbTabs/types.d.ts +72 -9
- package/dist/components/BbTabs/types.js +11 -0
- package/dist/components/BbTag/BbTag.vue.d.ts +7 -4
- package/dist/components/BbTag/BbTag.vue_vue_type_script_setup_true_lang.js +350 -88
- package/dist/components/BbTag/types.d.ts +90 -5
- package/dist/components/BbTag/types.js +8 -0
- package/dist/components/BbTextInput/BbTextInput.vue.d.ts +4 -2
- package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +245 -80
- package/dist/components/BbTextInput/types.d.ts +147 -6
- package/dist/components/BbTextInput/types.js +8 -0
- package/dist/components/BbTextarea/BbTextarea.vue.d.ts +1 -1
- package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +273 -91
- package/dist/components/BbTextarea/types.d.ts +134 -6
- package/dist/components/BbTextarea/types.js +8 -0
- package/dist/components/BbTimePicker/BbTimePicker.vue.d.ts +10 -2
- package/dist/components/BbTimePicker/BbTimePicker.vue_vue_type_script_setup_true_lang.js +152 -103
- package/dist/components/BbTimePicker/types.d.ts +65 -3
- package/dist/components/BbTimePicker/types.js +12 -0
- package/dist/components/BbTimePickerInput/BbTimePickerInput.vue.d.ts +12 -2
- package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +705 -83
- package/dist/components/BbTimePickerInput/types.d.ts +128 -12
- package/dist/components/BbTimePickerInput/types.js +23 -0
- package/dist/components/BbToast/BbToast.vue_vue_type_script_setup_true_lang.js +51 -25
- package/dist/components/BbToast/BbToastMessage.vue.d.ts +3 -0
- package/dist/components/BbToast/BbToastMessage.vue_vue_type_script_setup_true_lang.js +48 -47
- package/dist/components/BbToast/BbToastRegion.vue.d.ts +3 -0
- package/dist/components/BbToast/BbToastRegion.vue_vue_type_script_setup_true_lang.js +72 -64
- package/dist/components/BbToast/types.d.ts +28 -0
- package/dist/components/BbToast/types.js +13 -0
- package/dist/components/BbTooltip/BbTooltip.vue_vue_type_script_setup_true_lang.js +100 -84
- package/dist/components/BbTooltip/types.d.ts +40 -2
- package/dist/components/BbTooltip/types.js +7 -0
- package/dist/components/BbTree/BbTree.vue.d.ts +11 -1
- package/dist/components/BbTree/BbTree.vue_vue_type_script_setup_true_lang.js +44 -28
- package/dist/components/BbTree/BbTreeLevel.vue_vue_type_script_setup_true_lang.js +13 -12
- package/dist/components/BbTree/context.d.ts +4 -1
- package/dist/components/BbTree/types.d.ts +30 -1
- package/dist/components/BbTree/types.js +7 -0
- package/dist/components/ChipsBox/ChipsBox.vue_vue_type_script_setup_true_lang.js +9 -7
- package/dist/components/ChipsBox/types.d.ts +6 -0
- package/dist/components/ClearableButton/ClearableButton.vue_vue_type_script_setup_true_lang.js +5 -5
- package/dist/components/CommaBox/CommaBox.vue_vue_type_script_setup_true_lang.js +11 -7
- package/dist/components/CommaBox/types.d.ts +6 -0
- package/dist/components/{BbBaseInputContainer/BbBaseInputContainer.vue.d.ts → CommonField/CommonField.vue.d.ts} +4 -4
- package/dist/components/{BbBaseRadio/BbBaseRadio.vue.js → CommonField/CommonField.vue.js} +2 -2
- package/dist/components/CommonField/CommonField.vue_vue_type_script_setup_true_lang.js +178 -0
- package/dist/components/CommonField/messageHeightMatrix.d.ts +2 -0
- package/dist/components/{BbBaseInputContainer → CommonField}/types.d.ts +33 -10
- package/dist/components/{CommonInputWrapper/CommonInputWrapper.vue.d.ts → CommonFieldInput/CommonFieldInput.vue.d.ts} +5 -4
- package/dist/components/{BbBaseRadioGroup/BbBaseRadioGroup.vue.js → CommonFieldInput/CommonFieldInput.vue.js} +2 -2
- package/dist/components/CommonFieldInput/CommonFieldInput.vue_vue_type_script_setup_true_lang.js +116 -0
- package/dist/components/CommonFieldInput/boxBorderMatrix.d.ts +10 -0
- package/dist/components/{CommonInputWrapper → CommonFieldInput}/types.d.ts +25 -6
- package/dist/components/CommonPopover/CommonPopover.vue.d.ts +11 -2
- package/dist/components/CommonPopover/CommonPopover.vue_vue_type_script_setup_true_lang.js +65 -53
- package/dist/components/CommonPopover/types.d.ts +27 -8
- package/dist/components/{BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue.d.ts → CommonTimeSelector/CommonTimeSelector.vue.d.ts} +4 -1
- package/dist/components/{BbBaseColorPalette/BbBaseColorPalette.vue.js → CommonTimeSelector/CommonTimeSelector.vue.js} +2 -2
- package/dist/components/CommonTimeSelector/CommonTimeSelector.vue_vue_type_script_setup_true_lang.js +207 -0
- package/dist/components/CommonTimeSelector/types.d.ts +6 -0
- package/dist/components/FlatListBox/FlatListBox.vue_vue_type_script_setup_true_lang.js +163 -100
- package/dist/components/FlatListBox/types.d.ts +15 -0
- package/dist/components/GroupedListBox/GroupedListBox.vue_vue_type_script_setup_true_lang.js +190 -127
- package/dist/components/GroupedListBox/types.d.ts +15 -0
- package/dist/components/ListBox/ListBox.vue_vue_type_script_setup_true_lang.js +82 -66
- package/dist/components/ListBox/types.d.ts +15 -0
- package/dist/components/OptionsContainer/OptionsContainer.vue_vue_type_script_setup_true_lang.js +89 -35
- package/dist/components/OptionsContainer/types.d.ts +37 -5
- package/dist/composables/useBaseOptions.d.ts +12 -1
- package/dist/composables/useBaseOptions.js +63 -31
- package/dist/composables/useBbConfig.d.ts +27 -6
- package/dist/composables/useBbConfig.js +8 -2
- package/dist/composables/useBbDropdownContext.d.ts +5 -0
- package/dist/composables/useBbTabsContext.d.ts +16 -2
- package/dist/composables/useBbTabsContext.js +157 -145
- package/dist/composables/useConfig.d.ts +59 -0
- package/dist/composables/useConfig.js +11 -0
- package/dist/composables/useConfirm.d.ts +33 -2
- package/dist/composables/useConfirm.js +43 -40
- package/dist/composables/useItemsGetter.d.ts +11 -0
- package/dist/composables/useItemsGetter.js +44 -18
- package/dist/composables/useLocale.js +10 -7
- package/dist/composables/useMobile.js +5 -5
- package/dist/composables/usePassthrough.d.ts +206 -0
- package/dist/composables/usePassthrough.js +224 -0
- package/dist/composables/usePrefill.d.ts +22 -2
- package/dist/composables/usePrefill.js +35 -19
- package/dist/composables/useSafeAreaInternal.js +1 -1
- package/dist/composables/useSegmentedFields.d.ts +2 -2
- package/dist/composables/useSsrState.d.ts +20 -0
- package/dist/composables/useSsrState.js +13 -0
- package/dist/composables/useTableWidthContext.d.ts +24 -4
- package/dist/composables/useTableWidthContext.js +31 -28
- package/dist/composables/useToast.d.ts +18 -1
- package/dist/composables/useToast.js +22 -18
- package/dist/composables/useToggleInput.d.ts +44 -0
- package/dist/composables/useToggleInput.js +39 -0
- package/dist/composables/useViewportWidth.d.ts +20 -6
- package/dist/composables/useViewportWidth.js +8 -7
- package/dist/deprecation/ai-deprecations.json.d.ts +352 -11
- package/dist/deprecation/ai-deprecations.json.js +1 -1
- package/dist/directives/bbDropdown.d.ts +15 -4
- package/dist/directives/bbDropdown.js +31 -9
- package/dist/directives/createPopoverDirective.d.ts +62 -0
- package/dist/directives/createPopoverDirective.js +92 -37
- package/dist/i18n/locales/cs.json +6 -3
- package/dist/i18n/locales/da.json +6 -3
- package/dist/i18n/locales/de.json +6 -3
- package/dist/i18n/locales/el.json +6 -3
- package/dist/i18n/locales/en.json +6 -3
- package/dist/i18n/locales/es.json +6 -3
- package/dist/i18n/locales/fi.json +6 -3
- package/dist/i18n/locales/fr.json +6 -3
- package/dist/i18n/locales/hu.json +6 -3
- package/dist/i18n/locales/it.json +6 -3
- package/dist/i18n/locales/ja.json +6 -3
- package/dist/i18n/locales/ko.json +6 -3
- package/dist/i18n/locales/nb.json +6 -3
- package/dist/i18n/locales/nl.json +6 -3
- package/dist/i18n/locales/pl.json +6 -3
- package/dist/i18n/locales/pt.json +6 -3
- package/dist/i18n/locales/ro.json +6 -3
- package/dist/i18n/locales/ru.json +6 -3
- package/dist/i18n/locales/sv.json +6 -3
- package/dist/i18n/locales/tr.json +6 -3
- package/dist/i18n/locales/uk.json +6 -3
- package/dist/i18n/locales/zh-cn.json +6 -3
- package/dist/icon-scan.d.ts +276 -0
- package/dist/icon-scan.js +485 -0
- package/dist/icons-whitelist.d.ts +5 -4
- package/dist/index.d.ts +25 -4
- package/dist/index.js +71 -67
- package/dist/input-variants.d.ts +18 -0
- package/dist/llms-full.txt +19105 -4677
- package/dist/llms-medium.txt +1027 -174
- package/dist/llms.txt +13 -10
- package/dist/locale-blueprint.json +6 -3
- package/dist/nuxt-auto-imports.d.ts +100 -0
- package/dist/nuxt-auto-imports.js +55 -0
- package/dist/nuxt-module.d.ts +26 -1
- package/dist/nuxt.js +26 -9
- package/dist/passthrough-deduper.js +5 -0
- package/dist/plugin.d.ts +10 -1
- package/dist/plugin.js +21 -19
- package/dist/pt-scope-registry.d.ts +15 -0
- package/dist/runtime/nuxt-plugin.js +29 -21
- package/dist/styles.css +1 -1
- package/dist/tabs-variants.d.ts +18 -0
- package/dist/types/ColumnName.d.ts +1 -1
- package/dist/types/CommonProps.d.ts +2 -2
- package/dist/types/Config.d.ts +47 -0
- package/dist/types/InputVariant.d.ts +22 -0
- package/dist/types/ItemProps.d.ts +50 -0
- package/dist/types/Option.d.ts +6 -0
- package/dist/types/PtScope.d.ts +13 -0
- package/dist/types/TabsVariant.d.ts +17 -0
- package/dist/types/passthrough.d.ts +332 -0
- package/dist/types/passthrough.js +78 -0
- package/dist/types/ptComponentMap.d.ts +60 -0
- package/dist/utilities/functions/hasVnodeListener.d.ts +16 -0
- package/dist/utilities/functions/hasVnodeListener.js +12 -0
- package/dist/utilities/functions/itemProps.d.ts +46 -0
- package/dist/utilities/functions/itemProps.js +47 -0
- package/dist/utilities/functions/slotKey.d.ts +5 -5
- package/dist/utilities/functions/slotKey.js +1 -1
- package/dist/utilities/functions/toggleInput.d.ts +98 -0
- package/dist/utilities/functions/toggleInput.js +56 -0
- package/dist/utilities/misc/listboxMetrics.d.ts +9 -3
- package/dist/utilities/misc/listboxMetrics.js +5 -2
- package/dist/utilities/misc/ssrStateInjectionKey.d.ts +42 -0
- package/dist/utilities/misc/ssrStateInjectionKey.js +4 -0
- package/dist/utils/cssLayers.d.ts +91 -0
- package/dist/utils/cssLayers.js +43 -0
- package/dist/utils/injectLibraryStyles.d.ts +3 -1
- package/dist/utils/injectLibraryStyles.js +24 -23
- package/dist/utils/passthrough.d.ts +63 -0
- package/dist/utils/passthrough.js +96 -0
- package/dist/utils/passthroughDeduper.d.ts +2 -0
- package/dist/utils/passthroughTestKit.d.ts +54 -0
- package/dist/utils/ptScope.d.ts +8 -0
- package/dist/utils/ptScope.js +4 -0
- package/dist/utils/swipeTestKit.d.ts +9 -0
- package/dist/validated/BbCheckbox.vue.d.ts +3 -1
- package/dist/validated/BbCheckbox.vue_vue_type_script_setup_true_lang.js +82 -23
- package/dist/validated/BbCheckboxGroup.vue.d.ts +125 -2
- package/dist/validated/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +113 -25
- package/dist/validated/BbColorInput.vue.d.ts +9 -7
- package/dist/validated/BbColorInput.vue_vue_type_script_setup_true_lang.js +145 -25
- package/dist/validated/BbDatePickerInput.vue.d.ts +11 -9
- package/dist/validated/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +417 -27
- package/dist/validated/BbDropzone.vue_vue_type_script_setup_true_lang.js +17 -1
- package/dist/validated/BbForm.vue_vue_type_script_setup_true_lang.js +45 -27
- package/dist/validated/BbNumberInput.vue.d.ts +9 -7
- package/dist/validated/BbNumberInput.vue_vue_type_script_setup_true_lang.js +115 -25
- package/dist/validated/BbRadioGroup.vue.d.ts +124 -2
- package/dist/validated/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +113 -25
- package/dist/validated/BbRating.vue.d.ts +6 -4
- package/dist/validated/BbRating.vue_vue_type_script_setup_true_lang.js +69 -22
- package/dist/validated/BbSelect.vue.d.ts +235 -2
- package/dist/validated/BbSelect.vue_vue_type_script_setup_true_lang.js +217 -32
- package/dist/validated/BbSlider.vue.d.ts +9 -7
- package/dist/validated/BbSlider.vue_vue_type_script_setup_true_lang.js +72 -25
- package/dist/validated/BbSwitch.vue.d.ts +3 -1
- package/dist/validated/BbSwitch.vue_vue_type_script_setup_true_lang.js +82 -23
- package/dist/validated/BbSwitchGroup.vue.d.ts +125 -2
- package/dist/validated/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +113 -25
- package/dist/validated/BbTag.vue.d.ts +9 -7
- package/dist/validated/BbTag.vue_vue_type_script_setup_true_lang.js +122 -25
- package/dist/validated/BbTextInput.vue.d.ts +9 -7
- package/dist/validated/BbTextInput.vue_vue_type_script_setup_true_lang.js +115 -25
- package/dist/validated/BbTextarea.vue.d.ts +9 -7
- package/dist/validated/BbTextarea.vue_vue_type_script_setup_true_lang.js +115 -25
- package/dist/validated/BbTimePickerInput.vue.d.ts +9 -7
- package/dist/validated/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +175 -25
- package/dist/validated/index.d.ts +3 -0
- package/dist/validated/useValidatedField.js +25 -23
- package/dist/vite-plugin.d.ts +230 -23
- package/dist/vite.js +515 -301
- package/llms.txt +14 -11
- package/package.json +15 -11
- package/scripts/lib/component-tree.ts +611 -0
- package/scripts/lib/ensure-manifest.mjs +28 -5
- package/scripts/lib/eslint-plugin.d.ts +58 -1
- package/scripts/lib/eslint-plugin.mjs +899 -17
- package/scripts/lib/hand-roll-hints.mjs +50 -6
- package/scripts/lib/html-attributes.mjs +133 -0
- package/scripts/lib/mcp-config.mjs +38 -34
- package/scripts/lib/public-type-exports.mjs +246 -0
- package/scripts/lib/validate-bb-markup.mjs +312 -33
- package/dist/ai/BbBaseCheckbox.md +0 -49
- package/dist/ai/BbBaseCheckboxGroup.md +0 -64
- package/dist/ai/BbBaseColorInput.md +0 -65
- package/dist/ai/BbBaseColorPalette.md +0 -39
- package/dist/ai/BbBaseDatePicker.md +0 -43
- package/dist/ai/BbBaseDatePickerInput.md +0 -73
- package/dist/ai/BbBaseNumberInput.md +0 -71
- package/dist/ai/BbBaseRadio.md +0 -46
- package/dist/ai/BbBaseRadioGroup.md +0 -64
- package/dist/ai/BbBaseRating.md +0 -52
- package/dist/ai/BbBaseSelect.md +0 -88
- package/dist/ai/BbBaseSlider.md +0 -56
- package/dist/ai/BbBaseSwitch.md +0 -49
- package/dist/ai/BbBaseSwitchGroup.md +0 -64
- package/dist/ai/BbBaseTag.md +0 -68
- package/dist/ai/BbBaseTextInput.md +0 -75
- package/dist/ai/BbBaseTextarea.md +0 -62
- package/dist/ai/BbBaseTimePickerInput.md +0 -62
- package/dist/ai/CommonInputWrapper.md +0 -42
- package/dist/ai/source/BbBaseCheckbox.md +0 -461
- package/dist/ai/source/BbBaseCheckboxGroup.md +0 -554
- package/dist/ai/source/BbBaseColorInput.md +0 -431
- package/dist/ai/source/BbBaseColorPalette.md +0 -942
- package/dist/ai/source/BbBaseDatePicker.md +0 -1448
- package/dist/ai/source/BbBaseDatePickerInput.md +0 -1940
- package/dist/ai/source/BbBaseNumberInput.md +0 -617
- package/dist/ai/source/BbBaseRadio.md +0 -381
- package/dist/ai/source/BbBaseRadioGroup.md +0 -539
- package/dist/ai/source/BbBaseRating.md +0 -607
- package/dist/ai/source/BbBaseSelect.md +0 -945
- package/dist/ai/source/BbBaseSlider.md +0 -1144
- package/dist/ai/source/BbBaseSwitch.md +0 -246
- package/dist/ai/source/BbBaseSwitchGroup.md +0 -302
- package/dist/ai/source/BbBaseTag.md +0 -694
- package/dist/ai/source/BbBaseTextInput.md +0 -511
- package/dist/ai/source/BbBaseTextarea.md +0 -504
- package/dist/ai/source/BbBaseTimePickerInput.md +0 -1037
- package/dist/ai/source/CommonInputWrapper.md +0 -584
- package/dist/assets/svgs/sort.svg_raw.js +0 -4
- package/dist/components/BbBadge/BadgeAppendIcon.vue.d.ts +0 -3
- package/dist/components/BbBadge/BadgeAppendIcon.vue.js +0 -5
- package/dist/components/BbBadge/BadgeAppendIcon.vue_vue_type_script_setup_true_lang.js +0 -22
- package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue.d.ts +0 -40
- package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue.js +0 -6
- package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue_vue_type_script_setup_true_lang.js +0 -145
- package/dist/components/BbBaseCheckbox/types.d.ts +0 -224
- package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue.d.ts +0 -19
- package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue.js +0 -6
- package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue_vue_type_script_setup_true_lang.js +0 -190
- package/dist/components/BbBaseCheckboxGroup/types.d.ts +0 -257
- package/dist/components/BbBaseColorInput/BbBaseColorInput.vue.d.ts +0 -43
- package/dist/components/BbBaseColorInput/BbBaseColorInput.vue.js +0 -6
- package/dist/components/BbBaseColorInput/BbBaseColorInput.vue_vue_type_script_setup_true_lang.js +0 -184
- package/dist/components/BbBaseColorInput/types.d.ts +0 -219
- package/dist/components/BbBaseColorPalette/BbBaseColorPalette.vue.d.ts +0 -13
- package/dist/components/BbBaseColorPalette/BbBaseColorPalette.vue_vue_type_script_setup_true_lang.js +0 -395
- package/dist/components/BbBaseColorPalette/types.d.ts +0 -40
- package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue.d.ts +0 -20
- package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue.js +0 -6
- package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue_vue_type_script_setup_true_lang.js +0 -407
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue.d.ts +0 -47
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue.js +0 -5
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue_vue_type_script_setup_true_lang.js +0 -318
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue.js +0 -5
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue_vue_type_script_setup_true_lang.js +0 -115
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerYearSelector.vue.js +0 -5
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerYearSelector.vue_vue_type_script_setup_true_lang.js +0 -116
- package/dist/components/BbBaseDatePicker/types.d.ts +0 -108
- package/dist/components/BbBaseDatePicker/useDatePickerContext.js +0 -11
- package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue.d.ts +0 -31
- package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue.js +0 -6
- package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue_vue_type_script_setup_true_lang.js +0 -737
- package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue.js +0 -6
- package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue_vue_type_script_setup_true_lang.js +0 -204
- package/dist/components/BbBaseDatePickerInput/types.d.ts +0 -325
- package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue.js +0 -6
- package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue_vue_type_script_setup_true_lang.js +0 -190
- package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue.d.ts +0 -52
- package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue.js +0 -6
- package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue_vue_type_script_setup_true_lang.js +0 -215
- package/dist/components/BbBaseNumberInput/types.d.ts +0 -211
- package/dist/components/BbBaseRadio/BbBaseRadio.vue.d.ts +0 -33
- package/dist/components/BbBaseRadio/BbBaseRadio.vue_vue_type_script_setup_true_lang.js +0 -113
- package/dist/components/BbBaseRadio/types.d.ts +0 -179
- package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue.d.ts +0 -19
- package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue_vue_type_script_setup_true_lang.js +0 -179
- package/dist/components/BbBaseRadioGroup/types.d.ts +0 -223
- package/dist/components/BbBaseRating/BbBaseRating.vue.d.ts +0 -38
- package/dist/components/BbBaseRating/BbBaseRating.vue.js +0 -6
- package/dist/components/BbBaseRating/BbBaseRating.vue_vue_type_script_setup_true_lang.js +0 -192
- package/dist/components/BbBaseRating/types.d.ts +0 -176
- package/dist/components/BbBaseSelect/BbBaseSelect.vue.d.ts +0 -19
- package/dist/components/BbBaseSelect/BbBaseSelect.vue.js +0 -6
- package/dist/components/BbBaseSelect/BbBaseSelect.vue_vue_type_script_setup_true_lang.js +0 -311
- package/dist/components/BbBaseSelect/types.d.ts +0 -297
- package/dist/components/BbBaseSlider/BbBaseSlider.vue.d.ts +0 -35
- package/dist/components/BbBaseSlider/BbBaseSlider.vue.js +0 -6
- package/dist/components/BbBaseSlider/BbBaseSlider.vue_vue_type_script_setup_true_lang.js +0 -340
- package/dist/components/BbBaseSlider/types.d.ts +0 -200
- package/dist/components/BbBaseSwitch/BbBaseSwitch.vue.d.ts +0 -35
- package/dist/components/BbBaseSwitch/BbBaseSwitch.vue.js +0 -6
- package/dist/components/BbBaseSwitch/BbBaseSwitch.vue_vue_type_script_setup_true_lang.js +0 -146
- package/dist/components/BbBaseSwitch/types.d.ts +0 -10
- package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue.d.ts +0 -19
- package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue.js +0 -6
- package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue_vue_type_script_setup_true_lang.js +0 -190
- package/dist/components/BbBaseSwitchGroup/types.d.ts +0 -8
- package/dist/components/BbBaseTag/BbBaseTag.vue.d.ts +0 -50
- package/dist/components/BbBaseTag/BbBaseTag.vue.js +0 -6
- package/dist/components/BbBaseTag/BbBaseTag.vue_vue_type_script_setup_true_lang.js +0 -266
- package/dist/components/BbBaseTag/types.d.ts +0 -160
- package/dist/components/BbBaseTextInput/BbBaseTextInput.vue.d.ts +0 -45
- package/dist/components/BbBaseTextInput/BbBaseTextInput.vue.js +0 -6
- package/dist/components/BbBaseTextInput/BbBaseTextInput.vue_vue_type_script_setup_true_lang.js +0 -200
- package/dist/components/BbBaseTextInput/types.d.ts +0 -209
- package/dist/components/BbBaseTextarea/BbBaseTextarea.vue.d.ts +0 -39
- package/dist/components/BbBaseTextarea/BbBaseTextarea.vue.js +0 -6
- package/dist/components/BbBaseTextarea/BbBaseTextarea.vue_vue_type_script_setup_true_lang.js +0 -187
- package/dist/components/BbBaseTextarea/types.d.ts +0 -170
- package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue.d.ts +0 -27
- package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue.js +0 -6
- package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue_vue_type_script_setup_true_lang.js +0 -519
- package/dist/components/BbBaseTimePickerInput/types.d.ts +0 -151
- package/dist/components/CommonInputWrapper/CommonInputWrapper.vue.js +0 -6
- package/dist/components/CommonInputWrapper/CommonInputWrapper.vue_vue_type_script_setup_true_lang.js +0 -107
- /package/dist/components/{BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue.d.ts → BbCalendar/CalendarMonthPanel.vue.d.ts} +0 -0
- /package/dist/components/{BbBaseDatePicker/BbBaseDatePickerYearSelector.vue.d.ts → BbCalendar/CalendarYearPanel.vue.d.ts} +0 -0
- /package/dist/{components/BbBaseDatePicker/typeahead.d.ts → composables/useTypeahead.d.ts} +0 -0
- /package/dist/{components/BbBaseDatePicker/typeahead.js → composables/useTypeahead.js} +0 -0
package/bin/bitboss-ui-mcp.mjs
CHANGED
|
@@ -36,6 +36,7 @@ import { fileURLToPath } from 'node:url';
|
|
|
36
36
|
import { z } from 'zod';
|
|
37
37
|
import {
|
|
38
38
|
loadManifest,
|
|
39
|
+
possessive,
|
|
39
40
|
validateVueSnippet,
|
|
40
41
|
} from '../scripts/lib/validate-bb-markup.mjs';
|
|
41
42
|
|
|
@@ -70,26 +71,180 @@ function getManifestMap() {
|
|
|
70
71
|
return cachedManifestMap;
|
|
71
72
|
}
|
|
72
73
|
|
|
73
|
-
/** `search_components({ query })` —
|
|
74
|
+
/** `search_components({ query })` — token match over name/description. */
|
|
74
75
|
const SEARCH_DEFAULT_LIMIT = 20;
|
|
75
76
|
|
|
76
77
|
/**
|
|
77
|
-
*
|
|
78
|
+
* Ranking for the manifest's type tiers. `api` types are the ones an app is
|
|
79
|
+
* expected to reach for — they appear in a component's own props or events —
|
|
80
|
+
* so they lead. `wrapper` (`<Component>Props`) matters only when wrapping one
|
|
81
|
+
* of our components, and `advanced` is registries, contexts and adapters.
|
|
82
|
+
* Publishing 166 exports as a flat list made every one look equally important.
|
|
83
|
+
*/
|
|
84
|
+
const TYPE_USAGE_RANK = { api: 0, wrapper: 1, advanced: 2 };
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* WHY THIS IS NOT A PLAIN SUBSTRING MATCH ANY MORE.
|
|
88
|
+
*
|
|
89
|
+
* It was, and a consumer pilot (2026-09-09) hand-rolled three components the
|
|
90
|
+
* library ships because the whole query string had to appear verbatim in one
|
|
91
|
+
* field. `table` found BbTable; `data table` — the term most of the industry
|
|
92
|
+
* uses — found NOTHING, because no name or description contains that exact
|
|
93
|
+
* pair. Same for `command palette`, `stepper wizard`, `skeleton loading`.
|
|
94
|
+
*
|
|
95
|
+
* An empty result is the worst possible answer for a tool whose stated job is
|
|
96
|
+
* "find the right Bb* component before writing usage code": it is
|
|
97
|
+
* indistinguishable from "nothing here, build it yourself". So two things
|
|
98
|
+
* changed. Multi-word queries are TOKENISED, and every search — hit or miss —
|
|
99
|
+
* consults the component picker's "Not in this library" table, which is where
|
|
100
|
+
* the authoritative answers for the invented names already lived.
|
|
101
|
+
*/
|
|
102
|
+
|
|
103
|
+
/** English filler that would otherwise match half the corpus on its own. */
|
|
104
|
+
const SEARCH_STOPWORDS = new Set([
|
|
105
|
+
'a',
|
|
106
|
+
'an',
|
|
107
|
+
'the',
|
|
108
|
+
'and',
|
|
109
|
+
'or',
|
|
110
|
+
'not',
|
|
111
|
+
'no',
|
|
112
|
+
'is',
|
|
113
|
+
'it',
|
|
114
|
+
'in',
|
|
115
|
+
'on',
|
|
116
|
+
'for',
|
|
117
|
+
'of',
|
|
118
|
+
'to',
|
|
119
|
+
'with',
|
|
120
|
+
'component',
|
|
121
|
+
'components',
|
|
122
|
+
'ui',
|
|
123
|
+
'view',
|
|
124
|
+
'widget',
|
|
125
|
+
'element',
|
|
126
|
+
]);
|
|
127
|
+
|
|
128
|
+
/** `'data table view'` → `['data', 'table']`. Order is not significant. */
|
|
129
|
+
function tokenize(query) {
|
|
130
|
+
const raw = String(query ?? '')
|
|
131
|
+
.toLowerCase()
|
|
132
|
+
.split(/[^a-z0-9]+/)
|
|
133
|
+
.filter(Boolean);
|
|
134
|
+
const meaningful = raw.filter((t) => !SEARCH_STOPWORDS.has(t));
|
|
135
|
+
// An all-stopword query ('the view') still deserves its literal reading
|
|
136
|
+
// rather than an empty token list that matches everything.
|
|
137
|
+
return meaningful.length > 0 ? meaningful : raw;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Relevance score for one component against ONE lowercased token. Higher wins;
|
|
78
142
|
* 0 means "no match". Name hits always outrank description hits so
|
|
79
143
|
* `search_components({ query: 'table' })` leads with BbTable, not with every
|
|
80
144
|
* component whose prose mentions a table.
|
|
81
145
|
*/
|
|
82
|
-
function
|
|
146
|
+
function scoreToken(component, needle) {
|
|
83
147
|
const name = component.name.toLowerCase();
|
|
84
148
|
const description = (component.description ?? '').toLowerCase();
|
|
85
149
|
if (name === needle) return 100;
|
|
86
150
|
if (name === `bb${needle}`) return 95; // 'button' → BbButton
|
|
87
151
|
if (name.startsWith(needle) || name.startsWith(`bb${needle}`)) return 80;
|
|
88
152
|
if (name.includes(needle)) return 60;
|
|
89
|
-
|
|
153
|
+
// Descriptions match at a WORD START, never mid-word: a plain substring made
|
|
154
|
+
// 'not' hit "notification" and returned four components for a nonsense
|
|
155
|
+
// query. Trailing suffixes still count, so 'card' finds "cards".
|
|
156
|
+
if (new RegExp(`\\b${needle}`).test(description)) return 30;
|
|
90
157
|
return 0;
|
|
91
158
|
}
|
|
92
159
|
|
|
160
|
+
/**
|
|
161
|
+
* Score against every token. A component that matches MORE of the query ranks
|
|
162
|
+
* above one that matches a single token harder, so `data table` puts BbTable
|
|
163
|
+
* (both tokens) above a component whose description merely says "data".
|
|
164
|
+
*/
|
|
165
|
+
function scoreComponent(component, tokens) {
|
|
166
|
+
let total = 0;
|
|
167
|
+
let matched = 0;
|
|
168
|
+
for (const token of tokens) {
|
|
169
|
+
const score = scoreToken(component, token);
|
|
170
|
+
if (score > 0) {
|
|
171
|
+
matched += 1;
|
|
172
|
+
total += score;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return matched === 0 ? { matched: 0, score: 0 } : { matched, score: total };
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* The picker's "Not in this library" table, parsed from the shipped guide so
|
|
180
|
+
* there is exactly one source of truth. Rows carry both kinds of answer:
|
|
181
|
+
* redirects (`BbDrawer` → "It is BbOffCanvas") and verdicts (`BbCard` → "Does
|
|
182
|
+
* not exist — a card is a <div> with tokens"). Both are better answers to a
|
|
183
|
+
* miss than an empty array.
|
|
184
|
+
*/
|
|
185
|
+
const PICKER_PATH = join(AI_ROOT, 'guides', 'component-picker.md');
|
|
186
|
+
let cachedNotInLibrary = null;
|
|
187
|
+
|
|
188
|
+
/** `'BbDataTable'` → `['bbdatatable', 'data', 'table']`. */
|
|
189
|
+
function aliasTokens(cell) {
|
|
190
|
+
const words = cell
|
|
191
|
+
.replace(/\[([^\]]*)\]\([^)]*\)/g, '$1') // links → their text
|
|
192
|
+
.replace(/[`*_]/g, '')
|
|
193
|
+
.split(/[^A-Za-z0-9]+/)
|
|
194
|
+
.filter(Boolean);
|
|
195
|
+
const tokens = new Set();
|
|
196
|
+
for (const word of words) {
|
|
197
|
+
tokens.add(word.toLowerCase());
|
|
198
|
+
// Split CamelCase so `BbDataTable` is reachable by 'data' and 'table'.
|
|
199
|
+
for (const part of word.replace(/^Bb/, '').split(/(?=[A-Z])/))
|
|
200
|
+
if (part.length > 1) tokens.add(part.toLowerCase());
|
|
201
|
+
}
|
|
202
|
+
return [...tokens].filter((t) => !SEARCH_STOPWORDS.has(t) && t !== 'bb');
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
function loadNotInLibrary() {
|
|
206
|
+
if (cachedNotInLibrary) return cachedNotInLibrary;
|
|
207
|
+
cachedNotInLibrary = [];
|
|
208
|
+
if (!existsSync(PICKER_PATH)) return cachedNotInLibrary;
|
|
209
|
+
const md = readFileSync(PICKER_PATH, 'utf-8');
|
|
210
|
+
const section = md.split(/^## Not in this library\s*$/m)[1];
|
|
211
|
+
if (!section) return cachedNotInLibrary;
|
|
212
|
+
for (const line of section.split('\n')) {
|
|
213
|
+
if (!line.startsWith('|')) continue;
|
|
214
|
+
// Tolerate a missing trailing `|`: markdown renders such a row fine, so
|
|
215
|
+
// dropping it here would silently lose an answer (it already did once).
|
|
216
|
+
const cells = line
|
|
217
|
+
.replace(/^\|/, '')
|
|
218
|
+
.replace(/\|\s*$/, '')
|
|
219
|
+
.split('|');
|
|
220
|
+
if (cells.length < 2) continue;
|
|
221
|
+
const assumed = cells[0].trim();
|
|
222
|
+
const reality = cells[1].trim();
|
|
223
|
+
// Skip the header and its `---` separator.
|
|
224
|
+
if (!assumed || /^-+$/.test(assumed) || /^Assumed\b/i.test(assumed))
|
|
225
|
+
continue;
|
|
226
|
+
cachedNotInLibrary.push({
|
|
227
|
+
assumed,
|
|
228
|
+
reality,
|
|
229
|
+
tokens: aliasTokens(assumed),
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
return cachedNotInLibrary;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/** Picker rows whose assumed-name cell shares a token with the query. */
|
|
236
|
+
function matchNotInLibrary(tokens) {
|
|
237
|
+
const wanted = new Set(tokens);
|
|
238
|
+
return loadNotInLibrary()
|
|
239
|
+
.map((row) => ({
|
|
240
|
+
row,
|
|
241
|
+
hits: row.tokens.filter((t) => wanted.has(t)).length,
|
|
242
|
+
}))
|
|
243
|
+
.filter(({ hits }) => hits > 0)
|
|
244
|
+
.sort((a, b) => b.hits - a.hits)
|
|
245
|
+
.map(({ row }) => ({ assumed: row.assumed, reality: row.reality }));
|
|
246
|
+
}
|
|
247
|
+
|
|
93
248
|
function searchComponents({ query, limit, includeReferenceOnly } = {}) {
|
|
94
249
|
const manifest = loadComponentsManifest();
|
|
95
250
|
const needle = String(query ?? '')
|
|
@@ -104,13 +259,65 @@ function searchComponents({ query, limit, includeReferenceOnly } = {}) {
|
|
|
104
259
|
? manifest.components
|
|
105
260
|
: manifest.components.filter((c) => !c.referenceOnly);
|
|
106
261
|
|
|
262
|
+
const tokens = tokenize(needle);
|
|
263
|
+
const notInLibrary = matchNotInLibrary(tokens);
|
|
264
|
+
|
|
265
|
+
// A matched picker row NAMES the real component ("`BbDrawer` / `BbSheet` →
|
|
266
|
+
// It is BbOffCanvas"). Rank those first: the picker knows the answer, and
|
|
267
|
+
// returning nothing for `drawer` while BbOffCanvas ships is the whole bug.
|
|
268
|
+
const redirected = new Set();
|
|
269
|
+
for (const { reality } of notInLibrary)
|
|
270
|
+
for (const name of reality.match(/\bBb[A-Z][A-Za-z]+/g) ?? [])
|
|
271
|
+
redirected.add(name);
|
|
272
|
+
|
|
107
273
|
const scored = pool
|
|
108
|
-
.map((c) =>
|
|
274
|
+
.map((c) => {
|
|
275
|
+
const base = scoreComponent(c, tokens);
|
|
276
|
+
const bonus = redirected.has(c.name) ? 90 : 0;
|
|
277
|
+
return bonus > 0
|
|
278
|
+
? { c, matched: base.matched + 1, score: base.score + bonus }
|
|
279
|
+
: { c, ...base };
|
|
280
|
+
})
|
|
109
281
|
.filter(({ score }) => score > 0)
|
|
110
|
-
//
|
|
111
|
-
|
|
282
|
+
// More of the query matched wins first; then strength; then alphabetical
|
|
283
|
+
// so results are stable between calls.
|
|
284
|
+
.sort(
|
|
285
|
+
(a, b) =>
|
|
286
|
+
b.matched - a.matched ||
|
|
287
|
+
b.score - a.score ||
|
|
288
|
+
a.c.name.localeCompare(b.c.name)
|
|
289
|
+
);
|
|
112
290
|
|
|
113
291
|
const shown = scored.slice(0, max);
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Public type exports whose name matches the query. Scored the same way as
|
|
295
|
+
* a component name (exact, prefix, substring) but never mixed into the
|
|
296
|
+
* component list — a type is not something you render, and ranking it
|
|
297
|
+
* beside components is how it gets written as a tag.
|
|
298
|
+
*/
|
|
299
|
+
const matchedTypes = (manifest.types ?? [])
|
|
300
|
+
.filter((type) => {
|
|
301
|
+
const lower = type.name.toLowerCase();
|
|
302
|
+
return tokens.some(
|
|
303
|
+
(token) => lower === token || lower.includes(token.toLowerCase())
|
|
304
|
+
);
|
|
305
|
+
})
|
|
306
|
+
// `api` first: those are the types you meet writing markup. The rest are
|
|
307
|
+
// wrapper props and internals, which rank below anything you would use.
|
|
308
|
+
.sort((a, b) => TYPE_USAGE_RANK[a.usage] - TYPE_USAGE_RANK[b.usage])
|
|
309
|
+
.slice(0, max)
|
|
310
|
+
.map((type) => ({
|
|
311
|
+
name: type.name,
|
|
312
|
+
kind: 'type',
|
|
313
|
+
usage: type.usage,
|
|
314
|
+
component: type.component,
|
|
315
|
+
...(type.deprecated ? { deprecated: true } : {}),
|
|
316
|
+
...(type.replacedBy ? { replacedBy: type.replacedBy } : {}),
|
|
317
|
+
usedBy: type.usedBy ?? [],
|
|
318
|
+
import: `import type { ${type.replacedBy ?? type.name} } from 'bitboss-ui';`,
|
|
319
|
+
}));
|
|
320
|
+
|
|
114
321
|
return {
|
|
115
322
|
query: query ?? '',
|
|
116
323
|
count: shown.length,
|
|
@@ -128,6 +335,23 @@ function searchComponents({ query, limit, includeReferenceOnly } = {}) {
|
|
|
128
335
|
referenceOnly: Boolean(c.referenceOnly),
|
|
129
336
|
contract: c.contract,
|
|
130
337
|
})),
|
|
338
|
+
// Authoritative answers for names agents invent. Present on hits too: a
|
|
339
|
+
// `card` query that ranks BbBaseButton (its description mentions cards)
|
|
340
|
+
// still needs the picker's verdict that there is no BbCard.
|
|
341
|
+
...(notInLibrary.length > 0 ? { notInLibrary } : {}),
|
|
342
|
+
// A query that names a public TYPE gets it back as a type, so the answer
|
|
343
|
+
// to "is BbTableColumn a thing" is never an empty component list. The
|
|
344
|
+
// consumer who hit this concluded the export was undocumented and
|
|
345
|
+
// allowlisted the tag.
|
|
346
|
+
...(matchedTypes.length > 0 ? { types: matchedTypes } : {}),
|
|
347
|
+
guidance:
|
|
348
|
+
notInLibrary.length > 0
|
|
349
|
+
? 'The `notInLibrary` entries are the authoritative answer for this query — prefer them over the ranked components, and do not hand-roll what they redirect you to.'
|
|
350
|
+
: shown.length > 0
|
|
351
|
+
? 'Ranked by relevance. Confirm props with `get_component` before writing usage code.'
|
|
352
|
+
: matchedTypes.length > 0
|
|
353
|
+
? 'No component matches, but `types` does: these are TYPE exports. Import one for the value you pass to the prop named in its `usedBy` — never write it as a tag, and never allowlist it.'
|
|
354
|
+
: 'No manifest match and no picker entry. Zero results does NOT mean "not covered" — search a single plain noun (`table`, not `data table`), then read the guide `component-picker` (its "Not in this library" table is the full list of names that do not exist and what to use instead) before building anything by hand.',
|
|
131
355
|
};
|
|
132
356
|
}
|
|
133
357
|
|
|
@@ -180,6 +404,32 @@ function getComponent({ name, maxChars } = {}) {
|
|
|
180
404
|
const manifest = loadComponentsManifest();
|
|
181
405
|
const entry = manifest.components.find((c) => c.name === name);
|
|
182
406
|
if (!entry) {
|
|
407
|
+
/*
|
|
408
|
+
* A public TYPE asked for as a component. `BbTableColumn`,
|
|
409
|
+
* `BbDropdownItem`, `BbTabsItem` and `BbBreadcrumbsItem` are exports an
|
|
410
|
+
* agent meets in a props table and reasonably looks up here; answering
|
|
411
|
+
* "unknown component — try search_components" sent one consumer to the
|
|
412
|
+
* `allowComponents` allowlist instead, which silences every check on the
|
|
413
|
+
* tag. Answer the real question: what it is, and where it is used.
|
|
414
|
+
*/
|
|
415
|
+
const type = (manifest.types ?? []).find((t) => t.name === name);
|
|
416
|
+
if (type) {
|
|
417
|
+
const use = type.usedBy?.[0];
|
|
418
|
+
return {
|
|
419
|
+
found: true,
|
|
420
|
+
kind: 'type',
|
|
421
|
+
name,
|
|
422
|
+
usage: type.usage,
|
|
423
|
+
...(type.deprecated ? { deprecated: true } : {}),
|
|
424
|
+
...(type.replacedBy ? { replacedBy: type.replacedBy } : {}),
|
|
425
|
+
component: type.component,
|
|
426
|
+
usedBy: type.usedBy ?? [],
|
|
427
|
+
import: `import type { ${type.replacedBy ?? name} } from 'bitboss-ui';`,
|
|
428
|
+
hint: use
|
|
429
|
+
? `A type, not a component: it types ${possessive(use.component)} \`${use.name}\` ${use.surface}. Call get_component('${use.component}') for the contract that documents its fields.`
|
|
430
|
+
: 'A type, not a component — import it for the value you pass, never write it as a tag.',
|
|
431
|
+
};
|
|
432
|
+
}
|
|
183
433
|
return {
|
|
184
434
|
found: false,
|
|
185
435
|
name,
|
|
@@ -199,10 +449,31 @@ function getComponent({ name, maxChars } = {}) {
|
|
|
199
449
|
maxChars,
|
|
200
450
|
`The structured \`component\` field above is COMPLETE (all props/events/slots) — the cut text is guidance prose only.`
|
|
201
451
|
);
|
|
452
|
+
/*
|
|
453
|
+
* The types this component's own API names, so "what do I import to build
|
|
454
|
+
* the value for `columns`?" is answered where the question is asked. Without
|
|
455
|
+
* it an agent reads `BbTableColumn<T>[]` in the props table and has nowhere
|
|
456
|
+
* to go — one consumer concluded the export was undocumented and allowlisted
|
|
457
|
+
* the tag. Only types the component actually uses, never the whole export
|
|
458
|
+
* list: a menu is not an answer.
|
|
459
|
+
*/
|
|
460
|
+
const types = (manifest.types ?? [])
|
|
461
|
+
.filter((type) =>
|
|
462
|
+
(type.usedBy ?? []).some((use) => use.component === entry.name)
|
|
463
|
+
)
|
|
464
|
+
.filter((type) => !type.deprecated)
|
|
465
|
+
.map((type) => ({
|
|
466
|
+
name: type.name,
|
|
467
|
+
usage: type.usage,
|
|
468
|
+
usedBy: (type.usedBy ?? []).filter((use) => use.component === entry.name),
|
|
469
|
+
import: `import type { ${type.name} } from 'bitboss-ui';`,
|
|
470
|
+
}));
|
|
471
|
+
|
|
202
472
|
return {
|
|
203
473
|
found: true,
|
|
204
474
|
// Never truncated: the precision-critical surface.
|
|
205
475
|
component: entry,
|
|
476
|
+
...(types.length > 0 ? { types } : {}),
|
|
206
477
|
contractPath,
|
|
207
478
|
contractContent: content,
|
|
208
479
|
...meta,
|
|
@@ -219,16 +490,53 @@ const STYLES_CSS = join(PACKAGE_ROOT, 'dist', 'styles.css');
|
|
|
219
490
|
* every comma-part is built solely from these — `:root`, `.light`, `:root.dark`
|
|
220
491
|
* and `html.dark` are theme roots; `.bb-tooltip .bb-common-popover__bubble` is
|
|
221
492
|
* not, however many `--bb-*` it redeclares.
|
|
493
|
+
*
|
|
494
|
+
* `.bb-theme` is a theme root too: it is the island boundary the derived block
|
|
495
|
+
* re-specifies its formulas on (design-tokens.md § the CSS mechanic).
|
|
496
|
+
*/
|
|
497
|
+
const THEME_ROOT_PART = /^(?::root|html|body|\.light|\.dark|\.bb-theme)+$/;
|
|
498
|
+
|
|
499
|
+
/**
|
|
500
|
+
* Unwrap the `:where(…)` / `:is(…)` a selector list may be wrapped in. The
|
|
501
|
+
* derived-token block ships as `:where(:root,.light,.dark,.bb-theme)`, and
|
|
502
|
+
* splitting THAT on commas yields `:where(:root` and `.bb-theme)` — neither of
|
|
503
|
+
* which is a theme root, so without this every derived token is misreported as
|
|
504
|
+
* a component rebind with no value. That is not a cosmetic slip: `localRebinds`
|
|
505
|
+
* is documented to agents as "not something to copy".
|
|
222
506
|
*/
|
|
223
|
-
|
|
507
|
+
function unwrapSelectorList(selector) {
|
|
508
|
+
const trimmed = selector.trim();
|
|
509
|
+
const match = /^:(?:where|is)\((.*)\)$/s.exec(trimmed);
|
|
510
|
+
return match ? match[1] : trimmed;
|
|
511
|
+
}
|
|
512
|
+
|
|
224
513
|
function isThemeSelector(selector) {
|
|
225
|
-
return selector
|
|
514
|
+
return unwrapSelectorList(selector)
|
|
226
515
|
.split(',')
|
|
227
516
|
.every((part) =>
|
|
228
517
|
THEME_ROOT_PART.test(part.replace(/[\s>+~]+/g, '').trim())
|
|
229
518
|
);
|
|
230
519
|
}
|
|
231
520
|
|
|
521
|
+
/**
|
|
522
|
+
* A theme token is a KNOB (the consumer sets it) or DERIVED (a formula the
|
|
523
|
+
* library recomputes at every theme boundary). Setting a derived value is the
|
|
524
|
+
* documented trap — it stops tracking the knob it was computed from.
|
|
525
|
+
*
|
|
526
|
+
* The split is structural in the shipped sheet, so it needs no curated list to
|
|
527
|
+
* drift: knobs are declared on the plain scheme roots, formulas inside the
|
|
528
|
+
* `:where(…)` boundary block. A name in BOTH is a knob that TRACKS another one
|
|
529
|
+
* until pinned — and because the boundary block re-specifies it, a pin has to
|
|
530
|
+
* be repeated at every boundary it is used on, `.dark` included.
|
|
531
|
+
*/
|
|
532
|
+
const isDerivedBlock = (selector) => /^:(?:where|is)\(/.test(selector.trim());
|
|
533
|
+
const tokenKind = (inKnobBlock, inDerivedBlock) =>
|
|
534
|
+
inKnobBlock && inDerivedBlock
|
|
535
|
+
? 'knob-tracking'
|
|
536
|
+
: inDerivedBlock
|
|
537
|
+
? 'derived'
|
|
538
|
+
: 'knob';
|
|
539
|
+
|
|
232
540
|
/**
|
|
233
541
|
* Walk a stylesheet and yield every `--bb-*` declaration WITH the selector that
|
|
234
542
|
* owns it. A flat regex cannot do this: it sees a declaration but not its
|
|
@@ -281,7 +589,8 @@ function* eachTokenDeclaration(css) {
|
|
|
281
589
|
* different components and is only meaningful inside that component's scope.
|
|
282
590
|
* Serving them as one flat list would invite exactly the wrong move — an agent
|
|
283
591
|
* writing `:root { --gap: … }` and wondering why nothing changed. They are
|
|
284
|
-
* documented per component
|
|
592
|
+
* documented per component: `get_component` carries them as `cssProps`, each
|
|
593
|
+
* with the root class to set it on, its default, and what it is.
|
|
285
594
|
*
|
|
286
595
|
* WHY `dist/styles.css` AND NOT `src/assets/css/variables.css`: `src/` is not
|
|
287
596
|
* in the published package, so the source file does not exist for the consumer
|
|
@@ -302,8 +611,15 @@ function listTokens({ filter } = {}) {
|
|
|
302
611
|
const css = readFileSync(STYLES_CSS, 'utf-8');
|
|
303
612
|
const byName = new Map();
|
|
304
613
|
for (const { name, value, selector } of eachTokenDeclaration(css)) {
|
|
305
|
-
const entry = byName.get(name) ?? {
|
|
614
|
+
const entry = byName.get(name) ?? {
|
|
615
|
+
theme: [],
|
|
616
|
+
local: [],
|
|
617
|
+
knobBlock: false,
|
|
618
|
+
derivedBlock: false,
|
|
619
|
+
};
|
|
306
620
|
if (isThemeSelector(selector)) {
|
|
621
|
+
if (isDerivedBlock(selector)) entry.derivedBlock = true;
|
|
622
|
+
else entry.knobBlock = true;
|
|
307
623
|
// Light first, dark after: report both rather than let one win.
|
|
308
624
|
if (!entry.theme.includes(value)) entry.theme.push(value);
|
|
309
625
|
} else if (!entry.local.some((r) => r.selector === selector)) {
|
|
@@ -320,8 +636,9 @@ function listTokens({ filter } = {}) {
|
|
|
320
636
|
const tokens = [...byName.entries()]
|
|
321
637
|
.filter(([name]) => !needle || name.toLowerCase().includes(needle))
|
|
322
638
|
.sort(([a], [b]) => a.localeCompare(b))
|
|
323
|
-
.map(([name, { theme, local }]) => ({
|
|
639
|
+
.map(([name, { theme, local, knobBlock, derivedBlock }]) => ({
|
|
324
640
|
name,
|
|
641
|
+
kind: tokenKind(knobBlock, derivedBlock),
|
|
325
642
|
value: theme[0],
|
|
326
643
|
...(theme.length > 1 ? { themeOverrides: theme.slice(1) } : {}),
|
|
327
644
|
...(local.length > 0 ? { localRebinds: local } : {}),
|
|
@@ -333,7 +650,7 @@ function listTokens({ filter } = {}) {
|
|
|
333
650
|
hint:
|
|
334
651
|
needle && tokens.length === 0
|
|
335
652
|
? `No token name contains '${needle}'. Call list_tokens with no filter for all ${byName.size} — the names are semantic (primary/danger/panel/text/border/radius/…), not literal colours.`
|
|
336
|
-
: 'Theme tokens are set by the consumer app (e.g. on :root / .dark); `themeOverrides` is the dark-theme value. `localRebinds` is a component rebinding the token inside its own subtree — not something to copy. Component-level unprefixed tokens are documented per component; see the design-tokens guide via get_guide.',
|
|
653
|
+
: 'Theme tokens are set by the consumer app (e.g. on :root / .dark); `themeOverrides` is the dark-theme value. `localRebinds` is a component rebinding the token inside its own subtree — not something to copy. `kind` says what you may set: "knob" is yours; "derived" is a formula recomputed at every theme boundary, so setting it stops it tracking the knob it came from — set that knob instead; "knob-tracking" is a knob that follows another until you pin it, and the pin must be repeated at every boundary you use, .dark included. Component-level unprefixed tokens are documented per component; see the design-tokens guide via get_guide.',
|
|
337
654
|
};
|
|
338
655
|
}
|
|
339
656
|
|
|
@@ -469,6 +786,109 @@ function validateCode({ code } = {}) {
|
|
|
469
786
|
* becomes an `isError` result carrying `Error: <message>` — preserving the
|
|
470
787
|
* exact result shape of the previous hand-rolled dispatch.
|
|
471
788
|
*/
|
|
789
|
+
const CHANGELOG_PATH = join(AI_ROOT, 'changelog.json');
|
|
790
|
+
|
|
791
|
+
/**
|
|
792
|
+
* Order two versions on this library's line: `3.0.0-beta.21` after
|
|
793
|
+
* `3.0.0-beta.9` (numeric, not lexical — the bug every hand-rolled compare
|
|
794
|
+
* has), and any prerelease before its own stable release.
|
|
795
|
+
*/
|
|
796
|
+
function compareVersions(a, b) {
|
|
797
|
+
const parse = (v) => {
|
|
798
|
+
const [core, pre = ''] = String(v).split('-');
|
|
799
|
+
const nums = core.split('.').map((n) => Number.parseInt(n, 10) || 0);
|
|
800
|
+
const [tag = '', n = ''] = pre.split('.');
|
|
801
|
+
return { nums, tag, n: Number.parseInt(n, 10) || 0 };
|
|
802
|
+
};
|
|
803
|
+
const x = parse(a);
|
|
804
|
+
const y = parse(b);
|
|
805
|
+
for (let i = 0; i < 3; i += 1) {
|
|
806
|
+
if ((x.nums[i] ?? 0) !== (y.nums[i] ?? 0))
|
|
807
|
+
return (x.nums[i] ?? 0) - (y.nums[i] ?? 0);
|
|
808
|
+
}
|
|
809
|
+
// No prerelease tag outranks any prerelease of the same core version.
|
|
810
|
+
if (!x.tag && y.tag) return 1;
|
|
811
|
+
if (x.tag && !y.tag) return -1;
|
|
812
|
+
if (x.tag !== y.tag) return x.tag < y.tag ? -1 : 1; // alpha < beta < rc
|
|
813
|
+
return x.n - y.n;
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
/**
|
|
817
|
+
* `list_changes({ since, until })` — the breaking changes between two releases.
|
|
818
|
+
*
|
|
819
|
+
* WHY THIS TOOL EXISTS. A consumer agent on 2026-09-09 asked "what changed
|
|
820
|
+
* between beta.20 and beta.21?", found nothing in the knowledge base that could
|
|
821
|
+
* answer it, and diffed the two published tarballs by hand. The data existed
|
|
822
|
+
* (`dist/ai/changelog.json`) but no tool served it, and its rows carried no
|
|
823
|
+
* release, so even reading the file could not have answered the question. Both
|
|
824
|
+
* halves are fixed: rows are stamped with `firstReleasedIn` at build time, and
|
|
825
|
+
* this serves the slice.
|
|
826
|
+
*/
|
|
827
|
+
function listChanges({ since, until } = {}) {
|
|
828
|
+
if (!existsSync(CHANGELOG_PATH)) {
|
|
829
|
+
return {
|
|
830
|
+
error: `changelog.json not found at ${CHANGELOG_PATH} — reinstall bitboss-ui (or run \`npm run build\` when working in the library repo).`,
|
|
831
|
+
};
|
|
832
|
+
}
|
|
833
|
+
const doc = JSON.parse(readFileSync(CHANGELOG_PATH, 'utf-8'));
|
|
834
|
+
const releases = doc.releases ?? [];
|
|
835
|
+
const known = new Set(releases);
|
|
836
|
+
|
|
837
|
+
// A typo'd version must not silently return "nothing changed" — that reads
|
|
838
|
+
// as a clean upgrade and is the worst possible wrong answer here.
|
|
839
|
+
for (const [label, value] of [
|
|
840
|
+
['since', since],
|
|
841
|
+
['until', until],
|
|
842
|
+
]) {
|
|
843
|
+
if (value != null && !known.has(String(value))) {
|
|
844
|
+
return {
|
|
845
|
+
error: `Unknown ${label} version '${value}'.`,
|
|
846
|
+
knownReleases: releases,
|
|
847
|
+
hint: 'Pass a version exactly as listed in knownReleases, or omit both to get every break in the v2 → v3 upgrade.',
|
|
848
|
+
};
|
|
849
|
+
}
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
const all = doc.breaking ?? [];
|
|
853
|
+
// No range asked for: the whole v2 → v3 set, which is what the file has
|
|
854
|
+
// always meant.
|
|
855
|
+
if (since == null && until == null) {
|
|
856
|
+
return {
|
|
857
|
+
version: doc.version,
|
|
858
|
+
upgrade: doc.upgrade,
|
|
859
|
+
guide: doc.guide,
|
|
860
|
+
releases,
|
|
861
|
+
summary: doc.summary,
|
|
862
|
+
count: all.length,
|
|
863
|
+
breaking: all,
|
|
864
|
+
hint: 'Narrow to one upgrade hop with list_changes({ since: "<your current version>" }) — that answers "what breaks if I bump".',
|
|
865
|
+
};
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
const inRange = all.filter((entry) => {
|
|
869
|
+
const at = entry.firstReleasedIn;
|
|
870
|
+
// Unreleased rows belong to the future: they ship in whatever comes
|
|
871
|
+
// next, so they count only when the caller left `until` open.
|
|
872
|
+
if (at == null) return until == null;
|
|
873
|
+
if (since != null && compareVersions(at, String(since)) <= 0) return false;
|
|
874
|
+
if (until != null && compareVersions(at, String(until)) > 0) return false;
|
|
875
|
+
return true;
|
|
876
|
+
});
|
|
877
|
+
|
|
878
|
+
return {
|
|
879
|
+
version: doc.version,
|
|
880
|
+
since: since ?? null,
|
|
881
|
+
until: until ?? doc.version,
|
|
882
|
+
count: inRange.length,
|
|
883
|
+
breaking: inRange,
|
|
884
|
+
guide: doc.guide,
|
|
885
|
+
hint:
|
|
886
|
+
inRange.length === 0
|
|
887
|
+
? 'No breaking changes recorded in that range — features and fixes are deliberately not tracked here, so an empty result means nothing BREAKS, not that nothing changed.'
|
|
888
|
+
: 'Each entry names the component and the new spelling; `guide` is the migration page with the full explanation.',
|
|
889
|
+
};
|
|
890
|
+
}
|
|
891
|
+
|
|
472
892
|
function toolCallback(fn) {
|
|
473
893
|
return (args) => {
|
|
474
894
|
try {
|
|
@@ -500,7 +920,7 @@ function buildServer() {
|
|
|
500
920
|
'search_components',
|
|
501
921
|
{
|
|
502
922
|
description:
|
|
503
|
-
'Search the bitboss-ui component manifest by name and description, ranked by relevance (exact/prefix name matches first, description matches last). Returns consumer-API components only by default. Use this to find the right Bb* component before writing usage code.',
|
|
923
|
+
'Search the bitboss-ui component manifest by name and description, ranked by relevance (exact/prefix name matches first, description matches last). Multi-word queries are matched per word, so "data table" finds BbTable. Also returns `notInLibrary`: the component picker\'s authoritative verdicts for names agents commonly invent — either a redirect ("BbDrawer" is BbOffCanvas) or a confirmation that it does not exist and what to do instead. Returns consumer-API components only by default. Use this to find the right Bb* component before writing usage code. An empty result does NOT mean the need is uncovered — read the `component-picker` guide before hand-rolling anything.',
|
|
504
924
|
inputSchema: {
|
|
505
925
|
query: z
|
|
506
926
|
.string()
|
|
@@ -517,7 +937,7 @@ function buildServer() {
|
|
|
517
937
|
.boolean()
|
|
518
938
|
.optional()
|
|
519
939
|
.describe(
|
|
520
|
-
'Include reference-only internal components (
|
|
940
|
+
'Include reference-only internal components (Common*, listbox internals). Default false — these are not consumer API and should not be recommended. BbBaseButton and the BbBase*Icon glyphs are consumer API and are always included.'
|
|
521
941
|
),
|
|
522
942
|
},
|
|
523
943
|
},
|
|
@@ -571,6 +991,29 @@ function buildServer() {
|
|
|
571
991
|
toolCallback(listGuides)
|
|
572
992
|
);
|
|
573
993
|
|
|
994
|
+
server.registerTool(
|
|
995
|
+
'list_changes',
|
|
996
|
+
{
|
|
997
|
+
description:
|
|
998
|
+
'Breaking changes between two bitboss-ui releases — what breaks if you bump. Call with since=<the version you are on> before upgrading. Omit both arguments for every break in the v2 → v3 upgrade. Only BREAKING changes are tracked; features and fixes are not.',
|
|
999
|
+
inputSchema: {
|
|
1000
|
+
since: z
|
|
1001
|
+
.string()
|
|
1002
|
+
.optional()
|
|
1003
|
+
.describe(
|
|
1004
|
+
"Exclusive lower bound — the version you are currently on, e.g. '3.0.0-beta.20'. Its own breaks are excluded; you already have them."
|
|
1005
|
+
),
|
|
1006
|
+
until: z
|
|
1007
|
+
.string()
|
|
1008
|
+
.optional()
|
|
1009
|
+
.describe(
|
|
1010
|
+
'Inclusive upper bound (default: the installed version). Unreleased breaks are included only when this is omitted.'
|
|
1011
|
+
),
|
|
1012
|
+
},
|
|
1013
|
+
},
|
|
1014
|
+
toolCallback(listChanges)
|
|
1015
|
+
);
|
|
1016
|
+
|
|
574
1017
|
server.registerTool(
|
|
575
1018
|
'get_guide',
|
|
576
1019
|
{
|
|
@@ -659,8 +1102,21 @@ export async function main() {
|
|
|
659
1102
|
const server = buildServer();
|
|
660
1103
|
const transport = new StdioServerTransport();
|
|
661
1104
|
await server.connect(transport);
|
|
1105
|
+
// Settle on stdin's end as well as the transport's close. `onclose` does
|
|
1106
|
+
// not fire when the host simply closes the pipe, so awaiting it alone left
|
|
1107
|
+
// the caller's top-level `await main()` pending at exit and Node printed
|
|
1108
|
+
// "Detected unsettled top-level await" on every clean shutdown (2026-09-09).
|
|
1109
|
+
// `once` on both, and idempotent resolve, so whichever arrives first wins.
|
|
662
1110
|
return new Promise((resolve) => {
|
|
663
|
-
|
|
1111
|
+
let done = false;
|
|
1112
|
+
const settle = () => {
|
|
1113
|
+
if (done) return;
|
|
1114
|
+
done = true;
|
|
1115
|
+
resolve();
|
|
1116
|
+
};
|
|
1117
|
+
transport.onclose = settle;
|
|
1118
|
+
process.stdin.once('end', settle);
|
|
1119
|
+
process.stdin.once('close', settle);
|
|
664
1120
|
});
|
|
665
1121
|
}
|
|
666
1122
|
|