bitboss-ui 3.0.0-beta.2 → 3.0.0-beta.21
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 +72 -33
- package/dist/ai/BbAccordion.md +3 -3
- package/dist/ai/BbAlert.md +9 -5
- package/dist/ai/BbAsterisk.md +17 -0
- package/dist/ai/BbAvatar.md +12 -3
- package/dist/ai/BbBadge.md +15 -10
- package/dist/ai/BbBadgeButton.md +16 -16
- package/dist/ai/BbBaseButton.md +16 -16
- package/dist/ai/BbBaseCheckbox.md +8 -8
- package/dist/ai/BbBaseCheckboxGroup.md +13 -13
- package/dist/ai/BbBaseCheckboxIcon.md +26 -9
- package/dist/ai/BbBaseColorInput.md +11 -11
- package/dist/ai/BbBaseDatePicker.md +6 -6
- package/dist/ai/BbBaseDatePickerInput.md +15 -15
- package/dist/ai/BbBaseInputContainer.md +12 -12
- package/dist/ai/BbBaseNumberInput.md +8 -8
- package/dist/ai/BbBaseRadio.md +5 -5
- package/dist/ai/BbBaseRadioGroup.md +7 -7
- package/dist/ai/BbBaseRadioIcon.md +25 -9
- package/dist/ai/BbBaseRating.md +5 -5
- package/dist/ai/BbBaseSelect.md +22 -21
- package/dist/ai/BbBaseSlider.md +9 -9
- package/dist/ai/BbBaseSwitch.md +8 -8
- package/dist/ai/BbBaseSwitchGroup.md +13 -13
- package/dist/ai/BbBaseSwitchIcon.md +28 -10
- package/dist/ai/BbBaseTag.md +10 -10
- package/dist/ai/BbBaseTextInput.md +9 -9
- package/dist/ai/BbBaseTextarea.md +9 -9
- package/dist/ai/BbBaseTimePickerInput.md +13 -13
- package/dist/ai/BbBreadcrumbs.md +2 -2
- package/dist/ai/BbButton.md +15 -15
- package/dist/ai/BbCheckbox.md +18 -17
- package/dist/ai/BbCheckboxGroup.md +15 -14
- package/dist/ai/BbCollapsible.md +11 -9
- package/dist/ai/BbColorInput.md +15 -15
- package/dist/ai/BbColorPalette.md +12 -6
- package/dist/ai/BbConfirm.md +12 -5
- package/dist/ai/BbDatePicker.md +13 -13
- package/dist/ai/BbDatePickerInput.md +20 -20
- package/dist/ai/BbDialog.md +78 -12
- package/dist/ai/BbDropdown.md +132 -22
- package/dist/ai/BbDropdownButton.md +12 -12
- package/dist/ai/BbDropdownGroup.md +1 -1
- package/dist/ai/BbDropzone.md +4 -4
- package/dist/ai/BbForm.md +49 -14
- package/dist/ai/BbIcon.md +6 -0
- package/dist/ai/BbIndicator.md +5 -5
- package/dist/ai/BbNumberInput.md +11 -11
- package/dist/ai/BbOffCanvas.md +90 -20
- package/dist/ai/BbPagination.md +3 -3
- package/dist/ai/BbPopover.md +32 -17
- package/dist/ai/BbProgress.md +7 -4
- package/dist/ai/BbRadio.md +16 -15
- package/dist/ai/BbRadioGroup.md +20 -17
- package/dist/ai/BbRating.md +11 -11
- package/dist/ai/BbSelect.md +138 -37
- package/dist/ai/BbSelectPopover.md +40 -41
- package/dist/ai/BbSlider.md +37 -22
- package/dist/ai/BbSmoothHeight.md +1 -1
- package/dist/ai/BbSwitch.md +25 -10
- package/dist/ai/BbSwitchGroup.md +17 -14
- package/dist/ai/BbTable.md +920 -109
- package/dist/ai/BbTabs.md +28 -14
- package/dist/ai/BbTabsList.md +1 -1
- package/dist/ai/BbTabsPanes.md +1 -1
- package/dist/ai/BbTabsRoot.md +10 -10
- package/dist/ai/BbTag.md +14 -14
- package/dist/ai/BbTextInput.md +16 -15
- package/dist/ai/BbTextarea.md +13 -13
- package/dist/ai/BbTimePicker.md +10 -10
- package/dist/ai/BbTimePickerInput.md +17 -17
- package/dist/ai/BbToast.md +1 -1
- package/dist/ai/BbToastPortal.md +1 -1
- package/dist/ai/BbTooltip.md +12 -10
- package/dist/ai/BbTree.md +1 -1
- package/dist/ai/ChipsBox.md +1 -1
- package/dist/ai/CommonInputWrapper.md +10 -10
- package/dist/ai/CommonPopover.md +6 -6
- package/dist/ai/FlatListBox.md +5 -5
- package/dist/ai/GroupedListBox.md +5 -5
- package/dist/ai/ListBox.md +4 -4
- package/dist/ai/OptionsContainer.md +4 -4
- package/dist/ai/changelog.json +128 -2
- package/dist/ai/components.json +917 -100
- package/dist/ai/composables/useBbConfig.md +72 -11
- package/dist/ai/composables/useConfirm.md +5 -3
- package/dist/ai/guides/ai-router.md +9 -4
- package/dist/ai/guides/component-picker.md +18 -18
- package/dist/ai/guides/design-language.md +14 -14
- package/dist/ai/guides/design-tokens.md +25 -18
- package/dist/ai/guides/fetch-items-playbook.md +1 -1
- package/dist/ai/guides/icons-policy.md +11 -5
- package/dist/ai/guides/installation-and-plugin-setup.md +85 -23
- package/dist/ai/guides/migration/components/bb-checkbox-group.md +30 -0
- package/dist/ai/guides/migration/components/bb-checkbox.md +37 -3
- package/dist/ai/guides/migration/components/bb-collapsible.md +5 -5
- package/dist/ai/guides/migration/components/bb-dialog.md +62 -34
- package/dist/ai/guides/migration/components/bb-offcanvas.md +29 -13
- package/dist/ai/guides/migration/components/bb-rating.md +8 -2
- package/dist/ai/guides/migration/components/bb-select.md +5 -2
- package/dist/ai/guides/migration/components/bb-table.md +560 -28
- package/dist/ai/guides/migration/components/bb-text-input.md +6 -6
- package/dist/ai/guides/migration/v2-to-v3.md +260 -89
- package/dist/ai/guides/ssr-prefill.md +120 -0
- package/dist/ai/index.md +10 -9
- package/dist/ai/recipes/inertia/approvals-inbox.md +0 -1
- package/dist/ai/recipes/inertia/inline-edit-workspace.md +0 -1
- package/dist/ai/recipes/inertia/layout-scaffold.md +5 -1
- package/dist/ai/recipes/inertia/ownership-atlas.md +49 -29
- package/dist/ai/recipes/inertia/record-form.md +0 -1
- package/dist/ai/recipes/inertia/records-workspace.md +26 -8
- package/dist/ai/recipes/inertia/upload-center.md +0 -1
- package/dist/ai/recipes/nuxt/approvals-inbox.md +0 -1
- package/dist/ai/recipes/nuxt/inline-edit-workspace.md +0 -1
- package/dist/ai/recipes/nuxt/layout-scaffold.md +5 -1
- package/dist/ai/recipes/nuxt/record-form.md +0 -1
- package/dist/ai/recipes/nuxt/records-workspace.md +26 -8
- package/dist/ai/recipes/nuxt/upload-center.md +0 -1
- package/dist/ai/recipes/vue/approvals-inbox.md +0 -1
- package/dist/ai/recipes/vue/inline-edit-workspace.md +0 -1
- package/dist/ai/recipes/vue/layout-scaffold.md +5 -1
- package/dist/ai/recipes/vue/records-workspace.md +26 -8
- package/dist/ai/recipes/vue/upload-center.md +0 -1
- package/dist/ai/source/BbAlert.md +60 -2
- package/dist/ai/source/BbAvatar.md +3 -3
- package/dist/ai/source/BbBadge.md +60 -15
- package/dist/ai/source/BbBadgeButton.md +8 -2
- package/dist/ai/source/BbBaseButton.md +3 -1
- package/dist/ai/source/BbBaseCheckboxGroup.md +6 -2
- package/dist/ai/source/BbBaseDatePicker.md +3 -1
- package/dist/ai/source/BbBaseDatePickerInput.md +5 -1
- package/dist/ai/source/BbBaseInputContainer.md +52 -1
- package/dist/ai/source/BbBaseRadioGroup.md +4 -0
- package/dist/ai/source/BbBaseRating.md +3 -1
- package/dist/ai/source/BbBaseSelect.md +71 -16
- package/dist/ai/source/BbBaseSwitchGroup.md +4 -0
- package/dist/ai/source/BbBaseTimePickerInput.md +5 -1
- package/dist/ai/source/BbBreadcrumbs.md +31 -0
- package/dist/ai/source/BbButton.md +51 -24
- package/dist/ai/source/BbCheckbox.md +15 -1
- package/dist/ai/source/BbCheckboxGroup.md +2 -1
- package/dist/ai/source/BbCollapsible.md +7 -1
- package/dist/ai/source/BbColorInput.md +3 -4
- package/dist/ai/source/BbColorPalette.md +3 -4
- package/dist/ai/source/BbDatePicker.md +5 -1
- package/dist/ai/source/BbDatePickerInput.md +5 -1
- package/dist/ai/source/BbDialog.md +175 -19
- package/dist/ai/source/BbDropdown.md +376 -69
- package/dist/ai/source/BbDropdownGroup.md +330 -59
- package/dist/ai/source/BbForm.md +93 -5
- package/dist/ai/source/BbIcon.md +46 -36
- package/dist/ai/source/BbNumberInput.md +3 -4
- package/dist/ai/source/BbOffCanvas.md +474 -194
- package/dist/ai/source/BbPopover.md +24 -17
- package/dist/ai/source/BbProgress.md +2 -2
- package/dist/ai/source/BbRadio.md +15 -1
- package/dist/ai/source/BbRadioGroup.md +3 -1
- package/dist/ai/source/BbSelect.md +50 -2
- package/dist/ai/source/BbSelectPopover.md +171 -23
- package/dist/ai/source/BbSlider.md +3 -4
- package/dist/ai/source/BbSwitch.md +15 -1
- package/dist/ai/source/BbSwitchGroup.md +8 -5
- package/dist/ai/source/BbTable.md +5092 -1446
- package/dist/ai/source/BbTabs.md +6 -7
- package/dist/ai/source/BbTabsList.md +6 -7
- package/dist/ai/source/BbTabsPanes.md +6 -7
- package/dist/ai/source/BbTabsRoot.md +6 -7
- package/dist/ai/source/BbTag.md +3 -4
- package/dist/ai/source/BbTextInput.md +3 -4
- package/dist/ai/source/BbTextarea.md +3 -4
- package/dist/ai/source/BbTimePicker.md +4 -1
- package/dist/ai/source/BbTimePickerInput.md +5 -1
- package/dist/ai/source/BbToast.md +3 -1
- package/dist/ai/source/BbTooltip.md +5 -1
- package/dist/ai/source/CommonInputWrapper.md +4 -0
- package/dist/ai/source/CommonPopover.md +6 -0
- package/dist/ai/source/FlatListBox.md +11 -5
- package/dist/ai/source/GroupedListBox.md +7 -5
- package/dist/components/BbAlert/BbAlert.vue_vue_type_script_setup_true_lang.js +4 -4
- package/dist/components/BbAlert/types.d.ts +10 -1
- package/dist/components/BbAvatar/BbAvatar.vue.d.ts +1 -1
- package/dist/components/BbAvatar/BbAvatar.vue_vue_type_script_setup_true_lang.js +33 -33
- 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 +36 -15
- package/dist/components/BbBadge/badgeButtonContext.d.ts +21 -8
- package/dist/components/BbBadge/types.d.ts +8 -2
- package/dist/components/BbBaseButton/BbBaseButton.vue_vue_type_script_setup_true_lang.js +47 -47
- package/dist/components/BbBaseButton/RouterComponent.vue_vue_type_script_setup_true_lang.js +14 -14
- package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue_vue_type_script_setup_true_lang.js +30 -28
- package/dist/components/BbBaseCheckboxGroup/types.d.ts +2 -2
- package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue_vue_type_script_setup_true_lang.js +167 -167
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue.d.ts +9 -9
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue_vue_type_script_setup_true_lang.js +78 -78
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue_vue_type_script_setup_true_lang.js +64 -64
- package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue.d.ts +1 -1
- package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue_vue_type_script_setup_true_lang.js +138 -138
- package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue_vue_type_script_setup_true_lang.js +24 -22
- package/dist/components/BbBaseRating/BbBaseRating.vue_vue_type_script_setup_true_lang.js +40 -40
- package/dist/components/BbBaseSelect/BbBaseSelect.vue_vue_type_script_setup_true_lang.js +74 -65
- package/dist/components/BbBaseSelect/types.d.ts +22 -0
- package/dist/components/BbBaseSlider/BbBaseSlider.vue_vue_type_script_setup_true_lang.js +5 -5
- package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue_vue_type_script_setup_true_lang.js +30 -28
- package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue.d.ts +1 -1
- package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue_vue_type_script_setup_true_lang.js +104 -104
- package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue_vue_type_script_setup_true_lang.js +35 -35
- package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +85 -81
- package/dist/components/BbCheckboxGroup/types.d.ts +2 -1
- package/dist/components/BbCollapsible/types.d.ts +7 -1
- package/dist/components/BbColorInput/BbColorInput.vue.d.ts +1 -1
- package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +18 -18
- package/dist/components/BbColorPalette/BbColorPalette.vue.d.ts +2 -2
- package/dist/components/BbColorPalette/BbColorPalette.vue_vue_type_script_setup_true_lang.js +50 -50
- package/dist/components/BbConfirm/BbConfirm.vue_vue_type_script_setup_true_lang.js +17 -17
- package/dist/components/BbDatePicker/BbDatePicker.vue.d.ts +1 -1
- package/dist/components/BbDatePicker/BbDatePicker.vue_vue_type_script_setup_true_lang.js +100 -100
- package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +21 -21
- package/dist/components/BbDialog/BbDialog.vue.d.ts +1 -1
- package/dist/components/BbDialog/BbDialog.vue_vue_type_script_setup_true_lang.js +133 -107
- package/dist/components/BbDialog/types.d.ts +29 -2
- package/dist/components/BbDropdown/AdaptiveDropdown.vue.d.ts +2 -0
- package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +99 -100
- package/dist/components/BbDropdown/BbDropdown.vue.d.ts +2 -2
- package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +208 -201
- package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +225 -208
- package/dist/components/BbDropdown/DropdownPipelineResolver.vue_vue_type_script_setup_true_lang.js +21 -21
- package/dist/components/BbDropdown/types.d.ts +20 -5
- package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +5 -5
- package/dist/components/BbIcon/BbIcon.vue_vue_type_script_setup_true_lang.js +46 -46
- package/dist/components/BbIcon/iconCache.d.ts +33 -0
- package/dist/components/BbIcon/iconCache.js +17 -0
- package/dist/components/BbNumberInput/BbNumberInput.vue.d.ts +1 -1
- package/dist/components/BbNumberInput/BbNumberInput.vue_vue_type_script_setup_true_lang.js +15 -15
- package/dist/components/BbOffCanvas/BbOffCanvas.vue.d.ts +1 -1
- package/dist/components/BbOffCanvas/BbOffCanvas.vue_vue_type_script_setup_true_lang.js +254 -208
- package/dist/components/BbOffCanvas/types.d.ts +30 -5
- package/dist/components/BbPagination/BbPagination.vue.d.ts +1 -1
- package/dist/components/BbPopover/BbPopover.vue.d.ts +2 -2
- package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +149 -146
- package/dist/components/BbPopover/types.d.ts +3 -2
- package/dist/components/BbRadioGroup/types.d.ts +3 -1
- package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +27 -23
- package/dist/components/BbSelect/types.d.ts +32 -0
- package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +221 -213
- package/dist/components/BbSlider/BbSlider.vue.d.ts +1 -1
- package/dist/components/BbSlider/BbSlider.vue_vue_type_script_setup_true_lang.js +20 -20
- package/dist/components/BbTable/BbTable.vue.d.ts +10 -4
- package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +1433 -600
- package/dist/components/BbTable/BbTableDataRow.d.ts +162 -0
- package/dist/components/BbTable/BbTableDataRow.js +136 -0
- package/dist/components/BbTable/BbTableExpandRow.d.ts +73 -0
- package/dist/components/BbTable/BbTableExpandRow.js +52 -0
- package/dist/components/BbTable/types.d.ts +324 -111
- package/dist/components/BbTable/utils.d.ts +92 -4
- package/dist/components/BbTable/utils.js +71 -36
- package/dist/components/BbTabs/types.d.ts +0 -8
- package/dist/components/BbTag/BbTag.vue.d.ts +1 -1
- package/dist/components/BbTag/BbTag.vue_vue_type_script_setup_true_lang.js +18 -18
- package/dist/components/BbTextInput/BbTextInput.vue.d.ts +1 -1
- package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +18 -18
- package/dist/components/BbTextarea/BbTextarea.vue.d.ts +1 -1
- package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +54 -54
- package/dist/components/BbTimePicker/BbTimePicker.vue.d.ts +1 -1
- package/dist/components/BbTimePicker/BbTimePicker.vue_vue_type_script_setup_true_lang.js +80 -80
- package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +61 -61
- package/dist/components/BbToast/BbToast.vue_vue_type_script_setup_true_lang.js +17 -17
- package/dist/components/BbToast/BbToastMessage.vue_vue_type_script_setup_true_lang.js +13 -13
- package/dist/components/BbTooltip/types.d.ts +5 -1
- package/dist/components/ChipsBox/ChipsBox.vue_vue_type_script_setup_true_lang.js +17 -17
- package/dist/components/ClearableButton/ClearableButton.vue_vue_type_script_setup_true_lang.js +5 -5
- package/dist/components/CommonPopover/CommonPopover.vue_vue_type_script_setup_true_lang.js +2 -1
- package/dist/components/FlatListBox/FlatListBox.vue_vue_type_script_setup_true_lang.js +83 -83
- package/dist/components/GroupedListBox/GroupedListBox.vue_vue_type_script_setup_true_lang.js +56 -56
- package/dist/composables/useBaseOptions.js +30 -20
- package/dist/composables/useBbConfig.d.ts +27 -6
- package/dist/composables/useBbConfig.js +8 -2
- package/dist/composables/useConfig.d.ts +59 -0
- package/dist/composables/useConfig.js +9 -0
- 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/usePrefill.d.ts +21 -2
- package/dist/composables/usePrefill.js +25 -19
- 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.js +5 -5
- package/dist/deprecation/ai-deprecations.json.d.ts +121 -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 +63 -23
- package/dist/i18n/locales/cs.json +4 -1
- package/dist/i18n/locales/da.json +4 -1
- package/dist/i18n/locales/de.json +4 -1
- package/dist/i18n/locales/el.json +4 -1
- package/dist/i18n/locales/en.json +4 -1
- package/dist/i18n/locales/es.json +4 -1
- package/dist/i18n/locales/fi.json +4 -1
- package/dist/i18n/locales/fr.json +4 -1
- package/dist/i18n/locales/hu.json +4 -1
- package/dist/i18n/locales/it.json +4 -1
- package/dist/i18n/locales/ja.json +4 -1
- package/dist/i18n/locales/ko.json +4 -1
- package/dist/i18n/locales/nb.json +4 -1
- package/dist/i18n/locales/nl.json +4 -1
- package/dist/i18n/locales/pl.json +4 -1
- package/dist/i18n/locales/pt.json +4 -1
- package/dist/i18n/locales/ro.json +4 -1
- package/dist/i18n/locales/ru.json +4 -1
- package/dist/i18n/locales/sv.json +4 -1
- package/dist/i18n/locales/tr.json +4 -1
- package/dist/i18n/locales/uk.json +4 -1
- package/dist/i18n/locales/zh-cn.json +4 -1
- package/dist/index.d.ts +7 -2
- package/dist/index.js +69 -67
- package/dist/llms-full.txt +3997 -1458
- package/dist/llms-medium.txt +140 -73
- package/dist/llms.txt +7 -6
- package/dist/locale-blueprint.json +4 -1
- package/dist/nuxt-auto-imports.d.ts +100 -0
- package/dist/nuxt-auto-imports.js +55 -0
- package/dist/nuxt-module.d.ts +22 -1
- package/dist/nuxt.js +22 -8
- package/dist/plugin.d.ts +10 -1
- package/dist/plugin.js +20 -19
- package/dist/runtime/nuxt-plugin.js +28 -21
- package/dist/styles.css +1 -1
- package/dist/utilities/misc/listboxMetrics.d.ts +3 -3
- package/dist/utilities/misc/listboxMetrics.js +2 -2
- package/dist/utilities/misc/ssrStateInjectionKey.d.ts +42 -0
- package/dist/utilities/misc/ssrStateInjectionKey.js +4 -0
- package/dist/validated/BbForm.vue_vue_type_script_setup_true_lang.js +45 -27
- package/dist/validated/BbSelect.vue.d.ts +2 -0
- package/dist/validated/BbSelect.vue_vue_type_script_setup_true_lang.js +1 -0
- package/dist/validated/useValidatedField.js +25 -23
- package/dist/vite.js +7 -3
- package/llms.txt +8 -7
- package/package.json +2 -2
- package/scripts/lib/eslint-plugin.d.ts +19 -1
- package/scripts/lib/eslint-plugin.mjs +155 -14
- package/scripts/lib/html-attributes.mjs +91 -0
- package/scripts/lib/validate-bb-markup.mjs +59 -11
- 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
|
@@ -30,12 +30,12 @@
|
|
|
30
30
|
* needs no viewport clause of its own.)
|
|
31
31
|
*/
|
|
32
32
|
/** Height of one option row, in px. */
|
|
33
|
-
export declare const listboxOptionHeight: (touch: boolean, compact: boolean) =>
|
|
33
|
+
export declare const listboxOptionHeight: (touch: boolean, compact: boolean) => 36 | 44 | 24 | 28;
|
|
34
34
|
/** Height of a group heading row, in px (grouped box only). */
|
|
35
|
-
export declare const listboxHeaderHeight: (touch: boolean, compact: boolean) => 32 |
|
|
35
|
+
export declare const listboxHeaderHeight: (touch: boolean, compact: boolean) => 32 | 36 | 24;
|
|
36
36
|
/**
|
|
37
37
|
* Option label size, as a CSS length. `undefined` means "leave the stylesheet's
|
|
38
38
|
* own value alone" — the desktop size stays declared in CSS, next to the rest of
|
|
39
39
|
* the option styling, and only the touch override travels through the var.
|
|
40
40
|
*/
|
|
41
|
-
export declare const listboxOptionFontSize: (touch: boolean) => "
|
|
41
|
+
export declare const listboxOptionFontSize: (touch: boolean) => "16px" | undefined;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
//#region src/utilities/misc/listboxMetrics.ts
|
|
2
|
-
var e = (e, t) => e ? t ? 36 : 44 : t ? 24 : 28, t = (e, t) => e ? t ? 32 : 36 : t ? 24 : 32, n = (e) => e ?
|
|
2
|
+
var e = (e, t) => e ? t ? 36 : 44 : t ? 24 : 28, t = (e, t) => e ? t ? 32 : 36 : t ? 24 : 32, n = "16px", r = (e) => e ? n : void 0;
|
|
3
3
|
//#endregion
|
|
4
|
-
export { t as listboxHeaderHeight,
|
|
4
|
+
export { t as listboxHeaderHeight, r as listboxOptionFontSize, e as listboxOptionHeight };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { InjectionKey } from 'vue';
|
|
2
|
+
/**
|
|
3
|
+
* How the library moves a value it resolved during SSR across to the client.
|
|
4
|
+
*
|
|
5
|
+
* Deliberately two methods and no framework: the library cannot import from
|
|
6
|
+
* `#app`, `@inertiajs/*` or any other host, so the host provides the bucket and
|
|
7
|
+
* the library only reads and writes it. `bitboss-ui/nuxt`'s runtime plugin
|
|
8
|
+
* ships one backed by `nuxtApp.payload`; anything else (plain Vue SSR, Inertia
|
|
9
|
+
* SSR) can provide its own with the same two methods, or provide nothing —
|
|
10
|
+
* "nothing" is a supported, mismatch-free configuration, not a degraded one.
|
|
11
|
+
*
|
|
12
|
+
* Contract:
|
|
13
|
+
* - `set` is called on the SERVER only, during `onServerPrefetch`, before the
|
|
14
|
+
* component renders.
|
|
15
|
+
* - `get` is called on the CLIENT only, during setup of the same component,
|
|
16
|
+
* before its first (hydration) render.
|
|
17
|
+
* - keys are opaque strings, unique per component instance.
|
|
18
|
+
* - values must survive the host's payload serializer. Under Nuxt that is
|
|
19
|
+
* devalue: plain objects, arrays, dates, maps, sets — not functions or
|
|
20
|
+
* class instances. See `useItemsGetter`'s dev guard.
|
|
21
|
+
*/
|
|
22
|
+
export type SsrStateAdapter = {
|
|
23
|
+
get<T>(key: string): T | undefined;
|
|
24
|
+
set<T>(key: string, value: T): void;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Provide an `SsrStateAdapter` under this key — at the app level
|
|
28
|
+
* (`app.provide(...)`), so every component reaches the same bucket.
|
|
29
|
+
*
|
|
30
|
+
* Same shape as `ICONS_INJECTION_KEY`, including the `Symbol.for`: under Nuxt
|
|
31
|
+
* the runtime plugin is loaded raw while the components come from Vite's
|
|
32
|
+
* pre-bundled copy, so the library is instantiated TWICE on the client and a
|
|
33
|
+
* plain `Symbol()` would be two different keys — the provide would land under
|
|
34
|
+
* one and every `inject` would miss under the other. That failure is quiet and
|
|
35
|
+
* looks exactly like "the host installed no adapter", which is a supported
|
|
36
|
+
* state, so nothing would have thrown; the ids simply drifted.
|
|
37
|
+
*
|
|
38
|
+
* No default value on purpose. Absent injection is meaningful (see
|
|
39
|
+
* `useSsrState`) — a no-op adapter would be indistinguishable from a real one,
|
|
40
|
+
* and the whole point is that the library must be able to tell.
|
|
41
|
+
*/
|
|
42
|
+
export declare const SSR_STATE_INJECTION_KEY: InjectionKey<SsrStateAdapter>;
|
|
@@ -1,42 +1,60 @@
|
|
|
1
1
|
import { useBbFormContextHost as e } from "../composables/useBbFormContext.js";
|
|
2
|
-
import { createElementBlock as t, defineComponent as n,
|
|
3
|
-
import { useForm as
|
|
2
|
+
import { createElementBlock as t, defineComponent as n, getCurrentInstance as r, mergeProps as i, openBlock as a, renderSlot as o, unref as s, useTemplateRef as c } from "vue";
|
|
3
|
+
import { useForm as l } from "vee-validate";
|
|
4
4
|
//#region src/validated/BbForm.vue?vue&type=script&setup=true&lang.ts
|
|
5
|
-
var
|
|
5
|
+
var u = /*@__PURE__*/ n({
|
|
6
6
|
__name: "BbForm",
|
|
7
7
|
props: { id: {} },
|
|
8
8
|
emits: ["submit"],
|
|
9
|
-
setup(n, { expose:
|
|
10
|
-
let d = n,
|
|
9
|
+
setup(n, { expose: u }) {
|
|
10
|
+
let d = n, { handleSubmit: f, isSubmitting: p, submitCount: m, resetForm: h, meta: g, values: _, errors: v, validate: y } = l(), b = r(), x = !1, S = (e) => {
|
|
11
|
+
let t = b?.appContext.config.errorHandler;
|
|
12
|
+
t ? t(e, b?.proxy ?? null, "component event handler") : console.error(e);
|
|
13
|
+
}, C = (e) => typeof e?.then == "function", w = (e) => {
|
|
14
|
+
let t = b?.vnode.props, n = (e) => Array.isArray(e) ? e : typeof e == "function" ? [e] : [], r = n(t?.onSubmit);
|
|
15
|
+
if (!x) {
|
|
16
|
+
let e = n(t?.onSubmitOnce);
|
|
17
|
+
e.length && (x = !0, r.push(...e));
|
|
18
|
+
}
|
|
19
|
+
if (!r.length) return;
|
|
20
|
+
let i = [];
|
|
21
|
+
for (let t of r) try {
|
|
22
|
+
let n = t(e);
|
|
23
|
+
C(n) && i.push(Promise.resolve(n).catch(S));
|
|
24
|
+
} catch (e) {
|
|
25
|
+
S(e);
|
|
26
|
+
}
|
|
27
|
+
return i.length ? Promise.all(i) : void 0;
|
|
28
|
+
}, T = f((e) => w(e)), E = c("formEl");
|
|
11
29
|
return e(() => d.id, {
|
|
12
30
|
state: () => ({
|
|
13
|
-
valid:
|
|
14
|
-
dirty:
|
|
15
|
-
touched:
|
|
16
|
-
pending:
|
|
17
|
-
submitting:
|
|
18
|
-
submitCount:
|
|
19
|
-
values: { ...
|
|
20
|
-
errors: { ...
|
|
31
|
+
valid: g.value.valid,
|
|
32
|
+
dirty: g.value.dirty,
|
|
33
|
+
touched: g.value.touched,
|
|
34
|
+
pending: g.value.pending,
|
|
35
|
+
submitting: p.value,
|
|
36
|
+
submitCount: m.value,
|
|
37
|
+
values: { ..._ },
|
|
38
|
+
errors: { ...v.value }
|
|
21
39
|
}),
|
|
22
40
|
actions: {
|
|
23
|
-
submit: () => void
|
|
24
|
-
reset: () =>
|
|
25
|
-
validate: async () => (await
|
|
41
|
+
submit: () => void T(),
|
|
42
|
+
reset: () => h(),
|
|
43
|
+
validate: async () => (await y()).valid
|
|
26
44
|
}
|
|
27
|
-
}),
|
|
45
|
+
}), u({ $el: E }), (e, n) => (a(), t("form", {
|
|
28
46
|
ref_key: "formEl",
|
|
29
|
-
ref:
|
|
47
|
+
ref: E,
|
|
30
48
|
novalidate: "",
|
|
31
|
-
onSubmit: n[0] ||= (...e) =>
|
|
32
|
-
}, [
|
|
33
|
-
isSubmitting:
|
|
34
|
-
resetForm:
|
|
35
|
-
submitCount:
|
|
36
|
-
validate:
|
|
37
|
-
values:
|
|
38
|
-
},
|
|
49
|
+
onSubmit: n[0] ||= (...e) => s(T) && s(T)(...e)
|
|
50
|
+
}, [o(e.$slots, "default", i({
|
|
51
|
+
isSubmitting: s(p),
|
|
52
|
+
resetForm: s(h),
|
|
53
|
+
submitCount: s(m),
|
|
54
|
+
validate: s(y),
|
|
55
|
+
values: s(_)
|
|
56
|
+
}, s(g)))], 544));
|
|
39
57
|
}
|
|
40
58
|
});
|
|
41
59
|
//#endregion
|
|
42
|
-
export {
|
|
60
|
+
export { u as default };
|
|
@@ -32,6 +32,8 @@ declare const __VLS_export: <T>(__VLS_props: NonNullable<Awaited<typeof __VLS_se
|
|
|
32
32
|
option?: (props: any) => any;
|
|
33
33
|
} & {
|
|
34
34
|
group?: (props: any) => any;
|
|
35
|
+
} & {
|
|
36
|
+
chip?: (props: any) => any;
|
|
35
37
|
};
|
|
36
38
|
emit: ((evt: "update:modelValue", value: any) => void) & ((evt: "inactive") => void);
|
|
37
39
|
}>) => import('vue').VNode & {
|
|
@@ -101,6 +101,7 @@ var h = /*@__PURE__*/ o({
|
|
|
101
101
|
"no-data": m((e) => [d(n.$slots, "no-data", l(s(e)))]),
|
|
102
102
|
option: m((e) => [d(n.$slots, "option", l(s(e)))]),
|
|
103
103
|
group: m((e) => [d(n.$slots, "group", l(s(e)))]),
|
|
104
|
+
chip: m((e) => [d(n.$slots, "chip", l(s(e)))]),
|
|
104
105
|
_: 3
|
|
105
106
|
}, 16, ["errors"]));
|
|
106
107
|
}
|
|
@@ -1,49 +1,51 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { useConfig as e } from "../composables/useConfig.js";
|
|
2
|
+
import { isEqual as t } from "../utilities/functions/isEqual.js";
|
|
3
|
+
import { deburr as n } from "../utilities/functions/deburr.js";
|
|
4
4
|
import { computed as r, onBeforeMount as i, watch as a } from "vue";
|
|
5
5
|
import { useField as o } from "vee-validate";
|
|
6
6
|
//#region src/validated/useValidatedField.ts
|
|
7
|
-
var s = (e) =>
|
|
7
|
+
var s = (e) => n(e).replace(/\s+/g, "").toLowerCase(), c = /* @__PURE__ */ new Set([
|
|
8
8
|
"vid",
|
|
9
9
|
"rules",
|
|
10
10
|
"validateOn",
|
|
11
11
|
"errors"
|
|
12
12
|
]), l = (e) => typeof e == "string" ? e.split("|").some((e) => e.trim().split(":")[0] === "required") : e && typeof e == "object" && !Array.isArray(e) ? !!e.required : !1;
|
|
13
|
-
function u(
|
|
14
|
-
let f = r(() => d.identifierFallback()), p = r(() =>
|
|
13
|
+
function u(n, u, d) {
|
|
14
|
+
let f = r(() => d.identifierFallback()), p = r(() => n.vid ? n.vid : f.value ? s(f.value) : void 0), m = () => n.validateOn ?? [];
|
|
15
15
|
i(() => {
|
|
16
16
|
if (!p.value) throw Error(`[bitboss-ui/validated] ${d.componentName}: give the field a "label"/"legend" (its name is derived from it) or an explicit "vid".`);
|
|
17
17
|
});
|
|
18
|
-
let h = r(() =>
|
|
19
|
-
initialValue:
|
|
18
|
+
let h = e(), g = r(() => n.rules), { value: _, errors: v, validate: y, setValue: b, handleChange: x, handleBlur: S } = o(r(() => p.value ?? ""), g, {
|
|
19
|
+
initialValue: n.modelValue,
|
|
20
20
|
validateOnValueUpdate: m().includes("update:modelValue"),
|
|
21
21
|
label: () => f.value
|
|
22
22
|
});
|
|
23
|
-
return a(() =>
|
|
24
|
-
e
|
|
25
|
-
}), {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
23
|
+
return a(() => n.modelValue, (e, n) => {
|
|
24
|
+
t(e, n) || (_.value = e);
|
|
25
|
+
}), a(_, (e) => {
|
|
26
|
+
t(e, n.modelValue) || u("update:modelValue", e);
|
|
27
|
+
}, { flush: "post" }), {
|
|
28
|
+
value: _,
|
|
29
|
+
errors: v,
|
|
30
|
+
validate: y,
|
|
31
|
+
setValue: b,
|
|
32
|
+
handleChange: x,
|
|
33
|
+
handleBlur: S,
|
|
32
34
|
computedErrors: r(() => {
|
|
33
|
-
let e = [...
|
|
34
|
-
return
|
|
35
|
+
let e = [...v.value];
|
|
36
|
+
return n.errors && e.push(...[].concat(n.errors)), e;
|
|
35
37
|
}),
|
|
36
|
-
showAsterisk: r(() =>
|
|
38
|
+
showAsterisk: r(() => h.requiredAsterisk && (!!n.required || l(n.rules))),
|
|
37
39
|
passthrough: r(() => {
|
|
38
40
|
let e = {};
|
|
39
|
-
for (let
|
|
41
|
+
for (let t in n) c.has(t) || (e[t] = n[t]);
|
|
40
42
|
return e;
|
|
41
43
|
}),
|
|
42
44
|
setModelValue: (e) => {
|
|
43
|
-
|
|
45
|
+
b(e, m().includes("update:modelValue") || v.value.length > 0), u("update:modelValue", e);
|
|
44
46
|
},
|
|
45
47
|
validateIfNeeded: (e) => {
|
|
46
|
-
m().includes(e) &&
|
|
48
|
+
m().includes(e) && y();
|
|
47
49
|
}
|
|
48
50
|
};
|
|
49
51
|
}
|
package/dist/vite.js
CHANGED
|
@@ -552,14 +552,18 @@ function tt(t) {
|
|
|
552
552
|
return {
|
|
553
553
|
name: "bitboss-ui:icon-registry",
|
|
554
554
|
config(e) {
|
|
555
|
-
let t = e.optimizeDeps?.include ?? [], n = e.optimizeDeps?.exclude ?? [], r = P(e.root ?? process.cwd()) ? [...L, He] : L, i = p.found.map(({ pack: e }) => `dayjs/locale/${e}`);
|
|
555
|
+
let t = e.optimizeDeps?.include ?? [], n = e.optimizeDeps?.exclude ?? [], r = P(e.root ?? process.cwd()) ? [...L, He] : L, i = p.found.map(({ pack: e }) => `dayjs/locale/${e}`), a = (e.build?.assetsDir ?? "assets").replace(/\/+$/, ""), o = e.build?.rollupOptions?.output, s = (Array.isArray(o) ? o[0] : o)?.chunkFileNames;
|
|
556
556
|
return {
|
|
557
557
|
optimizeDeps: {
|
|
558
558
|
include: [...r, ...i].filter((e) => !t.includes(e)),
|
|
559
559
|
exclude: R.filter((e) => !n.includes(e))
|
|
560
560
|
},
|
|
561
561
|
build: { rollupOptions: { output: { chunkFileNames(e) {
|
|
562
|
-
|
|
562
|
+
if (e.facadeModuleId?.startsWith($)) {
|
|
563
|
+
let t = e.facadeModuleId.slice(17);
|
|
564
|
+
return `${a}/icons/${t.replace("/", "_")}-[hash].js`;
|
|
565
|
+
}
|
|
566
|
+
return typeof s == "function" ? s(e) : s ?? `${a}/[name]-[hash].js`;
|
|
563
567
|
} } } }
|
|
564
568
|
};
|
|
565
569
|
},
|
|
@@ -642,7 +646,7 @@ function tt(t) {
|
|
|
642
646
|
let t = b(e);
|
|
643
647
|
return t ? [`\t${JSON.stringify(e)}: () => import(${JSON.stringify(Q + t.prefix + "/" + t.name)}).then(m => m.default),`] : [];
|
|
644
648
|
}).join("\n");
|
|
645
|
-
return `const _local = import.meta.glob(${JSON.stringify(a)}, { query: '?raw', import: 'default' });\nconst _localIcons = Object.fromEntries(Object.entries(_local).map(([k, l]) => { const f = k.split(/[/\\\\]+/).pop(); return [\`local:\${f.replace(/\\.svg$/i, '')}\`, l]; }));\nconst _icons = {\n` + (u ? u + "\n" : "") + `\t..._localIcons,\n};\nconst _ip = new Set(${JSON.stringify(Array.from(_))});\nconst _loaded = new Set(${JSON.stringify(Array.from(m.keys()))});\nexport const icons = import.meta.env.DEV\n\t? new Proxy(_icons, {\n\t\tget(t, k) {\n\t\t\tif (k in t || typeof k !== 'string' || !k.includes(':')) return t[k];\n\t\t\tconst _c = k.indexOf(':'); const _p = k.slice(0, _c); const _n = k.slice(_c + 1);\n\t\t\tif (
|
|
649
|
+
return `const _local = import.meta.glob(${JSON.stringify(a)}, { query: '?raw', import: 'default' });\nconst _localIcons = Object.fromEntries(Object.entries(_local).map(([k, l]) => { const f = k.split(/[/\\\\]+/).pop(); return [\`local:\${f.replace(/\\.svg$/i, '')}\`, l]; }));\nconst _icons = {\n` + (u ? u + "\n" : "") + `\t..._localIcons,\n};\nconst _ip = new Set(${JSON.stringify(Array.from(_))});\nconst _loaded = new Set(${JSON.stringify(Array.from(m.keys()))});\nconst _installed = _loaded.size ? \`installed sets: \${[..._loaded].join(', ')}\` : 'no @iconify-json/* set is installed';\nconst _fail = (msg) => () => { const _e = new Error(); import.meta.hot?.send('bitboss-ui:icon-missing', { msg, stack: _e.stack }); return Promise.reject(new Error(msg)); };\nexport const icons = import.meta.env.DEV\n\t? new Proxy(_icons, {\n\t\tget(t, k) {\n\t\t\tif (k in t || typeof k !== 'string' || !k.includes(':')) return t[k];\n\t\t\tconst _c = k.indexOf(':'); const _p = k.slice(0, _c); const _n = k.slice(_c + 1);\n\t\t\tif (_p === 'local' || !/^[a-z][a-z0-9-]*$/.test(_p) || !/^[a-z][a-z0-9-]*$/.test(_n)) return undefined;\n\t\t\tif (_loaded.has(_p)) { const _names = Object.keys(t).filter(x => x.startsWith(_p + ':')).map(x => x.slice(_c + 1)); const _sq = _n.replace(/-/g, ''); const _sug = _names.find(x => x.replace(/-/g, '') === _sq) ?? (_n.length >= 3 ? _names.find(x => x.includes(_n) || (x.length >= 3 && _n.includes(x))) : undefined); return _fail(\`[bitboss-ui] icon "\${k}" does not exist in the \${_p} icon set\` + (_sug ? \` — did you mean "\${_p}:\${_sug}"?\` : '')); }\n\t\t\tconst _pkg = \`@iconify-json/\${_p}\`; const _cmd = \`run: npm install -D \${_pkg}\`;\n\t\t\tif (_ip.has(_p)) return _fail(\`[bitboss-ui] "\${k}" requires "\${_pkg}" — \${_cmd} (\${_installed})\`);\n\t\t\tif (_ip.size) return _fail(\`[bitboss-ui] "\${k}" — "\${_p}" is neither an installed icon set nor a known Iconify prefix (\${_installed})\`);\n\t\t\treturn _fail(\`[bitboss-ui] "\${k}" — no installed icon set has the prefix "\${_p}" (\${_installed}). If "\${_p}" is an Iconify set, \${_cmd}\`);\n\t\t},\n\t})\n\t: _icons;\n`;
|
|
646
650
|
},
|
|
647
651
|
buildStart() {
|
|
648
652
|
v(), q(f(r, n.iconDir), r), !i && n.vscodeSettings !== !1 && Z(r, {
|
package/llms.txt
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
> Vue 3 component library by BitBoss: forms, selects, layout, overlays, and more.
|
|
4
4
|
|
|
5
|
-
Note: the `dist/` paths below resolve inside the installed npm package (`node_modules/bitboss-ui/`) and, when this file is fetched over HTTP, against https://
|
|
5
|
+
Note: the `dist/` paths below resolve inside the installed npm package (`node_modules/bitboss-ui/`) and, when this file is fetched over HTTP, against https://llms-bitboss-ui.bitboss.it. `dist/` is generated and not committed, so when browsing the repository the sources are `ai/` (guides, recipes, composables) and `src/components/<Name>/<Name>.guide.md` (per-component guides).
|
|
6
6
|
|
|
7
7
|
## AI Knowledge Base
|
|
8
8
|
|
|
9
|
-
- [Core knowledge base](https://
|
|
10
|
-
- [Complete knowledge base](https://
|
|
9
|
+
- [Core knowledge base](https://llms-bitboss-ui.bitboss.it/dist/llms-medium.txt): **Fetch this if you can only fetch one file** — hard rules, setup, component picker, design language, and the full component catalogue in ~70 KB.
|
|
10
|
+
- [Complete knowledge base](https://llms-bitboss-ui.bitboss.it/dist/llms-full.txt): Everything concatenated (~2 MB). Bulk ingestion only — too large to prompt with.
|
|
11
11
|
- [AI Router](dist/ai/guides/ai-router.md): **Start here** — tiny hop map for any coding agent (which file to open next).
|
|
12
12
|
- [Component index](dist/ai/index.md): Full component catalogue with agent rules, grouped by category. Each entry links a typed contract (props/events/slots/v-model).
|
|
13
13
|
- [Component manifest](dist/ai/components.json): Machine-readable API surface of every component, for programmatic validation.
|
|
@@ -34,17 +34,17 @@ Note: the `dist/` paths below resolve inside the installed npm package (`node_mo
|
|
|
34
34
|
- [Migration v2→v3: BbCheckbox / BbRadio / BbSwitch](dist/ai/guides/migration/components/bb-checkbox.md): reverse polarity inverted (explicit values flip, default layout unchanged), checked narrowed to boolean, color removed, BbRadio's name no longer required.
|
|
35
35
|
- [Migration v2→v3: BbCheckboxGroup / BbRadioGroup / BbSwitchGroup](dist/ai/guides/migration/components/bb-checkbox-group.md): labelPosition renamed legendPosition, per-item disabled is now inert (use selectable), color and the option affix slots removed, BbRadioGroup's name no longer required, and the shared bb-cr-container CSS block split into one per group.
|
|
36
36
|
- [Migration v2→v3: BbChip (removed)](dist/ai/guides/migration/components/bb-chip.md): BbChip is gone — BbBadge with clearable is the replacement; non-clearable chips were badges all along.
|
|
37
|
-
- [Migration v2→v3: BbCollapsible](dist/ai/guides/migration/components/bb-collapsible.md): The tag prop is removed; the root is always a
|
|
37
|
+
- [Migration v2→v3: BbCollapsible](dist/ai/guides/migration/components/bb-collapsible.md): The tag prop is removed; the root is always a span.
|
|
38
38
|
- [Migration v2→v3: BbColorInput](dist/ai/guides/migration/components/bb-color-input.md): picker renamed to eyeDropper.
|
|
39
39
|
- [Migration v2→v3: BbColorPalette](dist/ai/guides/migration/components/bb-color-palette.md): flip inverted to disableFlip, showArrow removed, picker renamed eyeDropper, update:open dropped, model updates never emit null.
|
|
40
40
|
- [Migration v2→v3: BbDatePickerInput](dist/ai/guides/migration/components/bb-date-picker-input.md): allowWriting inverted to disableWriting and hidePopover renamed to disableCalendar, both with a changed token set; the width prop is removed; adaptive mobile sheet by default; non-floating output carries the local offset instead of UTC `Z` (new `utc` prop restores v2 output).
|
|
41
|
-
- [Migration v2→v3: BbDialog](dist/ai/guides/migration/components/bb-dialog.md): showClose inverted to hideClose,
|
|
41
|
+
- [Migration v2→v3: BbDialog](dist/ai/guides/migration/components/bb-dialog.md): showClose inverted to hideClose, #close removed (description restored in beta.19), default widths changed, adaptive bottom sheet on mobile by default, --bb-dialog-* tokens replaced by --bb-panel-p plus locals.
|
|
42
42
|
- [Migration v2→v3: BbDropdown](dist/ai/guides/migration/components/bb-dropdown.md): Items now expect text as the label and can carry variants/submenus; arrowPadding removed; adaptive mobile sheet on by default.
|
|
43
43
|
- [Migration v2→v3: BbDropdownButton](dist/ai/guides/migration/components/bb-dropdown-button.md): autoLoading renamed to disableAutoLoading, disabledWhileLoading and theme removed.
|
|
44
44
|
- [Migration v2→v3: BbDropzone](dist/ai/guides/migration/components/bb-dropzone.md): modelValue is typed, accept no longer throws and takes bare tokens, and the hidden native-submit input only renders when name is set.
|
|
45
45
|
- [Migration v2→v3: BbIcon](dist/ai/guides/migration/components/bb-icon.md): The required prop is renamed type→icon, color is removed, and the xxl size key becomes 2xl.
|
|
46
46
|
- [Migration v2→v3: BbIntersection](dist/ai/guides/migration/components/bb-intersection.md): Removed with no replacement — it wrapped IntersectionObserver and carried no styling; use @vueuse/core's useIntersectionObserver.
|
|
47
|
-
- [Migration v2→v3: BbOffCanvas](dist/ai/guides/migration/components/bb-offcanvas.md): direction→side; showClose→hideClose;
|
|
47
|
+
- [Migration v2→v3: BbOffCanvas](dist/ai/guides/migration/components/bb-offcanvas.md): direction→side; showClose→hideClose; #close removed (description restored in beta.19); size defaults change; adaptive drawer configs unify on offCanvasProps.
|
|
48
48
|
- [Migration v2→v3: BbPagination](dist/ai/guides/migration/components/bb-pagination.md): querykey renamed to queryKey; the loading prop is removed.
|
|
49
49
|
- [Migration v2→v3: BbPopover](dist/ai/guides/migration/components/bb-popover.md): Built-in close button, restoreFocus, theme, and the arrow are gone; close affordances move into your content.
|
|
50
50
|
- [Migration v2→v3: BbRating](dist/ai/guides/migration/components/bb-rating.md): color removed; name no longer required; the star state modifier renamed --highlighted to --filled/--empty; --bb-rating-size demoted to a local --size; input-position finally works.
|
|
@@ -53,7 +53,7 @@ Note: the `dist/` paths below resolve inside the installed npm package (`node_mo
|
|
|
53
53
|
- [Migration v2→v3: BbSlider](dist/ai/guides/migration/components/bb-slider.md): thumbTranslate inverted to disableThumbTranslate; string model values and color removed.
|
|
54
54
|
- [Migration v2→v3: BbSmoothHeight](dist/ai/guides/migration/components/bb-smooth-height.md): The `tag` prop is narrowed to `div | span`, and the inner measuring element now mirrors it instead of always being a `<div>`.
|
|
55
55
|
- [Migration v2→v3: BbSpinner](dist/ai/guides/migration/components/bb-spinner.md): The color prop is removed; spinners follow currentColor.
|
|
56
|
-
- [Migration v2→v3: BbTable](dist/ai/guides/migration/components/bb-table.md): allowSelectAll inverted to disableSelectAll; loading no longer blanks populated tables and now inerts rows; #loading is first-load-only; #no-data fills a full-width
|
|
56
|
+
- [Migration v2→v3: BbTable](dist/ai/guides/migration/components/bb-table.md): The table renders as a CSS grid of divs with ARIA roles, not a <table> — every element selector (table/thead/tbody/tr/th/td) under .bb-table matches nothing, #thead/#tbody/#tfoot take role-complete div rows, --fill/--natural-width are gone, column widths drift within documented bounds, copy-to-spreadsheet and print header repetition degrade; allowSelectAll inverted to disableSelectAll; loading no longer blanks populated tables and now inerts rows; #loading is first-load-only; #no-data fills a full-width cell instead of replacing the row; row events drop the selected argument; columns gained sortable + rowClass, which collide with same-named consumer fields.
|
|
57
57
|
- [Migration v2→v3: BbTabs (was BbTab)](dist/ai/guides/migration/components/bb-tabs.md): Component renamed; querykey→queryKey; animations default on; label slots renamed and all dynamic names/URL slugs normalized; the entire .bb-tab BEM tree renamed to .bb-tabs / .bb-tabs-list / .bb-tabs-panes.
|
|
58
58
|
- [Migration v2→v3: BbTag](dist/ai/guides/migration/components/bb-tag.md): modelValue is strictly string[] now, multiple is removed, and duplicates are rejected case-insensitively by default.
|
|
59
59
|
- [Migration v2→v3: BbTextInput](dist/ai/guides/migration/components/bb-text-input.md): The type prop narrows to the text-like input types — number/date values must move to their dedicated components; a bare `floating` attribute was never a prop, the spelling is label-mode="floating".
|
|
@@ -63,6 +63,7 @@ Note: the `dist/` paths below resolve inside the installed npm package (`node_mo
|
|
|
63
63
|
- [Migration v2→v3: confirm() / useConfirm](dist/ai/guides/migration/components/use-confirm.md): yesText/onYes/noText/onNo collapse into yes/no configs, actions becomes an array-or-false, theme→variant, timeout→duration, autoClose flips to default-true, labels are localized, footer buttons default md.
|
|
64
64
|
- [Migration v2→v3: useBroadcastChannelInstance](dist/ai/guides/migration/components/use-broadcast-channel-instance.md): Removed — cross-tab messaging is not a UI concern; use useBroadcastChannel from @vueuse/core.
|
|
65
65
|
- [Page Shell](dist/ai/guides/page-shell.md): App-side page layout — topbar, content, and a right details sidebar driven by a stack-based context (push a record to peek it, pop to go back). The implementation ships in the per-platform Layout Scaffold recipe; this guide covers when and how to use it.
|
|
66
|
+
- [ssr-prefill](dist/ai/guides/ssr-prefill.md): Guide for ssr-prefill usage and decision-making context.
|
|
66
67
|
- [Validated Forms (vee-validate)](dist/ai/guides/validated-forms.md): The `bitboss-ui/validated` entrypoint — form controls pre-wired to vee-validate. Global rules give an effort-free `rules="required|email"` string syntax; BbForm hosts the form; requiredAsterisk marks required fields.
|
|
67
68
|
|
|
68
69
|
## Recipes (Page-Level Assemblies)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bitboss-ui",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.21",
|
|
4
4
|
"description": "Vue 3 component library by BitBoss: forms, selects, layout, overlays, and more.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"publishConfig": {
|
|
12
12
|
"tag": "alpha"
|
|
13
13
|
},
|
|
14
|
-
"homepage": "https://ui-components
|
|
14
|
+
"homepage": "https://ui-components.bitboss.it/",
|
|
15
15
|
"repository": {
|
|
16
16
|
"type": "git",
|
|
17
17
|
"url": "git+https://github.com/bitboss-hub/bitboss-ui.git"
|
|
@@ -27,7 +27,24 @@ export type BitbossUiRuleName =
|
|
|
27
27
|
| 'require-partner-prop'
|
|
28
28
|
| 'no-unknown-slots'
|
|
29
29
|
| 'no-active-class-on-root-link'
|
|
30
|
-
| 'no-navigation-attr-fallthrough'
|
|
30
|
+
| 'no-navigation-attr-fallthrough'
|
|
31
|
+
| 'no-reverse-false';
|
|
32
|
+
|
|
33
|
+
/** Options accepted by `bitboss-ui/no-reverse-false`. */
|
|
34
|
+
export interface NoReverseFalseOptions {
|
|
35
|
+
/** Component names to skip entirely. */
|
|
36
|
+
allowComponents?: string[];
|
|
37
|
+
/**
|
|
38
|
+
* Promote the v2-intent rewrite (`:reverse="false"` → `reverse`) from an
|
|
39
|
+
* editor suggestion to a real `--fix`, for a bulk v2→v3 sweep.
|
|
40
|
+
*
|
|
41
|
+
* Off by default, and deliberately so: the two readings of
|
|
42
|
+
* `:reverse="false"` produce OPPOSITE layouts, so an unrequested fix would
|
|
43
|
+
* silently flip every row in a v3-native codebase that wrote the redundant
|
|
44
|
+
* prop. Turn it on only for files you know came from v2.
|
|
45
|
+
*/
|
|
46
|
+
assumeV2?: boolean;
|
|
47
|
+
}
|
|
31
48
|
|
|
32
49
|
/** Options accepted by `bitboss-ui/no-unknown-attributes`. */
|
|
33
50
|
export interface NoUnknownAttributesOptions {
|
|
@@ -54,6 +71,7 @@ export const requirePartnerProp: Rule.RuleModule;
|
|
|
54
71
|
export const noUnknownSlots: Rule.RuleModule;
|
|
55
72
|
export const noActiveClassOnRootLink: Rule.RuleModule;
|
|
56
73
|
export const noNavigationAttrFallthrough: Rule.RuleModule;
|
|
74
|
+
export const noReverseFalse: Rule.RuleModule;
|
|
57
75
|
|
|
58
76
|
/**
|
|
59
77
|
* Resolves the optional `@typescript-eslint/parser` peer, or `null` when it is
|
|
@@ -413,22 +413,17 @@ function attrBinding(startTag, camelName) {
|
|
|
413
413
|
/**
|
|
414
414
|
* `#slot` name ↔ gating prop pairs on `BbTable`. Each of these slots is
|
|
415
415
|
* rendered from a `v-if`/coherence check on the paired prop/model
|
|
416
|
-
* (`BbTable.vue`: `v-if="
|
|
417
|
-
*
|
|
418
|
-
*
|
|
419
|
-
*
|
|
420
|
-
*
|
|
421
|
-
*
|
|
422
|
-
*
|
|
416
|
+
* (`BbTable.vue`: `v-if="selectable"`, `v-if="item.expanded"` — itself driven
|
|
417
|
+
* by whatever `expandedItems` holds) — so a template that fills the slot but
|
|
418
|
+
* never sets the prop compiles clean, ships clean, and renders nothing, with
|
|
419
|
+
* no warning anywhere (W6-R1). `header:select` shares the same gating prop
|
|
420
|
+
* as its row-level counterpart and is deliberately NOT listed separately —
|
|
421
|
+
* flagging `#select` already catches the same missing `selectable` prop.
|
|
422
|
+
* `#actions` is NOT a pair any more: since 2026-09-07 the slot itself creates
|
|
423
|
+
* the actions column (the `actions` prop was retired), so an `#actions`
|
|
424
|
+
* template can never be orphaned.
|
|
423
425
|
*/
|
|
424
426
|
const TABLE_SLOT_PROP_PAIRS = [
|
|
425
|
-
{
|
|
426
|
-
slot: 'actions',
|
|
427
|
-
prop: 'actions',
|
|
428
|
-
missing: 'the `actions` prop is not set',
|
|
429
|
-
explain: 'the actions cell — and this slot — never renders',
|
|
430
|
-
action: 'Set the `actions` prop',
|
|
431
|
-
},
|
|
432
427
|
{
|
|
433
428
|
slot: 'select',
|
|
434
429
|
prop: 'selectable',
|
|
@@ -924,6 +919,149 @@ const noNavigationAttrFallthrough = {
|
|
|
924
919
|
},
|
|
925
920
|
};
|
|
926
921
|
|
|
922
|
+
/*
|
|
923
|
+
* The three v3 controls whose `reverse` prop kept its NAME but inverted its
|
|
924
|
+
* MEANING between v2 and v3. Hardcoded on purpose: this is a fact about one
|
|
925
|
+
* historical migration, not a property the manifest can express — the manifest
|
|
926
|
+
* records that `reverse` exists and defaults to `false`, which is true in both
|
|
927
|
+
* versions and says nothing about which layout that produces.
|
|
928
|
+
*
|
|
929
|
+
* Verified against both branches rather than assumed:
|
|
930
|
+
* v2 `BbSwitch.vue` withDefaults `reverse: true`, passed RAW to the base
|
|
931
|
+
* container. v3 defaults the public prop `false` and passes `!props.reverse`
|
|
932
|
+
* down. Both defaults therefore reach the base as `true` — the default
|
|
933
|
+
* layout never moved — but every EXPLICIT value flips.
|
|
934
|
+
*/
|
|
935
|
+
const INVERTED_REVERSE_COMPONENTS = new Set([
|
|
936
|
+
'BbCheckbox',
|
|
937
|
+
'BbRadio',
|
|
938
|
+
'BbSwitch',
|
|
939
|
+
]);
|
|
940
|
+
|
|
941
|
+
/** @type {import('eslint').Rule.RuleModule} */
|
|
942
|
+
const noReverseFalse = {
|
|
943
|
+
meta: {
|
|
944
|
+
type: 'problem',
|
|
945
|
+
hasSuggestions: true,
|
|
946
|
+
fixable: 'code',
|
|
947
|
+
docs: {
|
|
948
|
+
description:
|
|
949
|
+
'Flag `:reverse="false"` on BbCheckbox/BbRadio/BbSwitch — the v2 spelling for a right-hand control. `reverse` kept its name and inverted its meaning in v3, so the v2 spelling is now a no-op that renders the OPPOSITE layout, and nothing else catches it: it is valid TypeScript, a declared prop, and its own default.',
|
|
950
|
+
recommended: true,
|
|
951
|
+
},
|
|
952
|
+
schema: [
|
|
953
|
+
{
|
|
954
|
+
type: 'object',
|
|
955
|
+
properties: {
|
|
956
|
+
manifestPath: { type: 'string' },
|
|
957
|
+
failClosed: { type: 'boolean' },
|
|
958
|
+
allowComponents: { type: 'array', items: { type: 'string' } },
|
|
959
|
+
// Opt-in for a bulk v2→v3 sweep: turn the "control on the right"
|
|
960
|
+
// rewrite into a real `--fix`. Off by default because the two
|
|
961
|
+
// readings produce OPPOSITE layouts, and a v3-native codebase
|
|
962
|
+
// that wrote the redundant `:reverse="false"` would silently have
|
|
963
|
+
// its rows flipped by a fix it never asked for.
|
|
964
|
+
assumeV2: { type: 'boolean' },
|
|
965
|
+
},
|
|
966
|
+
additionalProperties: false,
|
|
967
|
+
},
|
|
968
|
+
],
|
|
969
|
+
messages: {
|
|
970
|
+
reverseFalse:
|
|
971
|
+
'`:reverse="false"` on {{component}} is the v2 spelling for a right-hand control, and in v3 it is a no-op that renders the control on the LEFT. v3 inverted the prop\'s meaning while keeping its name: pass bare `reverse` for the v2 layout, or delete the prop (it is already the default). See ai/guides/migration/components/bb-checkbox.md.',
|
|
972
|
+
reverseStringFalse:
|
|
973
|
+
'`reverse="false"` on {{component}} is a STRING, which is truthy — so it does the opposite of what it reads like and behaves as `reverse`. Write bare `reverse` if that is what you want, or delete the prop.',
|
|
974
|
+
},
|
|
975
|
+
},
|
|
976
|
+
|
|
977
|
+
create(context) {
|
|
978
|
+
const options = context.options[0] ?? {};
|
|
979
|
+
const manifest = getManifest(options.manifestPath, options);
|
|
980
|
+
const sourceCode = context.sourceCode ?? context.getSourceCode();
|
|
981
|
+
const services = sourceCode.parserServices;
|
|
982
|
+
if (!manifest || !services?.defineTemplateBodyVisitor) return {};
|
|
983
|
+
|
|
984
|
+
const allowComps = new Set(options.allowComponents ?? []);
|
|
985
|
+
|
|
986
|
+
return services.defineTemplateBodyVisitor({
|
|
987
|
+
VElement(node) {
|
|
988
|
+
const name = toPascalTag(node.rawName);
|
|
989
|
+
if (!INVERTED_REVERSE_COMPONENTS.has(name) || allowComps.has(name)) {
|
|
990
|
+
return;
|
|
991
|
+
}
|
|
992
|
+
// Stay honest against the installed manifest: if this build of the
|
|
993
|
+
// library no longer declares `reverse` on the component, the rule has
|
|
994
|
+
// nothing to say and `no-unknown-attributes` owns the diagnostic.
|
|
995
|
+
const surface = manifest.get(name);
|
|
996
|
+
if (!surface) return;
|
|
997
|
+
const checker = createComponentChecker(surface);
|
|
998
|
+
if (!checker.isKnownProp('reverse')) return;
|
|
999
|
+
|
|
1000
|
+
for (const attr of node.startTag.attributes) {
|
|
1001
|
+
// `reverse="false"` — a plain attribute, so the value is the STRING
|
|
1002
|
+
// "false", which Vue leaves truthy. Reads as off, behaves as on.
|
|
1003
|
+
if (!attr.directive) {
|
|
1004
|
+
const attrName = attr.key.rawName ?? attr.key.name;
|
|
1005
|
+
if (toCamel(attrName) !== 'reverse') continue;
|
|
1006
|
+
if (attr.value?.value !== 'false') continue;
|
|
1007
|
+
context.report({
|
|
1008
|
+
node: attr,
|
|
1009
|
+
messageId: 'reverseStringFalse',
|
|
1010
|
+
data: { component: name },
|
|
1011
|
+
suggest: [
|
|
1012
|
+
{
|
|
1013
|
+
desc: 'Use bare `reverse` (same result, says what it does)',
|
|
1014
|
+
fix: (fixer) => fixer.replaceText(attr, 'reverse'),
|
|
1015
|
+
},
|
|
1016
|
+
{
|
|
1017
|
+
desc: 'Remove it (control on the left, the v3 default)',
|
|
1018
|
+
fix: (fixer) => fixer.remove(attr),
|
|
1019
|
+
},
|
|
1020
|
+
],
|
|
1021
|
+
});
|
|
1022
|
+
continue;
|
|
1023
|
+
}
|
|
1024
|
+
|
|
1025
|
+
if (attr.key.name.name !== 'bind') continue;
|
|
1026
|
+
const arg = attr.key.argument;
|
|
1027
|
+
// `v-bind="obj"` and `:[expr]` are unbounded — nothing to assert.
|
|
1028
|
+
if (!arg || arg.type !== 'VIdentifier') continue;
|
|
1029
|
+
if (toCamel(arg.rawName ?? arg.name) !== 'reverse') continue;
|
|
1030
|
+
const expr =
|
|
1031
|
+
attr.value?.type === 'VExpressionContainer'
|
|
1032
|
+
? attr.value.expression
|
|
1033
|
+
: null;
|
|
1034
|
+
// ONLY a literal `false`. A dynamic `:reverse="isRtl"` that happens
|
|
1035
|
+
// to evaluate false is legitimate v3 code, and the template AST is
|
|
1036
|
+
// the one place that distinction survives — which is exactly why
|
|
1037
|
+
// this is a lint rule and not a runtime warning.
|
|
1038
|
+
if (!expr || expr.type !== 'Literal' || expr.value !== false) {
|
|
1039
|
+
continue;
|
|
1040
|
+
}
|
|
1041
|
+
|
|
1042
|
+
const toBare = (fixer) => fixer.replaceText(attr, 'reverse');
|
|
1043
|
+
context.report({
|
|
1044
|
+
node: attr,
|
|
1045
|
+
messageId: 'reverseFalse',
|
|
1046
|
+
data: { component: name },
|
|
1047
|
+
...(options.assumeV2 ? { fix: toBare } : {}),
|
|
1048
|
+
suggest: [
|
|
1049
|
+
{
|
|
1050
|
+
desc: 'Control on the right (what this meant in v2): `reverse`',
|
|
1051
|
+
fix: toBare,
|
|
1052
|
+
},
|
|
1053
|
+
{
|
|
1054
|
+
desc: 'Control on the left: remove the prop (it is the default)',
|
|
1055
|
+
fix: (fixer) => fixer.remove(attr),
|
|
1056
|
+
},
|
|
1057
|
+
],
|
|
1058
|
+
});
|
|
1059
|
+
}
|
|
1060
|
+
},
|
|
1061
|
+
});
|
|
1062
|
+
},
|
|
1063
|
+
};
|
|
1064
|
+
|
|
927
1065
|
const plugin = {
|
|
928
1066
|
meta: { name: 'bitboss-ui', version: '1.0.0' },
|
|
929
1067
|
rules: {
|
|
@@ -933,6 +1071,7 @@ const plugin = {
|
|
|
933
1071
|
'no-unknown-slots': noUnknownSlots,
|
|
934
1072
|
'no-active-class-on-root-link': noActiveClassOnRootLink,
|
|
935
1073
|
'no-navigation-attr-fallthrough': noNavigationAttrFallthrough,
|
|
1074
|
+
'no-reverse-false': noReverseFalse,
|
|
936
1075
|
},
|
|
937
1076
|
};
|
|
938
1077
|
|
|
@@ -991,6 +1130,7 @@ plugin.configs = {
|
|
|
991
1130
|
'bitboss-ui/no-unknown-slots': 'error',
|
|
992
1131
|
'bitboss-ui/no-active-class-on-root-link': 'error',
|
|
993
1132
|
'bitboss-ui/no-navigation-attr-fallthrough': 'error',
|
|
1133
|
+
'bitboss-ui/no-reverse-false': 'error',
|
|
994
1134
|
},
|
|
995
1135
|
},
|
|
996
1136
|
],
|
|
@@ -1004,5 +1144,6 @@ export {
|
|
|
1004
1144
|
noUnknownSlots,
|
|
1005
1145
|
noActiveClassOnRootLink,
|
|
1006
1146
|
noNavigationAttrFallthrough,
|
|
1147
|
+
noReverseFalse,
|
|
1007
1148
|
resolveOptionalTsParser,
|
|
1008
1149
|
};
|