bitboss-ui 3.0.0-beta.48 → 3.0.0-beta.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -7
- package/bin/bitboss-ui-mcp.mjs +15 -3
- package/bin/bitboss-ui.mjs +115 -13
- package/dist/ai/BbAvatar.md +1 -1
- package/dist/ai/BbBreadcrumbs.md +65 -65
- package/dist/ai/BbButton.md +16 -5
- package/dist/ai/BbCheckbox.md +0 -2
- package/dist/ai/BbCheckboxGroup.md +13 -20
- package/dist/ai/BbDatePickerInput.md +4 -2
- package/dist/ai/BbDialog.md +1 -8
- package/dist/ai/BbDropdown.md +231 -220
- package/dist/ai/BbDropdownButton.md +65 -65
- package/dist/ai/BbDropdownGroup.md +2 -2
- package/dist/ai/BbDropzone.md +10 -10
- package/dist/ai/BbForm.md +43 -52
- package/dist/ai/BbHoverCard.md +4 -2
- package/dist/ai/BbNumberInput.md +88 -21
- package/dist/ai/BbPopover.md +29 -23
- package/dist/ai/BbProgress.md +48 -22
- package/dist/ai/BbRadioGroup.md +13 -19
- package/dist/ai/BbSelect.md +16 -36
- package/dist/ai/BbSelectPopover.md +14 -30
- package/dist/ai/BbSmoothHeight.md +0 -2
- package/dist/ai/BbSwitchGroup.md +13 -20
- package/dist/ai/BbTable.md +11 -10
- package/dist/ai/BbTabs.md +106 -105
- package/dist/ai/BbTabsList.md +2 -2
- package/dist/ai/BbTabsPanels.md +1 -1
- package/dist/ai/BbTabsRoot.md +2 -2
- package/dist/ai/BbTooltip.md +24 -10
- package/dist/ai/BbTree.md +14 -11
- package/dist/ai/changelog.json +256 -5
- package/dist/ai/components.json +36 -34
- package/dist/ai/composables/useBbDropdownContext.md +16 -16
- package/dist/ai/composables/useBbFormField.md +5 -1
- package/dist/ai/composables/useBbTabsContext.md +14 -14
- package/dist/ai/guides/agent-contract.md +27 -27
- package/dist/ai/guides/ai-router.md +1 -1
- package/dist/ai/guides/component-picker.md +3 -3
- package/dist/ai/guides/fetch-items-playbook.md +1 -1
- package/dist/ai/guides/icons-policy.md +10 -10
- package/dist/ai/guides/inertia-helpers.md +120 -67
- package/dist/ai/guides/installation-and-plugin-setup.md +43 -15
- package/dist/ai/guides/migration/components/bb-breadcrumbs.md +3 -2
- package/dist/ai/guides/migration/components/bb-checkbox-group.md +16 -16
- package/dist/ai/guides/migration/components/bb-dropdown-button.md +9 -8
- package/dist/ai/guides/migration/components/bb-dropdown.md +15 -14
- package/dist/ai/guides/migration/components/bb-radio-group.md +2 -1
- package/dist/ai/guides/migration/components/bb-select-popover.md +6 -1
- package/dist/ai/guides/migration/components/bb-select.md +10 -2
- package/dist/ai/guides/migration/components/bb-switch-group.md +2 -1
- package/dist/ai/guides/migration/components/bb-tabs.md +9 -8
- package/dist/ai/guides/migration/components/bb-tooltip.md +1 -1
- package/dist/ai/guides/migration/v2-to-v3.md +114 -17
- package/dist/ai/guides/migration/v3-beta-tooling.md +11 -0
- package/dist/ai/guides/options-items-playbook.md +30 -24
- package/dist/ai/guides/passthrough.md +2 -2
- package/dist/ai/guides/preset-components.md +18 -3
- package/dist/ai/guides/typescript-generic-components.md +1 -1
- package/dist/ai/guides/validated-forms.md +11 -22
- package/dist/ai/guides/validation-providers.md +4 -3
- package/dist/ai/helpers/inertia/manifest.json +636 -0
- package/dist/ai/helpers/inertia/types.ts +15 -0
- package/dist/ai/helpers/inertia/useAsyncFn.ts +110 -0
- package/dist/ai/helpers/inertia/useConfirmOnRouteLeave.ts +102 -0
- package/dist/ai/helpers/inertia/useDeleteCmd.ts +30 -0
- package/dist/ai/helpers/inertia/useHasChanged.ts +36 -0
- package/dist/ai/helpers/inertia/useIndexById.ts +23 -0
- package/dist/ai/helpers/inertia/useLazyProp.ts +148 -0
- package/dist/ai/helpers/inertia/useLazyPropGetter.ts +50 -0
- package/dist/ai/helpers/inertia/useLoading.ts +20 -0
- package/dist/ai/helpers/inertia/usePaginatedResponseContext.ts +88 -0
- package/dist/ai/helpers/inertia/usePromiseForm.ts +62 -0
- package/dist/ai/helpers/inertia/useProp.ts +63 -0
- package/dist/ai/helpers/inertia/useQuery.ts +19 -0
- package/dist/ai/helpers/inertia/useQueryObject.ts +116 -0
- package/dist/ai/helpers/inertia/useResourceContext.ts +69 -0
- package/dist/ai/helpers/inertia/useRouteQuery.ts +54 -0
- package/dist/ai/helpers/inertia/useScreenSizes.ts +23 -0
- package/dist/ai/helpers/inertia/useTableContext.ts +34 -0
- package/dist/ai/helpers/inertia/useTableSelectionContext.ts +48 -0
- package/dist/ai/helpers/inertia/useUntil.ts +33 -0
- package/dist/ai/helpers/inertia/utils.ts +24 -0
- package/dist/ai/index.md +6 -6
- package/dist/ai/manifest/components/BbBreadcrumbs.json +10 -6
- package/dist/ai/manifest/components/BbBreadcrumbs.tree.json +1 -1
- package/dist/ai/manifest/components/BbButton.json +1 -1
- package/dist/ai/manifest/components/BbCheckboxGroup.json +2 -2
- package/dist/ai/manifest/components/BbDropdown.json +23 -20
- package/dist/ai/manifest/components/BbDropdown.tree.json +2 -2
- package/dist/ai/manifest/components/BbDropdownButton.json +22 -19
- package/dist/ai/manifest/components/BbDropdownButton.tree.json +1 -1
- package/dist/ai/manifest/components/BbDropdownGroup.json +2 -2
- package/dist/ai/manifest/components/BbForm.json +1 -0
- package/dist/ai/manifest/components/BbNumberInput.json +6 -1
- package/dist/ai/manifest/components/BbNumberInput.tree.json +2 -1
- package/dist/ai/manifest/components/BbPopover.json +1 -0
- package/dist/ai/manifest/components/BbProgress.json +6 -6
- package/dist/ai/manifest/components/BbProgress.tree.json +1 -0
- package/dist/ai/manifest/components/BbRadioGroup.json +2 -2
- package/dist/ai/manifest/components/BbSelect.json +2 -2
- package/dist/ai/manifest/components/BbSelectPopover.json +2 -2
- package/dist/ai/manifest/components/BbSwitchGroup.json +2 -2
- package/dist/ai/manifest/components/BbTabs.json +7 -6
- package/dist/ai/manifest/components/BbTabsList.json +3 -3
- package/dist/ai/manifest/components/BbTabsPanels.json +1 -1
- package/dist/ai/manifest/components/BbTabsRoot.json +5 -4
- package/dist/ai/manifest/components/BbTooltip.json +1 -1
- package/dist/ai/manifest/index.json +2 -2
- package/dist/ai/manifest/meta.json +2 -0
- package/dist/ai/manifest/types.advanced.json +10 -9
- package/dist/ai/manifest/types.api.json +5 -4
- package/dist/ai/recipes/inertia/approvals-inbox.md +16 -18
- package/dist/ai/recipes/inertia/inline-edit-workspace.md +23 -33
- package/dist/ai/recipes/inertia/layout-scaffold.md +16 -16
- package/dist/ai/recipes/inertia/onboarding.md +6 -10
- package/dist/ai/recipes/inertia/ownership-atlas.md +15 -18
- package/dist/ai/recipes/inertia/record-form.md +11 -11
- package/dist/ai/recipes/inertia/records-workspace.md +38 -41
- package/dist/ai/recipes/inertia/settings-workspace.md +26 -38
- package/dist/ai/recipes/inertia/upload-center.md +31 -39
- package/dist/ai/recipes/inertia/wizard-form.md +10 -19
- package/dist/ai/recipes/nuxt/approvals-inbox.md +7 -8
- package/dist/ai/recipes/nuxt/inline-edit-workspace.md +14 -24
- package/dist/ai/recipes/nuxt/layout-scaffold.md +16 -16
- package/dist/ai/recipes/nuxt/onboarding.md +2 -6
- package/dist/ai/recipes/nuxt/ownership-atlas.md +7 -9
- package/dist/ai/recipes/nuxt/record-form.md +5 -5
- package/dist/ai/recipes/nuxt/records-workspace.md +29 -31
- package/dist/ai/recipes/nuxt/settings-workspace.md +22 -34
- package/dist/ai/recipes/nuxt/upload-center.md +22 -29
- package/dist/ai/recipes/nuxt/wizard-form.md +3 -11
- package/dist/ai/recipes/vue/approvals-inbox.md +7 -8
- package/dist/ai/recipes/vue/inline-edit-workspace.md +14 -24
- package/dist/ai/recipes/vue/layout-scaffold.md +16 -16
- package/dist/ai/recipes/vue/onboarding.md +2 -6
- package/dist/ai/recipes/vue/ownership-atlas.md +7 -9
- package/dist/ai/recipes/vue/record-form.md +5 -5
- package/dist/ai/recipes/vue/records-workspace.md +29 -31
- package/dist/ai/recipes/vue/settings-workspace.md +22 -34
- package/dist/ai/recipes/vue/upload-center.md +22 -29
- package/dist/ai/recipes/vue/wizard-form.md +3 -11
- package/dist/ai/source/BbAccordion.md +1 -1
- package/dist/ai/source/BbAlert.md +3 -3
- package/dist/ai/source/BbBadge.md +2 -2
- package/dist/ai/source/BbBadgeButton.md +5 -4
- package/dist/ai/source/BbBaseButton.md +1 -1
- package/dist/ai/source/BbBaseRadioIcon.md +1 -0
- package/dist/ai/source/BbBaseSwitchIcon.md +1 -0
- package/dist/ai/source/BbBreadcrumbs.md +63 -42
- package/dist/ai/source/BbButton.md +71 -33
- package/dist/ai/source/BbCalendar.md +17 -16
- package/dist/ai/source/BbCheckbox.md +3 -2
- package/dist/ai/source/BbCheckboxGroup.md +11 -4
- package/dist/ai/source/BbColorInput.md +10 -9
- package/dist/ai/source/BbConfirm.md +1 -1
- package/dist/ai/source/BbConfirmPortal.md +1 -1
- package/dist/ai/source/BbDatePicker.md +2 -2
- package/dist/ai/source/BbDatePickerInput.md +47 -20
- package/dist/ai/source/BbDialog.md +5 -5
- package/dist/ai/source/BbDropdown.md +230 -158
- package/dist/ai/source/BbDropdownButton.md +19 -12
- package/dist/ai/source/BbDropdownGroup.md +126 -93
- package/dist/ai/source/BbForm.md +25 -1
- package/dist/ai/source/BbIndicator.md +4 -0
- package/dist/ai/source/BbNumberInput.md +855 -19
- package/dist/ai/source/BbOffCanvas.md +27 -11
- package/dist/ai/source/BbPagination.md +3 -3
- package/dist/ai/source/BbPopover.md +152 -8
- package/dist/ai/source/BbPopoverPortal.md +11 -0
- package/dist/ai/source/BbProgress.md +82 -18
- package/dist/ai/source/BbRadioGroup.md +12 -5
- package/dist/ai/source/BbRating.md +11 -9
- package/dist/ai/source/BbSelect.md +16 -10
- package/dist/ai/source/BbSelectPopover.md +29 -23
- package/dist/ai/source/BbSlider.md +12 -6
- package/dist/ai/source/BbSwitch.md +3 -2
- package/dist/ai/source/BbSwitchGroup.md +5 -2
- package/dist/ai/source/BbTable.md +102 -18
- package/dist/ai/source/BbTabs.md +27 -23
- package/dist/ai/source/BbTabsList.md +26 -22
- package/dist/ai/source/BbTabsPanels.md +26 -22
- package/dist/ai/source/BbTabsRoot.md +25 -21
- package/dist/ai/source/BbTag.md +10 -9
- package/dist/ai/source/BbTextInput.md +5 -4
- package/dist/ai/source/BbTextarea.md +6 -5
- package/dist/ai/source/BbTimePicker.md +1 -1
- package/dist/ai/source/BbTimePickerInput.md +46 -9
- package/dist/ai/source/BbToast.md +10 -7
- package/dist/ai/source/BbToastPortal.md +10 -7
- package/dist/ai/source/BbTooltip.md +54 -8
- package/dist/ai/source/BbTree.md +21 -3
- package/dist/ai/source/CommonField.md +6 -4
- package/dist/ai/source/CommonFieldInput.md +15 -10
- package/dist/ai/source/CommonPopover.md +6 -0
- package/dist/ai/source/CommonTimeSelector.md +5 -4
- package/dist/components/BbBadge/BbBadgeButton.vue_vue_type_script_setup_true_lang.js +10 -8
- package/dist/components/BbBaseButton/BbBaseButton.vue_vue_type_script_setup_true_lang.js +8 -8
- package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue_vue_type_script_setup_true_lang.js +45 -45
- package/dist/components/BbBreadcrumbs/types.d.ts +25 -17
- package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +84 -71
- package/dist/components/BbButton/toggleRoving.d.ts +6 -0
- package/dist/components/BbButton/toggleRoving.js +45 -0
- package/dist/components/BbButton/types.d.ts +4 -1
- package/dist/components/BbCalendar/BbCalendar.vue_vue_type_script_setup_true_lang.js +178 -178
- package/dist/components/BbCalendar/CalendarMonthPanel.vue_vue_type_script_setup_true_lang.js +15 -15
- package/dist/components/BbCalendar/CalendarYearPanel.vue_vue_type_script_setup_true_lang.js +28 -28
- package/dist/components/BbCalendar/useCalendarGrid.js +141 -139
- package/dist/components/BbCalendar/useDayjsLocale.d.ts +38 -15
- package/dist/components/BbCalendar/useDayjsLocale.js +31 -30
- package/dist/components/BbCheckbox/BbCheckbox.vue_vue_type_script_setup_true_lang.js +48 -48
- package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +81 -80
- package/dist/components/BbCheckboxGroup/types.d.ts +6 -2
- package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +69 -69
- package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +363 -349
- package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +91 -86
- package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +298 -289
- package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +322 -356
- package/dist/components/BbDropdown/DropdownPipelineResolver.vue_vue_type_script_setup_true_lang.js +17 -15
- package/dist/components/BbDropdown/DropdownRow.vue.d.ts +40 -0
- package/dist/components/BbDropdown/DropdownRow.vue.js +5 -0
- package/dist/components/BbDropdown/DropdownRow.vue_vue_type_script_setup_true_lang.js +60 -0
- package/dist/components/BbDropdown/normalizeGroups.d.ts +8 -2
- package/dist/components/BbDropdown/normalizeGroups.js +60 -46
- package/dist/components/BbDropdown/types.d.ts +119 -88
- package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +11 -2
- package/dist/components/BbDropdownButton/types.d.ts +2 -2
- package/dist/components/BbForm/BbForm.vue.d.ts +9 -0
- package/dist/components/BbForm/BbForm.vue_vue_type_script_setup_true_lang.js +114 -105
- package/dist/components/BbForm/BbFormCustomField.js +1 -1
- package/dist/components/BbForm/bindFormField.js +2 -1
- package/dist/components/BbForm/formFields.d.ts +5 -0
- package/dist/components/BbNumberInput/BbNumberInput.vue.d.ts +0 -1
- package/dist/components/BbNumberInput/BbNumberInput.vue_vue_type_script_setup_true_lang.js +452 -125
- package/dist/components/BbNumberInput/numberDisplay.d.ts +256 -0
- package/dist/components/BbNumberInput/numberDisplay.js +499 -0
- package/dist/components/BbNumberInput/types.d.ts +54 -1
- package/dist/components/BbNumberInput/warroom/corpus.d.ts +58 -0
- package/dist/components/BbNumberInput/warroom/currency-verify.rows.d.ts +28 -0
- package/dist/components/BbNumberInput/warroom/currency.rows.d.ts +2 -0
- package/dist/components/BbNumberInput/warroom/harness.d.ts +217 -0
- package/dist/components/BbNumberInput/warroom/oracle.d.ts +150 -0
- package/dist/components/BbPagination/BbPagination.vue_vue_type_script_setup_true_lang.js +7 -7
- package/dist/components/BbPopover/BbPopover.vue.d.ts +1 -0
- package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +207 -164
- package/dist/components/BbPopover/types.d.ts +11 -0
- package/dist/components/BbProgress/BbProgress.vue_vue_type_script_setup_true_lang.js +15 -7
- package/dist/components/BbProgress/types.d.ts +23 -7
- package/dist/components/BbProgress/types.js +1 -1
- package/dist/components/BbRadioGroup/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +102 -101
- package/dist/components/BbRadioGroup/types.d.ts +6 -2
- package/dist/components/BbRating/BbRating.vue_vue_type_script_setup_true_lang.js +63 -63
- package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +156 -154
- package/dist/components/BbSelect/types.d.ts +6 -2
- package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +2 -1
- package/dist/components/BbSelectPopover/types.d.ts +6 -2
- package/dist/components/BbSlider/BbSlider.vue_vue_type_script_setup_true_lang.js +153 -153
- package/dist/components/BbSwitch/BbSwitch.vue_vue_type_script_setup_true_lang.js +62 -62
- package/dist/components/BbSwitchGroup/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +131 -130
- package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +711 -676
- package/dist/components/BbTabs/BbTabs.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/BbTabs/BbTabsList.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/BbTabs/types.d.ts +25 -21
- package/dist/components/BbTag/BbTag.vue_vue_type_script_setup_true_lang.js +76 -76
- package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +58 -58
- package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +82 -82
- package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +246 -236
- package/dist/components/BbTooltip/BbTooltip.vue_vue_type_script_setup_true_lang.js +102 -97
- package/dist/components/BbTooltip/tooltipWarmup.d.ts +23 -0
- package/dist/components/BbTooltip/tooltipWarmup.js +7 -0
- package/dist/components/BbTooltip/types.d.ts +7 -2
- package/dist/components/BbTree/BbTree.vue_vue_type_script_setup_true_lang.js +29 -21
- package/dist/components/BbTree/BbTreeLevel.vue_vue_type_script_setup_true_lang.js +10 -7
- package/dist/components/CommonFieldInput/CommonFieldInput.vue_vue_type_script_setup_true_lang.js +37 -36
- package/dist/components/CommonTimeSelector/CommonTimeSelector.vue_vue_type_script_setup_true_lang.js +9 -9
- package/dist/composables/formSubmitLock.d.ts +6 -0
- package/dist/composables/formSubmitLock.js +4 -0
- package/dist/composables/useBaseOptions.d.ts +7 -1
- package/dist/composables/useBaseOptions.js +32 -32
- package/dist/composables/useBbDropdownContext.d.ts +8 -8
- package/dist/composables/useBbFormField.d.ts +9 -0
- package/dist/composables/useBbFormField.js +5 -3
- package/dist/composables/useBbTabsContext.d.ts +10 -10
- package/dist/composables/useBbTabsContext.js +18 -18
- package/dist/composables/useFormBinding.d.ts +11 -0
- package/dist/composables/useFormBinding.js +15 -13
- package/dist/composables/useItemText.d.ts +5 -1
- package/dist/composables/useItemText.js +8 -3
- package/dist/composables/useItemValue.d.ts +5 -1
- package/dist/composables/useItemValue.js +8 -3
- package/dist/composables/useLocale.js +10 -9
- package/dist/deprecation/ai-deprecations.json.d.ts +130 -0
- package/dist/deprecation/ai-deprecations.json.js +1 -1
- package/dist/deprecation/removedProps.js +1 -1
- package/dist/directives/bbDropdown.js +1 -1
- package/dist/i18n/index.d.ts +7 -12
- package/dist/i18n/locales/cs.json +11 -14
- package/dist/i18n/locales/da.json +13 -16
- package/dist/i18n/locales/de-CH.json +137 -0
- package/dist/i18n/locales/de.json +14 -17
- package/dist/i18n/locales/el.json +10 -13
- package/dist/i18n/locales/en-GB.json +137 -0
- package/dist/i18n/locales/en.json +8 -11
- package/dist/i18n/locales/es-MX.json +137 -0
- package/dist/i18n/locales/es.json +16 -19
- package/dist/i18n/locales/fi.json +8 -11
- package/dist/i18n/locales/fr.json +23 -26
- package/dist/i18n/locales/hu.json +8 -11
- package/dist/i18n/locales/it.json +12 -15
- package/dist/i18n/locales/ja.json +13 -16
- package/dist/i18n/locales/ko.json +10 -13
- package/dist/i18n/locales/nb.json +13 -16
- package/dist/i18n/locales/nl.json +21 -24
- package/dist/i18n/locales/pl.json +10 -13
- package/dist/i18n/locales/{pt.json → pt-BR.json} +19 -22
- package/dist/i18n/locales/pt-PT.json +137 -0
- package/dist/i18n/locales/ro.json +22 -25
- package/dist/i18n/locales/ru.json +11 -14
- package/dist/i18n/locales/sv.json +16 -19
- package/dist/i18n/locales/tr.json +14 -17
- package/dist/i18n/locales/uk.json +11 -14
- package/dist/i18n/locales/{zh-cn.json → zh-CN.json} +10 -13
- package/dist/i18n/locales/zh-HK.json +137 -0
- package/dist/i18n/locales/zh-TW.json +137 -0
- package/dist/i18n/regionHints.d.ts +16 -0
- package/dist/i18n/regionHints.js +49 -0
- package/dist/i18n/regions.d.ts +286 -0
- package/dist/i18n/regions.js +265 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +4 -4
- package/dist/llms-full.txt +1785 -1637
- package/dist/llms-medium.txt +74 -46
- package/dist/llms.txt +7 -7
- package/dist/locale-blueprint.json +16 -13
- package/dist/styles.css +2 -2
- package/dist/types/ptComponentMap.d.ts +1 -1
- package/dist/utilities/functions/slotKey.d.ts +2 -2
- package/dist/utils/versionCheck.js +1 -1
- package/dist/vite-plugin.d.ts +22 -19
- package/dist/vite.js +309 -297
- package/llms.txt +7 -7
- package/package.json +5 -3
- package/scripts/lib/agent-manifest.mjs +2 -1
- package/scripts/lib/eslint-disable.mjs +12 -4
- package/scripts/lib/eslint-plugin.d.ts +5 -1
- package/scripts/lib/eslint-plugin.mjs +187 -6
- package/scripts/lib/helper-canon.mjs +176 -0
- package/scripts/lib/helpers-add.mjs +1303 -0
- package/scripts/lib/local-components.mjs +33 -4
- package/scripts/lib/locale-check.mjs +165 -0
- package/scripts/lib/redundant-item-accessor.mjs +398 -0
- package/scripts/lib/renamed-item-field.mjs +343 -0
- package/scripts/lib/slot-key.mjs +2 -2
- package/scripts/lib/slot-renames.mjs +1 -1
- package/scripts/lib/validate-bb-markup.mjs +123 -56
- package/dist/i18n/index.js +0 -27
|
@@ -177,9 +177,13 @@ export type BbTabsItem<K extends string = string> = BbTabsInertiaOptions & {
|
|
|
177
177
|
*/
|
|
178
178
|
href?: string;
|
|
179
179
|
/**
|
|
180
|
-
*
|
|
180
|
+
* Identifies the tab: what `v-model` holds while it is the active one, the
|
|
181
|
+
* name of its slots (`#<value>` for its panel, `#<value>:label` for its
|
|
182
|
+
* trigger, through `slotKey`) and, with `navigation`, the URL slug.
|
|
181
183
|
*/
|
|
182
|
-
|
|
184
|
+
value: K;
|
|
185
|
+
/** Tabs have no `key` (that is `value`). Guards against the old shape. */
|
|
186
|
+
key?: never;
|
|
183
187
|
/**
|
|
184
188
|
* Label to use as the tab text.
|
|
185
189
|
*/
|
|
@@ -196,7 +200,7 @@ export type BbTabsItem<K extends string = string> = BbTabsInertiaOptions & {
|
|
|
196
200
|
* Passthrough parts of `BbTabs` (plans/passthrough/BbTabs.md). Tabs do not
|
|
197
201
|
* "open", so there is no `open` state.
|
|
198
202
|
*
|
|
199
|
-
* Per-item functions: on the instance, `item` also accepts `({ item, active, … }) => PtValue | false | null | undefined` — `item` is the tab's descriptor (the element of `items`: its `
|
|
203
|
+
* Per-item functions: on the instance, `item` also accepts `({ item, active, … }) => PtValue | false | null | undefined` — `item` is the tab's descriptor (the element of `items`: its `value`, `label`, anything else you put on it), and every state a boolean beside it, on for it (`active`, `disabled`, …) — in the `pt` object or the `:pt:item` attribute, never on a `item:<state>` key and never in the global map or a scope (they ship as JSON). Its result is merged last, after every state entry, through the same deduper; a falsy result leaves the trigger as it was. No other part takes a function. See the passthrough guide, _Per-item functions_.
|
|
200
204
|
*
|
|
201
205
|
* @part root - The tabs' outer element, around the strip and the panels.
|
|
202
206
|
* @part wrapper - The strip's outer element: the `wrapper:prepend` slot, the
|
|
@@ -397,9 +401,9 @@ export type BbTabsRootProps<K extends string = string> =
|
|
|
397
401
|
*/
|
|
398
402
|
manualActivation?: boolean;
|
|
399
403
|
/**
|
|
400
|
-
* The
|
|
404
|
+
* The active tab's `value`. Used by v-model.
|
|
401
405
|
*/
|
|
402
|
-
modelValue?: null | BbTabsItem<K>['
|
|
406
|
+
modelValue?: null | BbTabsItem<K>['value'];
|
|
403
407
|
/**
|
|
404
408
|
* Synchronizes the current tab with the URL query parameter.
|
|
405
409
|
*
|
|
@@ -500,8 +504,8 @@ export type BbTabsRootEvents<K extends string = string> = BbTabsEvents<K>;
|
|
|
500
504
|
|
|
501
505
|
/** Props exposed by the per-tab label slots and the generic `label` fallback slot. */
|
|
502
506
|
export type BbTabsSlotProps<K extends string = string> = {
|
|
503
|
-
/** The
|
|
504
|
-
current: BbTabsItem<K>['
|
|
507
|
+
/** The `value` of the currently active tab. */
|
|
508
|
+
current: BbTabsItem<K>['value'] | null;
|
|
505
509
|
/** Zero-based index of the currently active tab. */
|
|
506
510
|
currentIndex: number;
|
|
507
511
|
/** Whether this tab is disabled. */
|
|
@@ -512,10 +516,10 @@ export type BbTabsSlotProps<K extends string = string> = {
|
|
|
512
516
|
isLast: boolean;
|
|
513
517
|
/** Whether this specific tab is currently active. */
|
|
514
518
|
selected: boolean;
|
|
515
|
-
/**
|
|
516
|
-
|
|
517
|
-
/**
|
|
518
|
-
value: BbTabsItem<K>['
|
|
519
|
+
/** This tab's `label`. */
|
|
520
|
+
label: BbTabsItem<K>['label'];
|
|
521
|
+
/** This tab's `value`. */
|
|
522
|
+
value: BbTabsItem<K>['value'];
|
|
519
523
|
/** Navigate to `'first'`, `'previous'`, `'next'`, or `'last'` tab. */
|
|
520
524
|
goTo: (target: 'first' | 'previous' | 'next' | 'last') => void;
|
|
521
525
|
};
|
|
@@ -538,7 +542,7 @@ export type BbTabsScrollSlotProps = {
|
|
|
538
542
|
/**
|
|
539
543
|
* Slots rendered by the tab list (the strip of triggers).
|
|
540
544
|
*
|
|
541
|
-
* @dynamicSlot `<
|
|
545
|
+
* @dynamicSlot `<value>:label` {BbTabsSlotProps<K>} - One tab trigger's label, by the tab's `value` through `slotKey`; beats `label`, which beats the item's `label` text.
|
|
542
546
|
*/
|
|
543
547
|
export type BbTabsListSlots<K extends string = string> = {
|
|
544
548
|
/**
|
|
@@ -550,16 +554,16 @@ export type BbTabsListSlots<K extends string = string> = {
|
|
|
550
554
|
*/
|
|
551
555
|
'wrapper:append'?: (props: BbTabsScrollSlotProps) => any;
|
|
552
556
|
/**
|
|
553
|
-
* Fallback slot used for all tab labels when no per-tab `<
|
|
557
|
+
* Fallback slot used for all tab labels when no per-tab `<value>:label` slot is provided.
|
|
554
558
|
*/
|
|
555
559
|
label?: (props: BbTabsSlotProps<K>) => any;
|
|
556
560
|
} & Record<string, ((props: BbTabsSlotProps<K>) => any) | undefined>;
|
|
557
561
|
|
|
558
562
|
/**
|
|
559
563
|
* Slots rendered by the tab panels — one per tab, keyed by the normalized
|
|
560
|
-
* `slotKey(
|
|
564
|
+
* `slotKey(value)`.
|
|
561
565
|
*
|
|
562
|
-
* @dynamicSlot `<
|
|
566
|
+
* @dynamicSlot `<value>` {BbTabsSlotProps<K>} - One tab's content panel, by the tab's `value` through `slotKey`; no fallback (an empty panel).
|
|
563
567
|
*/
|
|
564
568
|
export type BbTabsPanelsSlots<K extends string = string> = Record<
|
|
565
569
|
string,
|
|
@@ -567,16 +571,16 @@ export type BbTabsPanelsSlots<K extends string = string> = Record<
|
|
|
567
571
|
>;
|
|
568
572
|
|
|
569
573
|
/**
|
|
570
|
-
* @dynamicSlot `<
|
|
571
|
-
* @dynamicSlot `<
|
|
574
|
+
* @dynamicSlot `<value>` {BbTabsSlotProps<K>} - One tab's content panel, by the tab's `value` through `slotKey`; no fallback (an empty panel).
|
|
575
|
+
* @dynamicSlot `<value>:label` {BbTabsSlotProps<K>} - One tab trigger's label, by the tab's `value` through `slotKey`; beats `label`, which beats the item's `label` text.
|
|
572
576
|
*/
|
|
573
577
|
export type BbTabsSlots<K extends string = string> = BbTabsListSlots<K> &
|
|
574
578
|
BbTabsPanelsSlots<K>;
|
|
575
579
|
|
|
576
580
|
/** Props exposed by the `BbTabsRoot` default slot. */
|
|
577
581
|
export type BbTabsRootSlotProps<K extends string = string> = {
|
|
578
|
-
/** The
|
|
579
|
-
current: BbTabsItem<K>['
|
|
582
|
+
/** The `value` of the currently active tab. */
|
|
583
|
+
current: BbTabsItem<K>['value'] | null;
|
|
580
584
|
/** Zero-based index of the currently active tab. */
|
|
581
585
|
currentIndex: number;
|
|
582
586
|
/** Whether the active tab is the first tab. */
|
|
@@ -585,8 +589,8 @@ export type BbTabsRootSlotProps<K extends string = string> = {
|
|
|
585
589
|
isLast: boolean;
|
|
586
590
|
/** Navigate to `'first'`, `'previous'`, `'next'`, or `'last'` tab. */
|
|
587
591
|
goTo: (target: 'first' | 'previous' | 'next' | 'last') => void;
|
|
588
|
-
/** Select a tab by
|
|
589
|
-
select: (
|
|
592
|
+
/** Select a tab by its `value`. */
|
|
593
|
+
select: (value: BbTabsItem<K>['value']) => void;
|
|
590
594
|
};
|
|
591
595
|
|
|
592
596
|
export type BbTabsRootSlots<K extends string = string> = {
|
package/dist/ai/source/BbTag.md
CHANGED
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
:loading="loading"
|
|
29
29
|
:name="name"
|
|
30
30
|
:passthrough="passthrough"
|
|
31
|
-
:readonly="
|
|
31
|
+
:readonly="fieldReadonly"
|
|
32
32
|
:reverse="reverse"
|
|
33
33
|
:show-asterisk="showAsterisk"
|
|
34
34
|
:show-hint="showHint"
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
:loading="loading"
|
|
67
67
|
:passthrough="passthrough"
|
|
68
68
|
:prepend:icon="props['prepend:icon']"
|
|
69
|
-
:readonly="
|
|
69
|
+
:readonly="fieldReadonly"
|
|
70
70
|
:variant="variant"
|
|
71
71
|
@click="onWrapperClick"
|
|
72
72
|
@click:clear="onClear"
|
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
<template v-else>
|
|
89
89
|
<ChipsBox
|
|
90
90
|
ref="chipsBox"
|
|
91
|
-
:disabled="disabled ||
|
|
91
|
+
:disabled="disabled || fieldReadonly"
|
|
92
92
|
:options="selectedOptions"
|
|
93
93
|
:passthrough="passthrough"
|
|
94
94
|
size="lg"
|
|
@@ -105,14 +105,14 @@
|
|
|
105
105
|
:aria-disabled="disabled || undefined"
|
|
106
106
|
:aria-invalid="fieldHasErrors || undefined"
|
|
107
107
|
:aria-labelledby="ariaLabelledby"
|
|
108
|
-
:aria-readonly="
|
|
108
|
+
:aria-readonly="fieldReadonly || undefined"
|
|
109
109
|
:autocomplete="autocomplete"
|
|
110
110
|
:autofocus="autofocus"
|
|
111
111
|
class="bb-tag__input"
|
|
112
112
|
:disabled="disabled"
|
|
113
113
|
enterkeyhint="done"
|
|
114
114
|
:placeholder="placeholder"
|
|
115
|
-
:readonly="
|
|
115
|
+
:readonly="fieldReadonly"
|
|
116
116
|
:required="fieldRequired && !fieldModel.length"
|
|
117
117
|
:aria-required="inputAriaRequired"
|
|
118
118
|
size="1"
|
|
@@ -189,6 +189,7 @@ const {
|
|
|
189
189
|
required: fieldRequired,
|
|
190
190
|
ariaRequired: fieldAriaRequired,
|
|
191
191
|
model: fieldModel,
|
|
192
|
+
readonly: fieldReadonly,
|
|
192
193
|
} = useFormBinding(declaredProps, declaredEmit, {
|
|
193
194
|
componentName: 'BbTag',
|
|
194
195
|
identifierFallback: () => declaredProps.label,
|
|
@@ -1111,19 +1112,19 @@ export type BbTagSlots = {
|
|
|
1111
1112
|
|
|
1112
1113
|
.bb-smooth-height {
|
|
1113
1114
|
align-self: center;
|
|
1114
|
-
text-align:
|
|
1115
|
+
text-align: start;
|
|
1115
1116
|
width: 100%;
|
|
1116
1117
|
}
|
|
1117
1118
|
|
|
1118
1119
|
/* If there is no prepend icon, reduce left inset without clipping chip content. Also allow for the ring size to be displayed. */
|
|
1119
1120
|
&:not(:has(.bb-field-input__prepend-icon)) {
|
|
1120
1121
|
.bb-smooth-height:has(.bb-tag__badge) {
|
|
1121
|
-
margin-
|
|
1122
|
+
margin-inline-start: calc(
|
|
1122
1123
|
var(--bb-input-px) * var(--compensation-multiplier) * -1 -
|
|
1123
1124
|
var(--bb-ring-size)
|
|
1124
1125
|
);
|
|
1125
1126
|
.bb-tag__input-container {
|
|
1126
|
-
padding-
|
|
1127
|
+
padding-inline-start: var(--bb-ring-size);
|
|
1127
1128
|
}
|
|
1128
1129
|
}
|
|
1129
1130
|
}
|
|
@@ -1141,7 +1142,7 @@ export type BbTagSlots = {
|
|
|
1141
1142
|
width: 100%;
|
|
1142
1143
|
|
|
1143
1144
|
.bb-tag__badge:not(:last-child) {
|
|
1144
|
-
margin-
|
|
1145
|
+
margin-inline-end: 0.25rem;
|
|
1145
1146
|
}
|
|
1146
1147
|
|
|
1147
1148
|
.bb-tag__input {
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
:mobile="isMobile"
|
|
31
31
|
:name="name"
|
|
32
32
|
:passthrough="passthrough"
|
|
33
|
-
:readonly="
|
|
33
|
+
:readonly="fieldReadonly"
|
|
34
34
|
:reverse="reverse"
|
|
35
35
|
:show-asterisk="showAsterisk"
|
|
36
36
|
:show-hint="showHint"
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
:loading="loading"
|
|
62
62
|
:passthrough="passthrough"
|
|
63
63
|
:prepend:icon="declaredProps['prepend:icon']"
|
|
64
|
-
:readonly="
|
|
64
|
+
:readonly="fieldReadonly"
|
|
65
65
|
:reserve-append-space="clearable"
|
|
66
66
|
:variant="variant"
|
|
67
67
|
@click:clear="emit('update:modelValue', emptyValue())"
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
:aria-disabled="disabled || undefined"
|
|
78
78
|
:aria-invalid="fieldHasErrors || undefined"
|
|
79
79
|
:aria-labelledby="ariaLabelledby"
|
|
80
|
-
:aria-readonly="
|
|
80
|
+
:aria-readonly="fieldReadonly || undefined"
|
|
81
81
|
:autocomplete="autocomplete"
|
|
82
82
|
:autofocus="autofocus"
|
|
83
83
|
class="bb-text-input__input"
|
|
@@ -85,7 +85,7 @@
|
|
|
85
85
|
:inputmode="inputMode"
|
|
86
86
|
:name="name"
|
|
87
87
|
:placeholder="placeholder"
|
|
88
|
-
:readonly="
|
|
88
|
+
:readonly="fieldReadonly"
|
|
89
89
|
:required="fieldRequired"
|
|
90
90
|
:aria-required="fieldAriaRequired"
|
|
91
91
|
size="1"
|
|
@@ -161,6 +161,7 @@ const {
|
|
|
161
161
|
errors: fieldErrors,
|
|
162
162
|
required: fieldRequired,
|
|
163
163
|
ariaRequired: fieldAriaRequired,
|
|
164
|
+
readonly: fieldReadonly,
|
|
164
165
|
} = useFormBinding(declaredProps, declaredEmit, {
|
|
165
166
|
componentName: 'BbTextInput',
|
|
166
167
|
identifierFallback: () => declaredProps.label,
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
:loading="loading"
|
|
30
30
|
:name="name"
|
|
31
31
|
:passthrough="passthrough"
|
|
32
|
-
:readonly="
|
|
32
|
+
:readonly="fieldReadonly"
|
|
33
33
|
:reverse="reverse"
|
|
34
34
|
:show-asterisk="showAsterisk"
|
|
35
35
|
:show-hint="showHint"
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
:loading="loading"
|
|
65
65
|
:passthrough="passthrough"
|
|
66
66
|
:prepend:icon="declaredProps['prepend:icon']"
|
|
67
|
-
:readonly="
|
|
67
|
+
:readonly="fieldReadonly"
|
|
68
68
|
:reserve-append-space="clearable"
|
|
69
69
|
:variant="variant"
|
|
70
70
|
@click:clear="emit('update:modelValue', emptyValue())"
|
|
@@ -81,14 +81,14 @@
|
|
|
81
81
|
:aria-disabled="disabled || undefined"
|
|
82
82
|
:aria-invalid="fieldHasErrors || undefined"
|
|
83
83
|
:aria-labelledby="ariaLabelledby"
|
|
84
|
-
:aria-readonly="
|
|
84
|
+
:aria-readonly="fieldReadonly || undefined"
|
|
85
85
|
:autocomplete="autocomplete"
|
|
86
86
|
:autofocus="autofocus"
|
|
87
87
|
class="bb-textarea__input scrollbar-border"
|
|
88
88
|
:disabled="disabled"
|
|
89
89
|
:name="name"
|
|
90
90
|
:placeholder="placeholder"
|
|
91
|
-
:readonly="
|
|
91
|
+
:readonly="fieldReadonly"
|
|
92
92
|
:required="fieldRequired"
|
|
93
93
|
:aria-required="fieldAriaRequired"
|
|
94
94
|
:rows="renderedRows"
|
|
@@ -161,6 +161,7 @@ const {
|
|
|
161
161
|
errors: fieldErrors,
|
|
162
162
|
required: fieldRequired,
|
|
163
163
|
ariaRequired: fieldAriaRequired,
|
|
164
|
+
readonly: fieldReadonly,
|
|
164
165
|
} = useFormBinding(declaredProps, declaredEmit, {
|
|
165
166
|
componentName: 'BbTextarea',
|
|
166
167
|
identifierFallback: () => declaredProps.label,
|
|
@@ -824,7 +825,7 @@ export type BbTextareaSlots = {
|
|
|
824
825
|
.bb-smooth-height {
|
|
825
826
|
align-self: center;
|
|
826
827
|
flex: 1 1 auto;
|
|
827
|
-
text-align:
|
|
828
|
+
text-align: start;
|
|
828
829
|
}
|
|
829
830
|
|
|
830
831
|
.bb-field-input__box {
|
|
@@ -844,7 +844,7 @@ export type BbTimePickerSlots = {
|
|
|
844
844
|
rail sizing (and the mobile-sheet centring/touch scale) is shared with the
|
|
845
845
|
time input's panel in CommonTimeSelector/index.css. */
|
|
846
846
|
.bb-time-selector {
|
|
847
|
-
margin-
|
|
847
|
+
margin-inline-start: 0;
|
|
848
848
|
}
|
|
849
849
|
}
|
|
850
850
|
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
:loading="loading"
|
|
29
29
|
:name="name"
|
|
30
30
|
:passthrough="passthrough"
|
|
31
|
-
:readonly="
|
|
31
|
+
:readonly="fieldReadonly"
|
|
32
32
|
:reverse="reverse"
|
|
33
33
|
:show-asterisk="showAsterisk"
|
|
34
34
|
:show-hint="showHint"
|
|
@@ -64,7 +64,7 @@
|
|
|
64
64
|
:loading="loading"
|
|
65
65
|
:passthrough="passthrough"
|
|
66
66
|
:prepend:icon="props['prepend:icon']"
|
|
67
|
-
:readonly="
|
|
67
|
+
:readonly="fieldReadonly"
|
|
68
68
|
:variant="variant"
|
|
69
69
|
@click="onFieldTap"
|
|
70
70
|
@click:clear="onClickClear"
|
|
@@ -169,7 +169,7 @@
|
|
|
169
169
|
:class="{
|
|
170
170
|
'bb-segmented-field__activator--active': shown,
|
|
171
171
|
}"
|
|
172
|
-
:disabled="disabled ||
|
|
172
|
+
:disabled="disabled || fieldReadonly"
|
|
173
173
|
type="button"
|
|
174
174
|
@click.stop="open"
|
|
175
175
|
v-bind="passthrough.activator"
|
|
@@ -203,7 +203,7 @@
|
|
|
203
203
|
<DefinePanel>
|
|
204
204
|
<CommonTimeSelector
|
|
205
205
|
:ampm="ampm"
|
|
206
|
-
:disabled="disabled ||
|
|
206
|
+
:disabled="disabled || fieldReadonly"
|
|
207
207
|
:hour="panelHour"
|
|
208
208
|
:max="max"
|
|
209
209
|
:meridiem="fields[timeTargetSegment].meridiem"
|
|
@@ -309,6 +309,7 @@ import CommonPopover from '../CommonPopover/CommonPopover.vue';
|
|
|
309
309
|
import CommonTimeSelector from '../CommonTimeSelector/CommonTimeSelector.vue';
|
|
310
310
|
import type { TimeUnit } from '../CommonTimeSelector/types';
|
|
311
311
|
import { useMeridiem } from '../CommonTimeSelector/useMeridiem';
|
|
312
|
+
import { formatDateOf, timeFieldsOf } from '../BbCalendar/useDayjsLocale';
|
|
312
313
|
import {
|
|
313
314
|
BB_TIME_PICKER_INPUT_PT,
|
|
314
315
|
type BbTimePickerInputEvents,
|
|
@@ -339,6 +340,7 @@ const {
|
|
|
339
340
|
required: fieldRequired,
|
|
340
341
|
ariaRequired: fieldAriaRequired,
|
|
341
342
|
model: fieldModel,
|
|
343
|
+
readonly: fieldReadonly,
|
|
342
344
|
} = useFormBinding(declaredProps, declaredEmit, {
|
|
343
345
|
componentName: 'BbTimePickerInput',
|
|
344
346
|
identifierFallback: () => declaredProps.label,
|
|
@@ -1028,6 +1030,13 @@ const onFieldTap = (event: MouseEvent) => {
|
|
|
1028
1030
|
return;
|
|
1029
1031
|
open();
|
|
1030
1032
|
};
|
|
1033
|
+
/** A key that would change a segment's value (step, clear, type). */
|
|
1034
|
+
const changesSegment = (event: KeyboardEvent) =>
|
|
1035
|
+
event.key === 'ArrowUp' ||
|
|
1036
|
+
event.key === 'ArrowDown' ||
|
|
1037
|
+
event.key === 'Backspace' ||
|
|
1038
|
+
event.key === 'Delete' ||
|
|
1039
|
+
(event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey);
|
|
1031
1040
|
const onSegmentKeydown = (
|
|
1032
1041
|
descriptor: FieldDescriptor,
|
|
1033
1042
|
event: KeyboardEvent
|
|
@@ -1037,6 +1046,12 @@ const onSegmentKeydown = (
|
|
|
1037
1046
|
if (!shown.value) open();
|
|
1038
1047
|
return;
|
|
1039
1048
|
}
|
|
1049
|
+
// Q60.17: a read-only field (its `readonly`, or its form saving) refuses
|
|
1050
|
+
// the keys that change a segment; moving between segments still works.
|
|
1051
|
+
if (props.readonly && changesSegment(event)) {
|
|
1052
|
+
event.preventDefault();
|
|
1053
|
+
return;
|
|
1054
|
+
}
|
|
1040
1055
|
onFieldKeydown(descriptor, event);
|
|
1041
1056
|
};
|
|
1042
1057
|
|
|
@@ -1098,15 +1113,37 @@ const onTimeSelect = ({ unit, value }: { unit: TimeUnit; value: string }) => {
|
|
|
1098
1113
|
|
|
1099
1114
|
// ── Accessible button label ─────────────────────────────────────────────────
|
|
1100
1115
|
|
|
1116
|
+
/**
|
|
1117
|
+
* A `HH:mm(:ss)` model value as the locale says a time (Intl, CLDR): 12-hour
|
|
1118
|
+
* with the locale's day period when the field shows `ampm` ("3:05 PM",
|
|
1119
|
+
* "午後3:05"), else 24-hour ("15:05", fi "15.05"). A value that doesn't parse
|
|
1120
|
+
* is read as written.
|
|
1121
|
+
*/
|
|
1122
|
+
const spokenTime = (value: string) => {
|
|
1123
|
+
const match = /^(\d{1,2}):(\d{1,2})(?::(\d{1,2}))?$/.exec(value);
|
|
1124
|
+
if (!match) return value;
|
|
1125
|
+
const [, h, m, s] = match;
|
|
1126
|
+
return formatDateOf(
|
|
1127
|
+
new Date(2000, 0, 1, +h, +m, +(s ?? 0)),
|
|
1128
|
+
config.locale,
|
|
1129
|
+
timeFieldsOf(!!props.ampm, !!props.seconds)
|
|
1130
|
+
);
|
|
1131
|
+
};
|
|
1132
|
+
|
|
1101
1133
|
const accessibleButtonLabel = computed(() => {
|
|
1102
1134
|
if (props.range) {
|
|
1103
1135
|
const values = Array.isArray(props.modelValue) ? props.modelValue : [];
|
|
1104
1136
|
const [start, end] = values;
|
|
1105
1137
|
if (!start || !end) return t('timePickerInput.emptyRange').value;
|
|
1106
|
-
return t(
|
|
1138
|
+
return t(
|
|
1139
|
+
'timePickerInput.changeSelectionRange',
|
|
1140
|
+
spokenTime(start),
|
|
1141
|
+
spokenTime(end)
|
|
1142
|
+
).value;
|
|
1107
1143
|
}
|
|
1108
1144
|
if (typeof props.modelValue === 'string' && props.modelValue) {
|
|
1109
|
-
return t('timePickerInput.changeSelection', props.modelValue)
|
|
1145
|
+
return t('timePickerInput.changeSelection', spokenTime(props.modelValue))
|
|
1146
|
+
.value;
|
|
1110
1147
|
}
|
|
1111
1148
|
return t('timePickerInput.emptySelection').value;
|
|
1112
1149
|
});
|
|
@@ -1563,9 +1600,9 @@ export type BbTimePickerInputSlots = {
|
|
|
1563
1600
|
.bb-time-picker-input__panel {
|
|
1564
1601
|
/* The panel hosts only the time columns — no calendar to align with. */
|
|
1565
1602
|
.bb-time-selector {
|
|
1566
|
-
border-
|
|
1567
|
-
margin-
|
|
1568
|
-
padding-
|
|
1603
|
+
border-inline-start: 0;
|
|
1604
|
+
margin-inline-start: 0;
|
|
1605
|
+
padding-inline-start: 0;
|
|
1569
1606
|
}
|
|
1570
1607
|
}
|
|
1571
1608
|
|
|
@@ -383,14 +383,17 @@ export type BbToastProps = {
|
|
|
383
383
|
}
|
|
384
384
|
.bb-toast--top-left,
|
|
385
385
|
.bb-toast--bottom-left {
|
|
386
|
+
/* stylelint-disable-next-line property-disallowed-list -- geometry: the `position` prop names a physical corner */
|
|
386
387
|
left: calc(var(--offset) + var(--safe-h, 0px));
|
|
387
388
|
}
|
|
388
389
|
.bb-toast--top-right,
|
|
389
390
|
.bb-toast--bottom-right {
|
|
391
|
+
/* stylelint-disable-next-line property-disallowed-list -- geometry: the `position` prop names a physical corner */
|
|
390
392
|
right: calc(var(--offset) + var(--safe-h, 0px));
|
|
391
393
|
}
|
|
392
394
|
.bb-toast--top-center,
|
|
393
395
|
.bb-toast--bottom-center {
|
|
396
|
+
/* stylelint-disable-next-line property-disallowed-list -- geometry: centred with a physical translate */
|
|
394
397
|
left: 50%;
|
|
395
398
|
transform: translateX(-50%);
|
|
396
399
|
}
|
|
@@ -440,11 +443,11 @@ export type BbToastProps = {
|
|
|
440
443
|
box-sizing: border-box;
|
|
441
444
|
color: var(--fg);
|
|
442
445
|
height: var(--toast-height);
|
|
443
|
-
|
|
446
|
+
inset-inline-end: 0;
|
|
447
|
+
inset-inline-start: 0;
|
|
444
448
|
overflow: hidden;
|
|
445
449
|
pointer-events: auto;
|
|
446
450
|
position: absolute;
|
|
447
|
-
right: 0;
|
|
448
451
|
touch-action: none;
|
|
449
452
|
|
|
450
453
|
transform: translate3d(
|
|
@@ -587,7 +590,7 @@ export type BbToastProps = {
|
|
|
587
590
|
/* Portal content fills the row (no icon column) and leaves room for the close
|
|
588
591
|
* button when one is shown. */
|
|
589
592
|
.bb-toast__content--portal {
|
|
590
|
-
padding-
|
|
593
|
+
padding-inline-end: 4px;
|
|
591
594
|
}
|
|
592
595
|
|
|
593
596
|
.bb-toast__close {
|
|
@@ -599,11 +602,11 @@ export type BbToastProps = {
|
|
|
599
602
|
cursor: pointer;
|
|
600
603
|
display: flex;
|
|
601
604
|
height: 22px;
|
|
605
|
+
inset-inline-end: 8px;
|
|
602
606
|
justify-content: center;
|
|
603
607
|
opacity: 0;
|
|
604
608
|
padding: 0;
|
|
605
609
|
position: absolute;
|
|
606
|
-
right: 8px;
|
|
607
610
|
top: 8px;
|
|
608
611
|
transition:
|
|
609
612
|
opacity 0.15s var(--bb-ease),
|
|
@@ -657,8 +660,8 @@ export type BbToastProps = {
|
|
|
657
660
|
@media (max-width: 600px) {
|
|
658
661
|
.bb-toast {
|
|
659
662
|
--offset: 14px;
|
|
660
|
-
|
|
661
|
-
|
|
663
|
+
inset-inline-end: var(--offset);
|
|
664
|
+
inset-inline-start: var(--offset);
|
|
662
665
|
width: auto;
|
|
663
666
|
}
|
|
664
667
|
.bb-toast--top-center,
|
|
@@ -696,8 +699,8 @@ export type BbToastProps = {
|
|
|
696
699
|
--hit: 44px;
|
|
697
700
|
content: '';
|
|
698
701
|
height: calc(var(--hit) - 2px);
|
|
702
|
+
inset-inline-end: -8px; /* the button's inset from the card corner */
|
|
699
703
|
position: absolute;
|
|
700
|
-
right: -8px; /* the button's inset from the card corner */
|
|
701
704
|
top: -8px;
|
|
702
705
|
width: var(--hit);
|
|
703
706
|
}
|
|
@@ -308,14 +308,17 @@ export type BbToastProps = {
|
|
|
308
308
|
}
|
|
309
309
|
.bb-toast--top-left,
|
|
310
310
|
.bb-toast--bottom-left {
|
|
311
|
+
/* stylelint-disable-next-line property-disallowed-list -- geometry: the `position` prop names a physical corner */
|
|
311
312
|
left: calc(var(--offset) + var(--safe-h, 0px));
|
|
312
313
|
}
|
|
313
314
|
.bb-toast--top-right,
|
|
314
315
|
.bb-toast--bottom-right {
|
|
316
|
+
/* stylelint-disable-next-line property-disallowed-list -- geometry: the `position` prop names a physical corner */
|
|
315
317
|
right: calc(var(--offset) + var(--safe-h, 0px));
|
|
316
318
|
}
|
|
317
319
|
.bb-toast--top-center,
|
|
318
320
|
.bb-toast--bottom-center {
|
|
321
|
+
/* stylelint-disable-next-line property-disallowed-list -- geometry: centred with a physical translate */
|
|
319
322
|
left: 50%;
|
|
320
323
|
transform: translateX(-50%);
|
|
321
324
|
}
|
|
@@ -365,11 +368,11 @@ export type BbToastProps = {
|
|
|
365
368
|
box-sizing: border-box;
|
|
366
369
|
color: var(--fg);
|
|
367
370
|
height: var(--toast-height);
|
|
368
|
-
|
|
371
|
+
inset-inline-end: 0;
|
|
372
|
+
inset-inline-start: 0;
|
|
369
373
|
overflow: hidden;
|
|
370
374
|
pointer-events: auto;
|
|
371
375
|
position: absolute;
|
|
372
|
-
right: 0;
|
|
373
376
|
touch-action: none;
|
|
374
377
|
|
|
375
378
|
transform: translate3d(
|
|
@@ -512,7 +515,7 @@ export type BbToastProps = {
|
|
|
512
515
|
/* Portal content fills the row (no icon column) and leaves room for the close
|
|
513
516
|
* button when one is shown. */
|
|
514
517
|
.bb-toast__content--portal {
|
|
515
|
-
padding-
|
|
518
|
+
padding-inline-end: 4px;
|
|
516
519
|
}
|
|
517
520
|
|
|
518
521
|
.bb-toast__close {
|
|
@@ -524,11 +527,11 @@ export type BbToastProps = {
|
|
|
524
527
|
cursor: pointer;
|
|
525
528
|
display: flex;
|
|
526
529
|
height: 22px;
|
|
530
|
+
inset-inline-end: 8px;
|
|
527
531
|
justify-content: center;
|
|
528
532
|
opacity: 0;
|
|
529
533
|
padding: 0;
|
|
530
534
|
position: absolute;
|
|
531
|
-
right: 8px;
|
|
532
535
|
top: 8px;
|
|
533
536
|
transition:
|
|
534
537
|
opacity 0.15s var(--bb-ease),
|
|
@@ -582,8 +585,8 @@ export type BbToastProps = {
|
|
|
582
585
|
@media (max-width: 600px) {
|
|
583
586
|
.bb-toast {
|
|
584
587
|
--offset: 14px;
|
|
585
|
-
|
|
586
|
-
|
|
588
|
+
inset-inline-end: var(--offset);
|
|
589
|
+
inset-inline-start: var(--offset);
|
|
587
590
|
width: auto;
|
|
588
591
|
}
|
|
589
592
|
.bb-toast--top-center,
|
|
@@ -621,8 +624,8 @@ export type BbToastProps = {
|
|
|
621
624
|
--hit: 44px;
|
|
622
625
|
content: '';
|
|
623
626
|
height: calc(var(--hit) - 2px);
|
|
627
|
+
inset-inline-end: -8px; /* the button's inset from the card corner */
|
|
624
628
|
position: absolute;
|
|
625
|
-
right: -8px; /* the button's inset from the card corner */
|
|
626
629
|
top: -8px;
|
|
627
630
|
width: var(--hit);
|
|
628
631
|
}
|