bitboss-ui 2.1.135 → 3.0.0-alpha.1
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/LICENSE +21 -0
- package/README.md +244 -21
- package/bin/bitboss-ui-mcp.mjs +557 -0
- package/bin/bitboss-ui.mjs +626 -0
- package/dist/ai/BbAccordion.md +522 -113
- package/dist/ai/BbAlert.md +377 -197
- package/dist/ai/BbAsterisk.md +46 -0
- package/dist/ai/BbAvatar.md +454 -178
- package/dist/ai/BbBadge.md +695 -225
- package/dist/ai/BbBadgeButton.md +54 -0
- package/dist/ai/BbBaseButton.md +489 -0
- package/dist/ai/BbBaseCheckbox.md +49 -0
- package/dist/ai/BbBaseCheckboxGroup.md +64 -0
- package/dist/ai/BbBaseCheckboxIcon.md +174 -0
- package/dist/ai/BbBaseColorInput.md +64 -0
- package/dist/ai/BbBaseColorPalette.md +39 -0
- package/dist/ai/BbBaseDatePicker.md +42 -0
- package/dist/ai/BbBaseDatePickerInput.md +73 -0
- package/dist/ai/BbBaseInputContainer.md +48 -0
- package/dist/ai/BbBaseNumberInput.md +71 -0
- package/dist/ai/BbBaseRadio.md +46 -0
- package/dist/ai/BbBaseRadioGroup.md +63 -0
- package/dist/ai/BbBaseRadioIcon.md +187 -0
- package/dist/ai/BbBaseRating.md +51 -0
- package/dist/ai/BbBaseSelect.md +88 -0
- package/dist/ai/BbBaseSlider.md +56 -0
- package/dist/ai/BbBaseSwitch.md +49 -0
- package/dist/ai/BbBaseSwitchGroup.md +64 -0
- package/dist/ai/BbBaseSwitchIcon.md +184 -0
- package/dist/ai/BbBaseTag.md +68 -0
- package/dist/ai/BbBaseTextInput.md +75 -0
- package/dist/ai/BbBaseTextarea.md +62 -0
- package/dist/ai/BbBaseTimePickerInput.md +62 -0
- package/dist/ai/BbBreadcrumbs.md +542 -503
- package/dist/ai/BbButton.md +767 -636
- package/dist/ai/BbCheckbox.md +572 -254
- package/dist/ai/BbCheckboxGroup.md +561 -361
- package/dist/ai/BbCollapsible.md +419 -103
- package/dist/ai/BbColorInput.md +529 -323
- package/dist/ai/BbColorPalette.md +565 -330
- package/dist/ai/BbConfirm.md +612 -136
- package/dist/ai/BbConfirmPortal.md +28 -0
- package/dist/ai/BbDatePicker.md +244 -0
- package/dist/ai/BbDatePickerInput.md +706 -388
- package/dist/ai/BbDialog.md +770 -99
- package/dist/ai/BbDropdown.md +1054 -763
- package/dist/ai/BbDropdownButton.md +511 -615
- package/dist/ai/BbDropdownGroup.md +34 -0
- package/dist/ai/BbDropzone.md +1148 -436
- package/dist/ai/BbForm.md +239 -0
- package/dist/ai/BbIcon.md +379 -212
- package/dist/ai/BbIndicator.md +283 -0
- package/dist/ai/BbNumberInput.md +713 -355
- package/dist/ai/BbOffCanvas.md +875 -498
- package/dist/ai/BbPagination.md +483 -535
- package/dist/ai/BbPopover.md +583 -546
- package/dist/ai/BbProgress.md +456 -69
- package/dist/ai/BbRadio.md +343 -229
- package/dist/ai/BbRadioGroup.md +426 -353
- package/dist/ai/BbRating.md +361 -226
- package/dist/ai/BbSelect.md +1380 -536
- package/dist/ai/BbSelectPopover.md +1240 -1579
- package/dist/ai/BbSlider.md +478 -257
- package/dist/ai/BbSmoothHeight.md +472 -139
- package/dist/ai/BbSpinner.md +718 -131
- package/dist/ai/BbSwitch.md +549 -119
- package/dist/ai/BbSwitchGroup.md +503 -214
- package/dist/ai/BbTable.md +1956 -2358
- package/dist/ai/BbTabs.md +1113 -0
- package/dist/ai/BbTabsList.md +29 -0
- package/dist/ai/BbTabsPanes.md +27 -0
- package/dist/ai/BbTabsRoot.md +57 -0
- package/dist/ai/BbTag.md +393 -292
- package/dist/ai/BbTextInput.md +852 -333
- package/dist/ai/BbTextarea.md +836 -255
- package/dist/ai/BbTimePicker.md +231 -0
- package/dist/ai/BbTimePickerInput.md +196 -0
- package/dist/ai/BbToast.md +624 -196
- package/dist/ai/BbToastPortal.md +28 -0
- package/dist/ai/BbTooltip.md +443 -346
- package/dist/ai/BbTree.md +984 -235
- package/dist/ai/ChipsBox.md +27 -199
- package/dist/ai/ClearableButton.md +21 -55
- package/dist/ai/CommaBox.md +25 -200
- package/dist/ai/CommonInputWrapper.md +42 -0
- package/dist/ai/CommonPopover.md +30 -510
- package/dist/ai/ErrorIcon.md +19 -56
- package/dist/ai/FlatListBox.md +35 -379
- package/dist/ai/GroupedListBox.md +37 -535
- package/dist/ai/GuidesComponent.md +21 -0
- package/dist/ai/ListBox.md +38 -231
- package/dist/ai/OptionsContainer.md +34 -253
- package/dist/ai/WarningIcon.md +21 -0
- package/dist/ai/components.json +15883 -0
- package/dist/ai/composables/useBbConfig.md +80 -0
- package/dist/ai/composables/useBbFormContext.md +110 -0
- package/dist/ai/composables/useBbTableContext.md +164 -0
- package/dist/ai/composables/useBbTabsContext.md +118 -0
- package/dist/ai/composables/useBroadcastChannelInstance.md +97 -0
- package/dist/ai/composables/useConfirm.md +306 -0
- package/dist/ai/composables/useCountdown.md +84 -0
- package/dist/ai/composables/useId.md +60 -0
- package/dist/ai/composables/useMobile.md +85 -0
- package/dist/ai/composables/useToast.md +230 -0
- package/dist/ai/guides/agent-contract.md +108 -0
- package/dist/ai/guides/ai-router.md +111 -0
- package/dist/ai/guides/app-layout.md +295 -0
- package/dist/ai/guides/coherence-playbook.md +136 -0
- package/dist/ai/guides/component-picker.md +195 -0
- package/dist/ai/guides/design-language.md +461 -0
- package/dist/ai/guides/design-tokens.md +424 -0
- package/dist/ai/guides/fetch-items-playbook.md +161 -0
- package/dist/ai/guides/floating-bottom-panel.md +191 -0
- package/dist/ai/guides/icons-policy.md +257 -0
- package/dist/ai/guides/inertia-helpers.md +1394 -0
- package/dist/ai/guides/inline-edit-playbook.md +258 -0
- package/dist/ai/guides/installation-and-plugin-setup.md +377 -0
- package/dist/ai/guides/migration/components/bb-alert.md +37 -0
- package/dist/ai/guides/migration/components/bb-avatar.md +24 -0
- package/dist/ai/guides/migration/components/bb-badge.md +110 -0
- package/dist/ai/guides/migration/components/bb-breadcrumbs.md +26 -0
- package/dist/ai/guides/migration/components/bb-button.md +55 -0
- package/dist/ai/guides/migration/components/bb-checkbox-group.md +54 -0
- package/dist/ai/guides/migration/components/bb-checkbox.md +45 -0
- package/dist/ai/guides/migration/components/bb-chip.md +35 -0
- package/dist/ai/guides/migration/components/bb-collapsible.md +26 -0
- package/dist/ai/guides/migration/components/bb-color-input.md +23 -0
- package/dist/ai/guides/migration/components/bb-color-palette.md +31 -0
- package/dist/ai/guides/migration/components/bb-date-picker-input.md +84 -0
- package/dist/ai/guides/migration/components/bb-dialog.md +46 -0
- package/dist/ai/guides/migration/components/bb-dropdown-button.md +31 -0
- package/dist/ai/guides/migration/components/bb-dropdown.md +36 -0
- package/dist/ai/guides/migration/components/bb-dropzone.md +27 -0
- package/dist/ai/guides/migration/components/bb-icon.md +27 -0
- package/dist/ai/guides/migration/components/bb-off-canvas.md +25 -0
- package/dist/ai/guides/migration/components/bb-offcanvas.md +54 -0
- package/dist/ai/guides/migration/components/bb-pagination.md +24 -0
- package/dist/ai/guides/migration/components/bb-popover.md +52 -0
- package/dist/ai/guides/migration/components/bb-rating.md +24 -0
- package/dist/ai/guides/migration/components/bb-select-popover.md +58 -0
- package/dist/ai/guides/migration/components/bb-select.md +68 -0
- package/dist/ai/guides/migration/components/bb-slider.md +25 -0
- package/dist/ai/guides/migration/components/bb-smooth-height.md +45 -0
- package/dist/ai/guides/migration/components/bb-spinner.md +23 -0
- package/dist/ai/guides/migration/components/bb-table.md +66 -0
- package/dist/ai/guides/migration/components/bb-tabs.md +47 -0
- package/dist/ai/guides/migration/components/bb-tag.md +29 -0
- package/dist/ai/guides/migration/components/bb-text-input.md +37 -0
- package/dist/ai/guides/migration/components/bb-toast.md +47 -0
- package/dist/ai/guides/migration/components/bb-tooltip.md +34 -0
- package/dist/ai/guides/migration/components/bb-tree.md +77 -0
- package/dist/ai/guides/migration/components/use-confirm.md +46 -0
- package/dist/ai/guides/migration/v2-to-v3.md +649 -0
- package/dist/ai/guides/options-items-playbook.md +222 -0
- package/dist/ai/guides/page-shell.md +314 -0
- package/dist/ai/guides/validated-forms.md +177 -0
- package/dist/ai/index.md +156 -32
- package/dist/ai/recipes/inertia/approvals-inbox.md +1598 -0
- package/dist/ai/recipes/inertia/inline-edit-workspace.md +1733 -0
- package/dist/ai/recipes/inertia/onboarding.md +1765 -0
- package/dist/ai/recipes/inertia/ownership-atlas.md +1281 -0
- package/dist/ai/recipes/inertia/record-form.md +1442 -0
- package/dist/ai/recipes/inertia/records-workspace.md +1328 -0
- package/dist/ai/recipes/inertia/upload-center.md +1926 -0
- package/dist/ai/recipes/inertia/wizard-form.md +1477 -0
- package/dist/ai/recipes/nuxt/approvals-inbox.md +1561 -0
- package/dist/ai/recipes/nuxt/inline-edit-workspace.md +1690 -0
- package/dist/ai/recipes/nuxt/onboarding.md +1698 -0
- package/dist/ai/recipes/nuxt/record-form.md +1456 -0
- package/dist/ai/recipes/nuxt/records-workspace.md +1314 -0
- package/dist/ai/recipes/nuxt/upload-center.md +1847 -0
- package/dist/ai/recipes/nuxt/wizard-form.md +1486 -0
- package/dist/ai/recipes/vue/approvals-inbox.md +1479 -0
- package/dist/ai/recipes/vue/inline-edit-workspace.md +1581 -0
- package/dist/ai/recipes/vue/onboarding.md +1653 -0
- package/dist/ai/recipes/vue/record-form.md +1540 -0
- package/dist/ai/recipes/vue/records-workspace.md +1230 -0
- package/dist/ai/recipes/vue/upload-center.md +1806 -0
- package/dist/ai/recipes/vue/wizard-form.md +1418 -0
- package/dist/ai/source/BbAccordion.md +122 -0
- package/dist/ai/source/BbAlert.md +396 -0
- package/dist/ai/source/BbAsterisk.md +32 -0
- package/dist/ai/source/BbAvatar.md +256 -0
- package/dist/ai/source/BbBadge.md +560 -0
- package/dist/ai/source/BbBadgeButton.md +490 -0
- package/dist/ai/source/BbBaseButton.md +682 -0
- package/dist/ai/source/BbBaseCheckbox.md +459 -0
- package/dist/ai/source/BbBaseCheckboxGroup.md +554 -0
- package/dist/ai/source/BbBaseCheckboxIcon.md +201 -0
- package/dist/ai/source/BbBaseColorInput.md +413 -0
- package/dist/ai/source/BbBaseColorPalette.md +934 -0
- package/dist/ai/source/BbBaseDatePicker.md +1001 -0
- package/dist/ai/source/BbBaseDatePickerInput.md +1781 -0
- package/dist/ai/source/BbBaseInputContainer.md +1148 -0
- package/dist/ai/source/BbBaseNumberInput.md +615 -0
- package/dist/ai/source/BbBaseRadio.md +377 -0
- package/dist/ai/source/BbBaseRadioGroup.md +499 -0
- package/dist/ai/source/BbBaseRadioIcon.md +153 -0
- package/dist/ai/source/BbBaseRating.md +573 -0
- package/dist/ai/source/BbBaseSelect.md +895 -0
- package/dist/ai/source/BbBaseSlider.md +1085 -0
- package/dist/ai/source/BbBaseSwitch.md +246 -0
- package/dist/ai/source/BbBaseSwitchGroup.md +302 -0
- package/dist/ai/source/BbBaseSwitchIcon.md +206 -0
- package/dist/ai/source/BbBaseTag.md +688 -0
- package/dist/ai/source/BbBaseTextInput.md +511 -0
- package/dist/ai/source/BbBaseTextarea.md +480 -0
- package/dist/ai/source/BbBaseTimePickerInput.md +1013 -0
- package/dist/ai/source/BbBreadcrumbs.md +811 -0
- package/dist/ai/source/BbButton.md +990 -0
- package/dist/ai/source/BbCheckbox.md +319 -0
- package/dist/ai/source/BbCheckboxGroup.md +412 -0
- package/dist/ai/source/BbCollapsible.md +133 -0
- package/dist/ai/source/BbColorInput.md +315 -0
- package/dist/ai/source/BbColorPalette.md +361 -0
- package/dist/ai/source/BbConfirm.md +173 -0
- package/dist/ai/source/BbConfirmPortal.md +74 -0
- package/dist/ai/source/BbDatePicker.md +725 -0
- package/dist/ai/source/BbDatePickerInput.md +518 -0
- package/dist/ai/source/BbDialog.md +812 -0
- package/dist/ai/source/BbDropdown.md +2369 -0
- package/dist/ai/source/BbDropdownButton.md +313 -0
- package/dist/ai/source/BbDropdownGroup.md +1249 -0
- package/dist/ai/source/BbDropzone.md +749 -0
- package/dist/ai/source/BbForm.md +100 -0
- package/dist/ai/source/BbIcon.md +212 -0
- package/dist/ai/source/BbIndicator.md +298 -0
- package/dist/ai/source/BbNumberInput.md +365 -0
- package/dist/ai/source/BbOffCanvas.md +1260 -0
- package/dist/ai/source/BbPagination.md +829 -0
- package/dist/ai/source/BbPopover.md +853 -0
- package/dist/ai/source/BbProgress.md +140 -0
- package/dist/ai/source/BbRadio.md +294 -0
- package/dist/ai/source/BbRadioGroup.md +401 -0
- package/dist/ai/source/BbRating.md +362 -0
- package/dist/ai/source/BbSelect.md +681 -0
- package/dist/ai/source/BbSelectPopover.md +2209 -0
- package/dist/ai/source/BbSlider.md +371 -0
- package/dist/ai/source/BbSmoothHeight.md +261 -0
- package/dist/ai/source/BbSpinner.md +127 -0
- package/dist/ai/source/BbSwitch.md +175 -0
- package/dist/ai/source/BbSwitchGroup.md +240 -0
- package/dist/ai/source/BbTable.md +3348 -0
- package/dist/ai/source/BbTabs.md +403 -0
- package/dist/ai/source/BbTabsList.md +578 -0
- package/dist/ai/source/BbTabsPanes.md +368 -0
- package/dist/ai/source/BbTabsRoot.md +372 -0
- package/dist/ai/source/BbTag.md +383 -0
- package/dist/ai/source/BbTextInput.md +345 -0
- package/dist/ai/source/BbTextarea.md +330 -0
- package/dist/ai/source/BbTimePicker.md +591 -0
- package/dist/ai/source/BbTimePickerInput.md +367 -0
- package/dist/ai/source/BbToast.md +524 -0
- package/dist/ai/source/BbToastPortal.md +482 -0
- package/dist/ai/source/BbTooltip.md +508 -0
- package/dist/ai/source/BbTree.md +319 -0
- package/dist/ai/source/ChipsBox.md +201 -0
- package/dist/ai/source/ClearableButton.md +70 -0
- package/dist/ai/source/CommaBox.md +202 -0
- package/dist/ai/source/CommonInputWrapper.md +554 -0
- package/dist/ai/source/CommonPopover.md +606 -0
- package/dist/ai/source/ErrorIcon.md +43 -0
- package/dist/ai/source/FlatListBox.md +396 -0
- package/dist/ai/source/GroupedListBox.md +540 -0
- package/dist/ai/source/GuidesComponent.md +383 -0
- package/dist/ai/source/ListBox.md +238 -0
- package/dist/ai/source/OptionsContainer.md +191 -0
- package/dist/ai/source/WarningIcon.md +47 -0
- package/dist/alert-variants.d.ts +12 -0
- package/dist/assets/css/reset.css_inline.js +4 -0
- package/dist/assets/svgs/alert.svg_raw.js +4 -0
- package/dist/assets/svgs/calendar.svg_raw.js +4 -0
- package/dist/assets/svgs/check_stroke.svg_raw.js +4 -0
- package/dist/assets/svgs/chevron_down.svg_raw.js +4 -0
- package/dist/assets/svgs/chevron_right.svg_raw.js +4 -0
- package/dist/assets/svgs/clear.svg_raw.js +4 -0
- package/dist/assets/svgs/clock.svg_raw.js +4 -0
- package/dist/assets/svgs/error.svg_raw.js +4 -0
- package/dist/assets/svgs/search.svg_raw.js +4 -0
- package/dist/assets/svgs/sort.svg_raw.js +4 -0
- package/dist/assets/svgs/spinner.svg_raw.js +4 -0
- package/dist/assets/svgs/user.svg_raw.js +4 -0
- package/dist/badge-variants.d.ts +18 -0
- package/dist/button-variants.d.ts +15 -0
- package/dist/components/BbAccordion/BbAccordion.vue.d.ts +9 -3
- package/dist/components/BbAccordion/BbAccordion.vue.js +6 -0
- package/dist/components/BbAccordion/BbAccordion.vue_vue_type_script_setup_true_lang.js +66 -0
- package/dist/components/BbAccordion/types.d.ts +10 -7
- package/dist/components/BbAlert/BbAlert.vue.d.ts +12 -3
- package/dist/components/BbAlert/BbAlert.vue.js +6 -0
- package/dist/components/BbAlert/BbAlert.vue_vue_type_script_setup_true_lang.js +65 -0
- package/dist/components/BbAlert/types.d.ts +51 -12
- package/dist/components/BbAsterisk/BbAsterisk.vue.d.ts +3 -0
- package/dist/components/BbAsterisk/BbAsterisk.vue.js +6 -0
- package/dist/components/BbAsterisk/BbAsterisk.vue_vue_type_script_setup_true_lang.js +13 -0
- package/dist/components/BbAvatar/BbAvatar.vue.d.ts +5 -0
- package/dist/components/BbAvatar/BbAvatar.vue.js +6 -0
- package/dist/components/BbAvatar/BbAvatar.vue_vue_type_script_setup_true_lang.js +78 -0
- package/dist/components/BbAvatar/types.d.ts +4 -5
- package/dist/components/BbBadge/BadgeAppendIcon.vue.d.ts +3 -0
- package/dist/components/BbBadge/BadgeAppendIcon.vue.js +5 -0
- package/dist/components/BbBadge/BadgeAppendIcon.vue_vue_type_script_setup_true_lang.js +22 -0
- package/dist/components/BbBadge/BadgeBodyContent.vue.d.ts +15 -0
- package/dist/components/BbBadge/BadgeBodyContent.vue.js +5 -0
- package/dist/components/BbBadge/BadgeBodyContent.vue_vue_type_script_setup_true_lang.js +34 -0
- package/dist/components/BbBadge/BbBadge.vue.d.ts +8 -1
- package/dist/components/BbBadge/BbBadge.vue.js +6 -0
- package/dist/components/BbBadge/BbBadge.vue_vue_type_script_setup_true_lang.js +83 -0
- package/dist/components/BbBadge/BbBadgeButton.vue.d.ts +12 -0
- package/dist/components/BbBadge/BbBadgeButton.vue.js +5 -0
- package/dist/components/BbBadge/BbBadgeButton.vue_vue_type_script_setup_true_lang.js +54 -0
- package/dist/components/BbBadge/badgeButtonContext.d.ts +27 -0
- package/dist/components/BbBadge/badgeButtonContext.js +5 -0
- package/dist/components/BbBadge/types.d.ts +61 -16
- package/dist/components/BbBaseButton/BbBaseButton.vue.d.ts +13 -0
- package/dist/components/BbBaseButton/BbBaseButton.vue.js +6 -0
- package/dist/components/BbBaseButton/BbBaseButton.vue_vue_type_script_setup_true_lang.js +171 -0
- package/dist/components/BbBaseButton/RouterComponent.vue.js +5 -0
- package/dist/components/BbBaseButton/RouterComponent.vue_vue_type_script_setup_true_lang.js +28 -0
- package/dist/components/BbBaseButton/types.d.ts +191 -0
- package/dist/components/BbBaseButton/types.js +33 -0
- package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue.d.ts +40 -0
- package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue.js +6 -0
- package/dist/components/BbBaseCheckbox/BbBaseCheckbox.vue_vue_type_script_setup_true_lang.js +145 -0
- package/dist/components/BbBaseCheckbox/types.d.ts +222 -0
- package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue.d.ts +19 -0
- package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue.js +6 -0
- package/dist/components/BbBaseCheckboxGroup/BbBaseCheckboxGroup.vue_vue_type_script_setup_true_lang.js +190 -0
- package/dist/components/BbBaseCheckboxGroup/types.d.ts +257 -0
- package/dist/components/BbBaseCheckboxIcon/BbBaseCheckboxIcon.vue.d.ts +4 -0
- package/dist/components/BbBaseCheckboxIcon/BbBaseCheckboxIcon.vue.js +6 -0
- package/dist/components/BbBaseCheckboxIcon/BbBaseCheckboxIcon.vue_vue_type_script_setup_true_lang.js +43 -0
- package/dist/components/BbBaseCheckboxIcon/types.d.ts +47 -0
- package/dist/components/BbBaseColorInput/BbBaseColorInput.vue.d.ts +42 -0
- package/dist/components/BbBaseColorInput/BbBaseColorInput.vue.js +6 -0
- package/dist/components/BbBaseColorInput/BbBaseColorInput.vue_vue_type_script_setup_true_lang.js +178 -0
- package/dist/components/BbBaseColorInput/types.d.ts +207 -0
- package/dist/components/BbBaseColorPalette/BbBaseColorPalette.vue.d.ts +13 -0
- package/dist/components/BbBaseColorPalette/BbBaseColorPalette.vue.js +6 -0
- package/dist/components/BbBaseColorPalette/BbBaseColorPalette.vue_vue_type_script_setup_true_lang.js +395 -0
- package/dist/components/BbBaseColorPalette/types.d.ts +40 -0
- package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue.js +6 -0
- package/dist/components/BbBaseDatePicker/BbBaseDatePicker.vue_vue_type_script_setup_true_lang.js +300 -0
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue.d.ts +44 -0
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue.js +5 -0
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerInputDaySelector.vue_vue_type_script_setup_true_lang.js +310 -0
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue.d.ts +5 -0
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue.js +5 -0
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerMonthSelector.vue_vue_type_script_setup_true_lang.js +63 -0
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerYearSelector.vue.d.ts +5 -0
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerYearSelector.vue.js +5 -0
- package/dist/components/BbBaseDatePicker/BbBaseDatePickerYearSelector.vue_vue_type_script_setup_true_lang.js +75 -0
- package/dist/components/BbBaseDatePicker/typeahead.d.ts +112 -0
- package/dist/components/BbBaseDatePicker/typeahead.js +37 -0
- package/dist/components/BbBaseDatePicker/types.d.ts +97 -0
- package/dist/components/BbBaseDatePicker/useDatePickerContext.d.ts +58 -0
- package/dist/components/BbBaseDatePicker/useDatePickerContext.js +11 -0
- package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue.d.ts +30 -0
- package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue.js +6 -0
- package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerInput.vue_vue_type_script_setup_true_lang.js +713 -0
- package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue.d.ts +30 -0
- package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue.js +6 -0
- package/dist/components/BbBaseDatePickerInput/BbBaseDatePickerTimeSelector.vue_vue_type_script_setup_true_lang.js +204 -0
- package/dist/components/BbBaseDatePickerInput/types.d.ts +309 -0
- package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue.d.ts +17 -0
- package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue.js +6 -0
- package/dist/components/BbBaseInputContainer/BbBaseInputContainer.vue_vue_type_script_setup_true_lang.js +184 -0
- package/dist/components/BbBaseInputContainer/types.d.ts +185 -0
- package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue.d.ts +52 -0
- package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue.js +6 -0
- package/dist/components/BbBaseNumberInput/BbBaseNumberInput.vue_vue_type_script_setup_true_lang.js +211 -0
- package/dist/components/BbBaseNumberInput/types.d.ts +211 -0
- package/dist/components/BbBaseRadio/BbBaseRadio.vue.d.ts +33 -0
- package/dist/components/BbBaseRadio/BbBaseRadio.vue.js +6 -0
- package/dist/components/BbBaseRadio/BbBaseRadio.vue_vue_type_script_setup_true_lang.js +114 -0
- package/dist/components/BbBaseRadio/types.d.ts +179 -0
- package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue.d.ts +19 -0
- package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue.js +6 -0
- package/dist/components/BbBaseRadioGroup/BbBaseRadioGroup.vue_vue_type_script_setup_true_lang.js +172 -0
- package/dist/components/BbBaseRadioGroup/types.d.ts +215 -0
- package/dist/components/BbBaseRadioIcon/BbBaseRadioIcon.vue.d.ts +4 -0
- package/dist/components/BbBaseRadioIcon/BbBaseRadioIcon.vue.js +6 -0
- package/dist/components/BbBaseRadioIcon/BbBaseRadioIcon.vue_vue_type_script_setup_true_lang.js +28 -0
- package/dist/components/BbBaseRadioIcon/types.d.ts +41 -0
- package/dist/components/BbBaseRating/BbBaseRating.vue.d.ts +38 -0
- package/dist/components/BbBaseRating/BbBaseRating.vue.js +6 -0
- package/dist/components/BbBaseRating/BbBaseRating.vue_vue_type_script_setup_true_lang.js +184 -0
- package/dist/components/BbBaseRating/types.d.ts +168 -0
- package/dist/components/BbBaseSelect/BbBaseSelect.vue.d.ts +19 -0
- package/dist/components/BbBaseSelect/BbBaseSelect.vue.js +6 -0
- package/dist/components/BbBaseSelect/BbBaseSelect.vue_vue_type_script_setup_true_lang.js +307 -0
- package/dist/components/BbBaseSelect/types.d.ts +294 -0
- package/dist/components/BbBaseSlider/BbBaseSlider.vue.d.ts +35 -0
- package/dist/components/BbBaseSlider/BbBaseSlider.vue.js +6 -0
- package/dist/components/BbBaseSlider/BbBaseSlider.vue_vue_type_script_setup_true_lang.js +324 -0
- package/dist/components/BbBaseSlider/types.d.ts +200 -0
- package/dist/components/BbBaseSwitch/BbBaseSwitch.vue.d.ts +35 -0
- package/dist/components/BbBaseSwitch/BbBaseSwitch.vue.js +6 -0
- package/dist/components/BbBaseSwitch/BbBaseSwitch.vue_vue_type_script_setup_true_lang.js +146 -0
- package/dist/components/BbBaseSwitch/types.d.ts +10 -0
- package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue.d.ts +19 -0
- package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue.js +6 -0
- package/dist/components/BbBaseSwitchGroup/BbBaseSwitchGroup.vue_vue_type_script_setup_true_lang.js +190 -0
- package/dist/components/BbBaseSwitchGroup/types.d.ts +8 -0
- package/dist/components/BbBaseSwitchIcon/BbBaseSwitchIcon.vue.d.ts +4 -0
- package/dist/components/BbBaseSwitchIcon/BbBaseSwitchIcon.vue.js +6 -0
- package/dist/components/BbBaseSwitchIcon/BbBaseSwitchIcon.vue_vue_type_script_setup_true_lang.js +30 -0
- package/dist/components/BbBaseSwitchIcon/types.d.ts +48 -0
- package/dist/components/BbBaseTag/BbBaseTag.vue.d.ts +50 -0
- package/dist/components/BbBaseTag/BbBaseTag.vue.js +6 -0
- package/dist/components/BbBaseTag/BbBaseTag.vue_vue_type_script_setup_true_lang.js +266 -0
- package/dist/components/BbBaseTag/types.d.ts +160 -0
- package/dist/components/BbBaseTextInput/BbBaseTextInput.vue.d.ts +45 -0
- package/dist/components/BbBaseTextInput/BbBaseTextInput.vue.js +6 -0
- package/dist/components/BbBaseTextInput/BbBaseTextInput.vue_vue_type_script_setup_true_lang.js +200 -0
- package/dist/components/BbBaseTextInput/types.d.ts +209 -0
- package/dist/components/BbBaseTextarea/BbBaseTextarea.vue.d.ts +39 -0
- package/dist/components/BbBaseTextarea/BbBaseTextarea.vue.js +6 -0
- package/dist/components/BbBaseTextarea/BbBaseTextarea.vue_vue_type_script_setup_true_lang.js +175 -0
- package/dist/components/BbBaseTextarea/types.d.ts +170 -0
- package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue.d.ts +27 -0
- package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue.js +6 -0
- package/dist/components/BbBaseTimePickerInput/BbBaseTimePickerInput.vue_vue_type_script_setup_true_lang.js +517 -0
- package/dist/components/BbBaseTimePickerInput/types.d.ts +151 -0
- package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue.d.ts +0 -1
- package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue.js +6 -0
- package/dist/components/BbBreadcrumbs/BbBreadcrumbs.vue_vue_type_script_setup_true_lang.js +224 -0
- package/dist/components/BbBreadcrumbs/estimateBreadcrumbItemWidth.js +47 -0
- package/dist/components/BbBreadcrumbs/types.d.ts +33 -22
- package/dist/components/BbButton/BbButton.vue.d.ts +6 -5
- package/dist/components/BbButton/BbButton.vue.js +6 -0
- package/dist/components/BbButton/BbButton.vue_vue_type_script_setup_true_lang.js +177 -0
- package/dist/components/BbButton/types.d.ts +48 -47
- package/dist/components/BbCheckbox/BbCheckbox.vue.d.ts +4 -3
- package/dist/components/BbCheckbox/BbCheckbox.vue.js +6 -0
- package/dist/components/BbCheckbox/BbCheckbox.vue_vue_type_script_setup_true_lang.js +146 -0
- package/dist/components/BbCheckbox/types.d.ts +24 -10
- package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue.d.ts +2 -13
- package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue.js +6 -0
- package/dist/components/BbCheckboxGroup/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +190 -0
- package/dist/components/BbCheckboxGroup/types.d.ts +44 -23
- package/dist/components/BbCollapsible/BbCollapsible.vue.d.ts +2 -1
- package/dist/components/BbCollapsible/BbCollapsible.vue.js +6 -0
- package/dist/components/BbCollapsible/BbCollapsible.vue_vue_type_script_setup_true_lang.js +31 -0
- package/dist/components/BbCollapsible/types.d.ts +10 -9
- package/dist/components/BbColorInput/BbColorInput.vue.d.ts +10 -1
- package/dist/components/BbColorInput/BbColorInput.vue.js +6 -0
- package/dist/components/BbColorInput/BbColorInput.vue_vue_type_script_setup_true_lang.js +177 -0
- package/dist/components/BbColorInput/types.d.ts +37 -11
- package/dist/components/BbColorPalette/BbColorPalette.vue.d.ts +5 -8
- package/dist/components/BbColorPalette/BbColorPalette.vue.js +5 -0
- package/dist/components/BbColorPalette/BbColorPalette.vue_vue_type_script_setup_true_lang.js +125 -0
- package/dist/components/BbColorPalette/types.d.ts +66 -53
- package/dist/components/BbConfirm/BbConfirm.vue.js +6 -0
- package/dist/components/BbConfirm/BbConfirm.vue_vue_type_script_setup_true_lang.js +130 -0
- package/dist/components/BbConfirm/BbConfirmPortal.vue.d.ts +5 -6
- package/dist/components/BbConfirm/BbConfirmPortal.vue.js +5 -0
- package/dist/components/BbConfirm/BbConfirmPortal.vue_vue_type_script_setup_true_lang.js +19 -0
- package/dist/components/BbDatePicker/BbDatePicker.vue.d.ts +37 -0
- package/dist/components/BbDatePicker/BbDatePicker.vue.js +6 -0
- package/dist/components/BbDatePicker/BbDatePicker.vue_vue_type_script_setup_true_lang.js +319 -0
- package/dist/components/BbDatePicker/types.d.ts +155 -0
- package/dist/components/BbDatePickerInput/BbDatePickerInput.vue.d.ts +3 -1
- package/dist/components/BbDatePickerInput/BbDatePickerInput.vue.js +6 -0
- package/dist/components/BbDatePickerInput/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +179 -0
- package/dist/components/BbDatePickerInput/types.d.ts +127 -16
- package/dist/components/BbDialog/BbDialog.vue.d.ts +8 -6
- package/dist/components/BbDialog/BbDialog.vue.js +6 -0
- package/dist/components/BbDialog/BbDialog.vue_vue_type_script_setup_true_lang.js +214 -0
- package/dist/components/BbDialog/types.d.ts +146 -1
- package/dist/components/BbDialog/useDialogStack.d.ts +5 -0
- package/dist/components/BbDialog/useDialogStack.js +20 -0
- package/dist/components/BbDropdown/AdaptiveDropdown.vue.d.ts +18 -0
- package/dist/components/BbDropdown/AdaptiveDropdown.vue.js +6 -0
- package/dist/components/BbDropdown/AdaptiveDropdown.vue_vue_type_script_setup_true_lang.js +116 -0
- package/dist/components/BbDropdown/BbDropdown.vue.d.ts +14 -7
- package/dist/components/BbDropdown/BbDropdown.vue.js +6 -0
- package/dist/components/BbDropdown/BbDropdown.vue_vue_type_script_setup_true_lang.js +560 -0
- package/dist/components/BbDropdown/BbDropdownGroup.vue.d.ts +44 -0
- package/dist/components/BbDropdown/BbDropdownGroup.vue.js +5 -0
- package/dist/components/BbDropdown/BbDropdownGroup.vue_vue_type_script_setup_true_lang.js +36 -0
- package/dist/components/BbDropdown/BbDropdownList.vue.d.ts +27 -0
- package/dist/components/BbDropdown/BbDropdownList.vue.js +6 -0
- package/dist/components/BbDropdown/BbDropdownList.vue_vue_type_script_setup_true_lang.js +464 -0
- package/dist/components/BbDropdown/DropdownPipelineResolver.vue.d.ts +16 -0
- package/dist/components/BbDropdown/DropdownPipelineResolver.vue.js +5 -0
- package/dist/components/BbDropdown/DropdownPipelineResolver.vue_vue_type_script_setup_true_lang.js +168 -0
- package/dist/components/BbDropdown/normalizeGroups.d.ts +18 -0
- package/dist/components/BbDropdown/normalizeGroups.js +46 -0
- package/dist/components/BbDropdown/types.d.ts +457 -45
- package/dist/components/BbDropdown/types.js +4 -0
- package/dist/components/BbDropdown/useDropdownContext.d.ts +89 -0
- package/dist/components/BbDropdown/useDropdownContext.js +9 -0
- package/dist/components/BbDropdown/useDropdownGroupRegistry.d.ts +108 -0
- package/dist/components/BbDropdown/useDropdownGroupRegistry.js +5 -0
- package/dist/components/BbDropdownButton/BbDropdownButton.vue.d.ts +3 -3
- package/dist/components/BbDropdownButton/BbDropdownButton.vue.js +6 -0
- package/dist/components/BbDropdownButton/BbDropdownButton.vue_vue_type_script_setup_true_lang.js +119 -0
- package/dist/components/BbDropdownButton/types.d.ts +45 -52
- package/dist/components/BbDropzone/BbDropzone.vue.d.ts +5 -4
- package/dist/components/BbDropzone/BbDropzone.vue.js +6 -0
- package/dist/components/BbDropzone/BbDropzone.vue_vue_type_script_setup_true_lang.js +284 -0
- package/dist/components/BbDropzone/types.d.ts +55 -7
- package/dist/components/BbIcon/BbIcon.vue.d.ts +3 -2
- package/dist/components/BbIcon/BbIcon.vue.js +6 -0
- package/dist/components/BbIcon/BbIcon.vue_vue_type_script_setup_true_lang.js +65 -0
- package/dist/components/BbIcon/types.d.ts +6 -19
- package/dist/components/BbIndicator/BbIndicator.vue.d.ts +14 -0
- package/dist/components/BbIndicator/BbIndicator.vue.js +6 -0
- package/dist/components/BbIndicator/BbIndicator.vue_vue_type_script_setup_true_lang.js +56 -0
- package/dist/components/BbIndicator/types.d.ts +49 -0
- package/dist/components/BbNumberInput/BbNumberInput.vue.d.ts +12 -6
- package/dist/components/BbNumberInput/BbNumberInput.vue.js +6 -0
- package/dist/components/BbNumberInput/BbNumberInput.vue_vue_type_script_setup_true_lang.js +194 -0
- package/dist/components/BbNumberInput/types.d.ts +31 -4
- package/dist/components/BbOffCanvas/BbOffCanvas.vue.d.ts +10 -10
- package/dist/components/BbOffCanvas/BbOffCanvas.vue.js +6 -0
- package/dist/components/BbOffCanvas/BbOffCanvas.vue_vue_type_script_setup_true_lang.js +284 -0
- package/dist/components/BbOffCanvas/types.d.ts +71 -39
- package/dist/components/BbOffCanvas/useOffCanvasStack.d.ts +25 -0
- package/dist/components/BbOffCanvas/useOffCanvasStack.js +68 -0
- package/dist/components/BbPagination/BbPagination.vue.d.ts +3 -4
- package/dist/components/BbPagination/BbPagination.vue.js +6 -0
- package/dist/components/BbPagination/BbPagination.vue_vue_type_script_setup_true_lang.js +244 -0
- package/dist/components/BbPagination/paginationFit.d.ts +38 -0
- package/dist/components/BbPagination/paginationFit.js +13 -0
- package/dist/components/BbPagination/types.d.ts +51 -16
- package/dist/components/BbPopover/BbPopover.vue.d.ts +10 -15
- package/dist/components/BbPopover/BbPopover.vue.js +6 -0
- package/dist/components/BbPopover/BbPopover.vue_vue_type_script_setup_true_lang.js +310 -0
- package/dist/components/BbPopover/escapeStack.d.ts +6 -0
- package/dist/components/BbPopover/escapeStack.js +10 -0
- package/dist/components/BbPopover/types.d.ts +84 -31
- package/dist/components/BbProgress/BbProgress.vue.d.ts +1 -0
- package/dist/components/BbProgress/BbProgress.vue.js +6 -0
- package/dist/components/BbProgress/BbProgress.vue_vue_type_script_setup_true_lang.js +36 -0
- package/dist/components/BbProgress/types.d.ts +15 -1
- package/dist/components/BbRadio/BbRadio.vue.d.ts +5 -3
- package/dist/components/BbRadio/BbRadio.vue.js +6 -0
- package/dist/components/BbRadio/BbRadio.vue_vue_type_script_setup_true_lang.js +133 -0
- package/dist/components/BbRadio/types.d.ts +23 -9
- package/dist/components/BbRadioGroup/BbRadioGroup.vue.d.ts +4 -14
- package/dist/components/BbRadioGroup/BbRadioGroup.vue.js +6 -0
- package/dist/components/BbRadioGroup/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +184 -0
- package/dist/components/BbRadioGroup/types.d.ts +41 -22
- package/dist/components/BbRating/BbRating.vue.d.ts +4 -1
- package/dist/components/BbRating/BbRating.vue.js +6 -0
- package/dist/components/BbRating/BbRating.vue_vue_type_script_setup_true_lang.js +150 -0
- package/dist/components/BbRating/types.d.ts +37 -10
- package/dist/components/BbSelect/BbSelect.vue.d.ts +2 -11
- package/dist/components/BbSelect/BbSelect.vue.js +6 -0
- package/dist/components/BbSelect/BbSelect.vue_vue_type_script_setup_true_lang.js +241 -0
- package/dist/components/BbSelect/types.d.ts +105 -59
- package/dist/components/BbSelectPopover/BbSelectPopover.vue.d.ts +1 -10
- package/dist/components/BbSelectPopover/BbSelectPopover.vue.js +6 -0
- package/dist/components/BbSelectPopover/BbSelectPopover.vue_vue_type_script_setup_true_lang.js +637 -0
- package/dist/components/BbSelectPopover/types.d.ts +189 -102
- package/dist/components/BbSlider/BbSlider.vue.d.ts +3 -6
- package/dist/components/BbSlider/BbSlider.vue.js +6 -0
- package/dist/components/BbSlider/BbSlider.vue_vue_type_script_setup_true_lang.js +166 -0
- package/dist/components/BbSlider/types.d.ts +37 -13
- package/dist/components/BbSmoothHeight/BbSmoothHeight.vue.d.ts +3 -1
- package/dist/components/BbSmoothHeight/BbSmoothHeight.vue.js +6 -0
- package/dist/components/BbSmoothHeight/BbSmoothHeight.vue_vue_type_script_setup_true_lang.js +79 -0
- package/dist/components/BbSmoothHeight/types.d.ts +13 -2
- package/dist/components/BbSpinner/BbSpinner.vue.d.ts +1 -1
- package/dist/components/BbSpinner/BbSpinner.vue.js +6 -0
- package/dist/components/BbSpinner/BbSpinner.vue_vue_type_script_setup_true_lang.js +30 -0
- package/dist/components/BbSpinner/types.d.ts +10 -3
- package/dist/components/BbSwitch/BbSwitch.vue.d.ts +5 -3
- package/dist/components/BbSwitch/BbSwitch.vue.js +6 -0
- package/dist/components/BbSwitch/BbSwitch.vue_vue_type_script_setup_true_lang.js +142 -0
- package/dist/components/BbSwitch/types.d.ts +3 -1
- package/dist/components/BbSwitchGroup/BbSwitchGroup.vue.d.ts +4 -14
- package/dist/components/BbSwitchGroup/BbSwitchGroup.vue.js +6 -0
- package/dist/components/BbSwitchGroup/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +190 -0
- package/dist/components/BbSwitchGroup/types.d.ts +3 -22
- package/dist/components/BbTable/BbTable.vue.d.ts +53 -31
- package/dist/components/BbTable/BbTable.vue.js +6 -0
- package/dist/components/BbTable/BbTable.vue_vue_type_script_setup_true_lang.js +889 -0
- package/dist/components/BbTable/types.d.ts +176 -37
- package/dist/components/BbTable/utils.d.ts +9 -1
- package/dist/components/BbTable/utils.js +53 -0
- package/dist/components/BbTabs/BbTabs.vue.d.ts +20 -0
- package/dist/components/BbTabs/BbTabs.vue.js +6 -0
- package/dist/components/BbTabs/BbTabs.vue_vue_type_script_setup_true_lang.js +64 -0
- package/dist/components/BbTabs/BbTabsList.vue.d.ts +19 -0
- package/dist/components/BbTabs/BbTabsList.vue.js +6 -0
- package/dist/components/BbTabs/BbTabsList.vue_vue_type_script_setup_true_lang.js +123 -0
- package/dist/components/BbTabs/BbTabsPanes.vue.d.ts +16 -0
- package/dist/components/BbTabs/BbTabsPanes.vue.js +6 -0
- package/dist/components/BbTabs/BbTabsPanes.vue_vue_type_script_setup_true_lang.js +35 -0
- package/dist/components/BbTabs/BbTabsRoot.vue.d.ts +20 -0
- package/dist/components/BbTabs/BbTabsRoot.vue.js +5 -0
- package/dist/components/BbTabs/BbTabsRoot.vue_vue_type_script_setup_true_lang.js +55 -0
- package/dist/components/BbTabs/types.d.ts +264 -0
- package/dist/components/BbTag/BbTag.vue.d.ts +19 -6
- package/dist/components/BbTag/BbTag.vue.js +6 -0
- package/dist/components/BbTag/BbTag.vue_vue_type_script_setup_true_lang.js +187 -0
- package/dist/components/BbTag/types.d.ts +48 -17
- package/dist/components/BbTextInput/BbTextInput.vue.d.ts +10 -1
- package/dist/components/BbTextInput/BbTextInput.vue.js +6 -0
- package/dist/components/BbTextInput/BbTextInput.vue_vue_type_script_setup_true_lang.js +195 -0
- package/dist/components/BbTextInput/types.d.ts +24 -4
- package/dist/components/BbTextarea/BbTextarea.vue.d.ts +10 -1
- package/dist/components/BbTextarea/BbTextarea.vue.js +6 -0
- package/dist/components/BbTextarea/BbTextarea.vue_vue_type_script_setup_true_lang.js +178 -0
- package/dist/components/BbTextarea/types.d.ts +26 -2
- package/dist/components/BbTimePicker/BbTimePicker.vue.d.ts +33 -0
- package/dist/components/BbTimePicker/BbTimePicker.vue.js +6 -0
- package/dist/components/BbTimePicker/BbTimePicker.vue_vue_type_script_setup_true_lang.js +244 -0
- package/dist/components/BbTimePicker/types.d.ts +129 -0
- package/dist/components/BbTimePickerInput/BbTimePickerInput.vue.d.ts +25 -0
- package/dist/components/BbTimePickerInput/BbTimePickerInput.vue.js +6 -0
- package/dist/components/BbTimePickerInput/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +157 -0
- package/dist/components/BbTimePickerInput/types.d.ts +165 -0
- package/dist/components/BbToast/BbToast.vue.d.ts +2 -3
- package/dist/components/BbToast/BbToast.vue.js +6 -0
- package/dist/components/BbToast/BbToast.vue_vue_type_script_setup_true_lang.js +35 -0
- package/dist/components/BbToast/BbToastMessage.vue.d.ts +17 -8
- package/dist/components/BbToast/BbToastMessage.vue.js +5 -0
- package/dist/components/BbToast/BbToastMessage.vue_vue_type_script_setup_true_lang.js +170 -0
- package/dist/components/BbToast/BbToastPortal.vue.d.ts +30 -0
- package/dist/components/BbToast/BbToastPortal.vue.js +5 -0
- package/dist/components/BbToast/BbToastPortal.vue_vue_type_script_setup_true_lang.js +19 -0
- package/dist/components/BbToast/BbToastRegion.vue.d.ts +8 -0
- package/dist/components/BbToast/BbToastRegion.vue.js +5 -0
- package/dist/components/BbToast/BbToastRegion.vue_vue_type_script_setup_true_lang.js +100 -0
- package/dist/components/BbToast/types.d.ts +69 -5
- package/dist/components/BbTooltip/BbTooltip.vue.d.ts +4 -3
- package/dist/components/BbTooltip/BbTooltip.vue.js +6 -0
- package/dist/components/BbTooltip/BbTooltip.vue_vue_type_script_setup_true_lang.js +160 -0
- package/dist/components/BbTooltip/types.d.ts +61 -11
- package/dist/components/BbTree/BbTree.vue.d.ts +26 -13
- package/dist/components/BbTree/BbTree.vue.js +6 -0
- package/dist/components/BbTree/BbTree.vue_vue_type_script_setup_true_lang.js +55 -0
- package/dist/components/BbTree/BbTreeLevel.vue.d.ts +19 -0
- package/dist/components/BbTree/BbTreeLevel.vue.js +5 -0
- package/dist/components/BbTree/BbTreeLevel.vue_vue_type_script_setup_true_lang.js +94 -0
- package/dist/components/BbTree/context.d.ts +17 -0
- package/dist/components/BbTree/context.js +4 -0
- package/dist/components/BbTree/types.d.ts +93 -42
- package/dist/components/ChipsBox/ChipsBox.vue.d.ts +2 -1
- package/dist/components/ChipsBox/ChipsBox.vue.js +5 -0
- package/dist/components/ChipsBox/ChipsBox.vue_vue_type_script_setup_true_lang.js +98 -0
- package/dist/components/ChipsBox/types.d.ts +12 -5
- package/dist/components/ClearableButton/ClearableButton.vue.d.ts +2 -1
- package/dist/components/ClearableButton/ClearableButton.vue.js +6 -0
- package/dist/components/ClearableButton/ClearableButton.vue_vue_type_script_setup_true_lang.js +19 -0
- package/dist/components/ClearableButton/types.d.ts +7 -1
- package/dist/components/CloseIcon/CloseButton.vue.d.ts +5 -0
- package/dist/components/CloseIcon/CloseButton.vue.js +7 -0
- package/dist/components/CloseIcon/CloseButton.vue_vue_type_script_setup_true_lang.js +23 -0
- package/dist/components/CloseIcon/types.d.ts +2 -0
- package/dist/components/CommaBox/CommaBox.vue.d.ts +2 -1
- package/dist/components/CommaBox/CommaBox.vue.js +6 -0
- package/dist/components/CommaBox/CommaBox.vue_vue_type_script_setup_true_lang.js +81 -0
- package/dist/components/CommaBox/types.d.ts +6 -7
- package/dist/components/CommonInputWrapper/CommonInputWrapper.vue.d.ts +19 -0
- package/dist/components/CommonInputWrapper/CommonInputWrapper.vue.js +6 -0
- package/dist/components/CommonInputWrapper/CommonInputWrapper.vue_vue_type_script_setup_true_lang.js +107 -0
- package/dist/components/CommonInputWrapper/types.d.ts +96 -0
- package/dist/components/CommonPopover/CommonPopover.vue.d.ts +3 -3
- package/dist/components/CommonPopover/CommonPopover.vue.js +6 -0
- package/dist/components/CommonPopover/CommonPopover.vue_vue_type_script_setup_true_lang.js +160 -0
- package/dist/components/CommonPopover/types.d.ts +61 -16
- package/dist/components/ErrorIcon/ErrorIcon.vue.d.ts +2 -0
- package/dist/components/ErrorIcon/ErrorIcon.vue.js +6 -0
- package/dist/components/ErrorIcon/ErrorIcon.vue_vue_type_script_setup_true_lang.js +16 -0
- package/dist/components/FlatListBox/FlatListBox.vue.d.ts +2 -5
- package/dist/components/FlatListBox/FlatListBox.vue.js +5 -0
- package/dist/components/FlatListBox/FlatListBox.vue_vue_type_script_setup_true_lang.js +167 -0
- package/dist/components/FlatListBox/types.d.ts +1 -1
- package/dist/components/GroupedListBox/GroupedListBox.vue.d.ts +2 -5
- package/dist/components/GroupedListBox/GroupedListBox.vue.js +5 -0
- package/dist/components/GroupedListBox/GroupedListBox.vue_vue_type_script_setup_true_lang.js +218 -0
- package/dist/components/ListBox/ListBox.vue.d.ts +3 -6
- package/dist/components/ListBox/ListBox.vue.js +5 -0
- package/dist/components/ListBox/ListBox.vue_vue_type_script_setup_true_lang.js +112 -0
- package/dist/components/ListBox/types.d.ts +1 -1
- package/dist/components/OptionsContainer/OptionsContainer.vue.d.ts +1 -0
- package/dist/components/OptionsContainer/OptionsContainer.vue.js +5 -0
- package/dist/components/OptionsContainer/OptionsContainer.vue_vue_type_script_setup_true_lang.js +52 -0
- package/dist/components/OptionsContainer/types.d.ts +14 -24
- package/dist/components/Transitions/ScaleFade.vue.js +5 -0
- package/dist/components/Transitions/ScaleFade.vue_vue_type_script_setup_true_lang.js +47 -0
- package/dist/components/Transitions/Slide.vue.js +7 -0
- package/dist/components/Transitions/Slide.vue_vue_type_script_setup_true_lang.js +28 -0
- package/dist/components/WarningIcon/WarningIcon.vue.d.ts +5 -0
- package/dist/components/WarningIcon/WarningIcon.vue.js +6 -0
- package/dist/components/WarningIcon/WarningIcon.vue_vue_type_script_setup_true_lang.js +16 -0
- package/dist/components/WarningIcon/types.d.ts +3 -0
- package/dist/composables/__testResets.d.ts +1 -0
- package/dist/composables/useActiveInactiveState.d.ts +4 -0
- package/dist/composables/useActiveInactiveState.js +21 -0
- package/dist/composables/useBaseOptions.d.ts +3 -3
- package/dist/composables/useBaseOptions.js +31 -0
- package/dist/composables/useBbConfig.d.ts +8 -37
- package/dist/composables/useBbConfig.js +5 -0
- package/dist/composables/useBbDropdownContext.d.ts +89 -0
- package/dist/composables/useBbDropdownContext.js +46 -0
- package/dist/composables/useBbFormContext.d.ts +90 -0
- package/dist/composables/useBbFormContext.js +69 -0
- package/dist/composables/useBbTableContext.d.ts +195 -0
- package/dist/composables/useBbTableContext.js +208 -0
- package/dist/composables/useBbTabsContext.d.ts +111 -0
- package/dist/composables/useBbTabsContext.js +219 -0
- package/dist/composables/useBreakpoint.d.ts +13 -0
- package/dist/composables/useBreakpoint.js +39 -0
- package/dist/composables/useBroadcastChannelInstance.d.ts +1 -3
- package/dist/composables/useBroadcastChannelInstance.js +39 -0
- package/dist/composables/useCancelableFunction.js +37 -0
- package/dist/composables/useCoherence.js +16 -0
- package/dist/composables/useConfirm.d.ts +257 -67
- package/dist/composables/useConfirm.js +122 -0
- package/dist/composables/useCountdown.js +42 -0
- package/dist/composables/useHashedWatcher.d.ts +17 -0
- package/dist/composables/useHashedWatcher.js +14 -0
- package/dist/composables/useId.d.ts +3 -2
- package/dist/composables/useIndexById.js +16 -0
- package/dist/composables/useInertiaPage.d.ts +10 -0
- package/dist/composables/useInertiaPage.js +8 -0
- package/dist/composables/useItemText.js +17 -0
- package/dist/composables/useItemValue.js +9 -0
- package/dist/composables/useItemsGetter.d.ts +1 -1
- package/dist/composables/useItemsGetter.js +30 -0
- package/dist/composables/useListboxFocus.js +66 -0
- package/dist/composables/useLocale.d.ts +1 -1
- package/dist/composables/useLocale.js +11 -0
- package/dist/composables/useLogger.d.ts +1 -1
- package/dist/composables/useLogger.js +10 -0
- package/dist/composables/useMinimalQueue.d.ts +1 -1
- package/dist/composables/useMobile.js +7 -0
- package/dist/composables/useOnFalsy.d.ts +2 -0
- package/dist/composables/useOnFalsy.js +9 -0
- package/dist/composables/useOnTruthy.d.ts +7 -0
- package/dist/composables/useOnTruthy.js +9 -0
- package/dist/composables/usePrefill.d.ts +2 -1
- package/dist/composables/usePrefill.js +24 -0
- package/dist/composables/useQuery.d.ts +15 -3
- package/dist/composables/useQuery.js +42 -0
- package/dist/composables/useRoute.js +11 -0
- package/dist/composables/useRouter.js +8 -0
- package/dist/composables/useSafeArea.d.ts +51 -0
- package/dist/composables/useSafeArea.js +16 -0
- package/dist/composables/useSegmentedFields.d.ts +103 -0
- package/dist/composables/useSegmentedFields.js +152 -0
- package/dist/composables/useTableWidthContext.d.ts +5 -0
- package/dist/composables/useTableWidthContext.js +42 -0
- package/dist/composables/useToast.d.ts +17 -73
- package/dist/composables/useToast.js +49 -0
- package/dist/composables/useTopLayer.d.ts +9 -0
- package/dist/composables/useTopLayer.js +7 -0
- package/dist/composables/useUntil.js +13 -0
- package/dist/composables/useViewportWidth.d.ts +17 -0
- package/dist/composables/useViewportWidth.js +6 -0
- package/dist/confirm-variants.d.ts +10 -0
- package/dist/deprecation/ai-deprecations.json.d.ts +784 -0
- package/dist/deprecation/ai-deprecations.json.js +4 -0
- package/dist/deprecation/removedProps.d.ts +3 -0
- package/dist/deprecation/removedProps.js +13 -0
- package/dist/directives/bbColor.d.ts +65 -0
- package/dist/directives/bbColor.js +24 -0
- package/dist/directives/bbDate.d.ts +66 -0
- package/dist/directives/bbDate.js +24 -0
- package/dist/directives/bbDropdown.d.ts +15 -11
- package/dist/directives/bbDropdown.js +23 -0
- package/dist/directives/bbTime.d.ts +64 -0
- package/dist/directives/bbTime.js +24 -0
- package/dist/directives/bbTooltip.d.ts +16 -11
- package/dist/directives/bbTooltip.js +24 -0
- package/dist/dropdown-item-variants.d.ts +10 -0
- package/dist/i18n/index.d.ts +51 -3
- package/dist/i18n/index.js +27 -0
- package/dist/i18n/locales/cs.json +115 -0
- package/dist/i18n/locales/da.json +115 -0
- package/dist/i18n/locales/de.json +115 -0
- package/dist/i18n/locales/el.json +115 -0
- package/dist/i18n/locales/en.json +115 -0
- package/dist/i18n/locales/es.json +115 -0
- package/dist/i18n/locales/fi.json +115 -0
- package/dist/i18n/locales/fr.json +115 -0
- package/dist/i18n/locales/hu.json +115 -0
- package/dist/i18n/locales/it.json +115 -0
- package/dist/i18n/locales/ja.json +115 -0
- package/dist/i18n/locales/ko.json +115 -0
- package/dist/i18n/locales/nb.json +115 -0
- package/dist/i18n/locales/nl.json +115 -0
- package/dist/i18n/locales/pl.json +115 -0
- package/dist/i18n/locales/pt.json +115 -0
- package/dist/i18n/locales/ro.json +115 -0
- package/dist/i18n/locales/ru.json +115 -0
- package/dist/i18n/locales/sv.json +115 -0
- package/dist/i18n/locales/tr.json +115 -0
- package/dist/i18n/locales/uk.json +115 -0
- package/dist/i18n/locales/zh-cn.json +115 -0
- package/dist/icons-whitelist.d.ts +8 -0
- package/dist/index.d.ts +94 -79
- package/dist/index.js +76 -82
- package/dist/indicator-variants.d.ts +13 -0
- package/dist/llms-full.txt +77073 -0
- package/dist/llms-medium.txt +1334 -0
- package/dist/llms.txt +103 -0
- package/dist/locale-blueprint.json +141 -0
- package/dist/nuxt-module.d.ts +3 -0
- package/dist/nuxt.js +19 -0
- package/dist/plugin.d.ts +4 -0
- package/dist/plugin.js +22 -0
- package/dist/reset.css +1 -0
- package/dist/reset.d.ts +0 -0
- package/dist/runtime/nuxt-plugin.d.ts +2 -0
- package/dist/runtime/nuxt-plugin.js +24 -0
- package/dist/styles.css +2 -0
- package/dist/styles.d.ts +0 -0
- package/dist/toast-variants.d.ts +13 -0
- package/dist/tooltip-variants.d.ts +10 -0
- package/dist/types/ActionButton.d.ts +32 -0
- package/dist/types/AlertVariant.d.ts +16 -0
- package/dist/types/BadgeVariant.d.ts +16 -0
- package/dist/types/ButtonVariant.d.ts +17 -0
- package/dist/types/Classes.d.ts +1 -1
- package/dist/types/ColumnName.d.ts +1 -1
- package/dist/types/CommonProps.d.ts +66 -279
- package/dist/types/Config.d.ts +84 -0
- package/dist/types/ConfirmVariant.d.ts +15 -0
- package/dist/types/DropdownItemVariant.d.ts +18 -0
- package/dist/types/Icon.d.ts +5 -7
- package/dist/types/IndicatorVariant.d.ts +16 -0
- package/dist/types/InputDirection.d.ts +15 -0
- package/dist/types/ItemAccessor.d.ts +21 -0
- package/dist/types/Placement.d.ts +6 -0
- package/dist/types/ResponsiveSize.d.ts +20 -0
- package/dist/types/SizeScale.d.ts +8 -0
- package/dist/types/ToastVariant.d.ts +17 -0
- package/dist/types/TooltipVariant.d.ts +18 -0
- package/dist/utilities/functions/bytesToUnit.d.ts +2 -0
- package/dist/utilities/functions/bytesToUnit.js +18 -0
- package/dist/utilities/functions/clampPrecision.js +10 -0
- package/dist/utilities/functions/convertDateValue.d.ts +23 -10
- package/dist/utilities/functions/convertDateValue.js +12 -0
- package/dist/utilities/functions/deburr.js +5 -0
- package/dist/utilities/functions/empty.js +5 -0
- package/dist/utilities/functions/flattenTree.d.ts +1 -1
- package/dist/utilities/functions/hash.js +5 -0
- package/dist/utilities/functions/isDateDisabled.d.ts +1 -0
- package/dist/utilities/functions/isDateDisabled.js +20 -0
- package/dist/utilities/functions/isEqual.js +5 -0
- package/dist/utilities/functions/isNotEmpty.js +5 -0
- package/dist/utilities/functions/matchAnyKey.d.ts +1 -1
- package/dist/utilities/functions/matchAnyKey.js +15 -0
- package/dist/utilities/functions/parseSize.d.ts +1 -1
- package/dist/utilities/functions/parseSize.js +15 -0
- package/dist/utilities/functions/percentage.js +11 -0
- package/dist/utilities/functions/pipe.d.ts +1 -1
- package/dist/utilities/functions/reject.d.ts +25 -0
- package/dist/utilities/functions/reject.js +28 -0
- package/dist/utilities/functions/resolveEnumProp.d.ts +19 -0
- package/dist/utilities/functions/resolveEnumProp.js +5 -0
- package/dist/utilities/functions/slotKey.d.ts +13 -0
- package/dist/utilities/functions/slotKey.js +4 -0
- package/dist/utilities/functions/sort.d.ts +2 -2
- package/dist/utilities/functions/sort.js +19 -0
- package/dist/utilities/functions/throttle.js +5 -0
- package/dist/utilities/functions/waitFor.d.ts +9 -2
- package/dist/utilities/functions/waitFor.js +14 -0
- package/dist/utilities/functions/warnRemovedAttrs.d.ts +11 -0
- package/dist/utilities/functions/warnRemovedAttrs.js +20 -0
- package/dist/utilities/functions/when.js +5 -0
- package/dist/utilities/misc/iconsInjectionKey.d.ts +15 -0
- package/dist/utilities/misc/iconsInjectionKey.js +4 -0
- package/dist/utilities/misc/transitions.d.ts +5 -0
- package/dist/utilities/misc/transitions.js +8 -0
- package/dist/utils/injectLibraryStyles.d.ts +6 -0
- package/dist/utils/injectLibraryStyles.js +38 -0
- package/dist/validated/BbCheckbox.vue.d.ts +29 -0
- package/dist/validated/BbCheckbox.vue.js +5 -0
- package/dist/validated/BbCheckbox.vue_vue_type_script_setup_true_lang.js +75 -0
- package/dist/validated/BbCheckboxGroup.vue.d.ts +34 -0
- package/dist/validated/BbCheckboxGroup.vue.js +5 -0
- package/dist/validated/BbCheckboxGroup.vue_vue_type_script_setup_true_lang.js +76 -0
- package/dist/validated/BbColorInput.vue.d.ts +36 -0
- package/dist/validated/BbColorInput.vue.js +5 -0
- package/dist/validated/BbColorInput.vue_vue_type_script_setup_true_lang.js +71 -0
- package/dist/validated/BbDatePickerInput.vue.d.ts +40 -0
- package/dist/validated/BbDatePickerInput.vue.js +5 -0
- package/dist/validated/BbDatePickerInput.vue_vue_type_script_setup_true_lang.js +87 -0
- package/dist/validated/BbDropzone.vue.d.ts +24 -0
- package/dist/validated/BbDropzone.vue.js +5 -0
- package/dist/validated/BbDropzone.vue_vue_type_script_setup_true_lang.js +45 -0
- package/dist/validated/BbForm.vue.d.ts +28 -0
- package/dist/validated/BbForm.vue.js +5 -0
- package/dist/validated/BbForm.vue_vue_type_script_setup_true_lang.js +42 -0
- package/dist/validated/BbNumberInput.vue.d.ts +36 -0
- package/dist/validated/BbNumberInput.vue.js +5 -0
- package/dist/validated/BbNumberInput.vue_vue_type_script_setup_true_lang.js +72 -0
- package/dist/validated/BbRadioGroup.vue.d.ts +34 -0
- package/dist/validated/BbRadioGroup.vue.js +5 -0
- package/dist/validated/BbRadioGroup.vue_vue_type_script_setup_true_lang.js +75 -0
- package/dist/validated/BbRating.vue.d.ts +30 -0
- package/dist/validated/BbRating.vue.js +5 -0
- package/dist/validated/BbRating.vue_vue_type_script_setup_true_lang.js +63 -0
- package/dist/validated/BbSelect.vue.d.ts +46 -0
- package/dist/validated/BbSelect.vue.js +5 -0
- package/dist/validated/BbSelect.vue_vue_type_script_setup_true_lang.js +100 -0
- package/dist/validated/BbSlider.vue.d.ts +36 -0
- package/dist/validated/BbSlider.vue.js +5 -0
- package/dist/validated/BbSlider.vue_vue_type_script_setup_true_lang.js +69 -0
- package/dist/validated/BbSwitch.vue.d.ts +29 -0
- package/dist/validated/BbSwitch.vue.js +5 -0
- package/dist/validated/BbSwitch.vue_vue_type_script_setup_true_lang.js +75 -0
- package/dist/validated/BbSwitchGroup.vue.d.ts +34 -0
- package/dist/validated/BbSwitchGroup.vue.js +5 -0
- package/dist/validated/BbSwitchGroup.vue_vue_type_script_setup_true_lang.js +76 -0
- package/dist/validated/BbTag.vue.d.ts +36 -0
- package/dist/validated/BbTag.vue.js +5 -0
- package/dist/validated/BbTag.vue_vue_type_script_setup_true_lang.js +72 -0
- package/dist/validated/BbTextInput.vue.d.ts +36 -0
- package/dist/validated/BbTextInput.vue.js +5 -0
- package/dist/validated/BbTextInput.vue_vue_type_script_setup_true_lang.js +72 -0
- package/dist/validated/BbTextarea.vue.d.ts +36 -0
- package/dist/validated/BbTextarea.vue.js +5 -0
- package/dist/validated/BbTextarea.vue_vue_type_script_setup_true_lang.js +70 -0
- package/dist/validated/BbTimePickerInput.vue.d.ts +36 -0
- package/dist/validated/BbTimePickerInput.vue.js +5 -0
- package/dist/validated/BbTimePickerInput.vue_vue_type_script_setup_true_lang.js +78 -0
- package/dist/validated/index.d.ts +29 -0
- package/dist/validated/useValidatedField.d.ts +52 -0
- package/dist/validated/useValidatedField.js +51 -0
- package/dist/validated.js +21 -0
- package/dist/vite-plugin.d.ts +217 -0
- package/dist/vite.js +530 -0
- package/llms.txt +105 -0
- package/package.json +162 -60
- package/scripts/lib/__fixtures__/validated-manifest.json +65 -0
- package/scripts/lib/ensure-manifest.mjs +39 -0
- package/scripts/lib/eslint-plugin-autofix.node.test.mjs +109 -0
- package/scripts/lib/eslint-plugin.mjs +285 -0
- package/scripts/lib/eslint-plugin.node.test.mjs +161 -0
- package/scripts/lib/html-attributes.mjs +191 -0
- package/scripts/lib/mcp-config.mjs +126 -0
- package/scripts/lib/migrate-fix.mjs +115 -0
- package/scripts/lib/validate-bb-markup.mjs +421 -0
- package/dist/ai/BaseButton.md +0 -449
- package/dist/ai/BaseCheckbox.md +0 -512
- package/dist/ai/BaseCheckboxGroup.md +0 -597
- package/dist/ai/BaseColorInput.md +0 -461
- package/dist/ai/BaseDatePicker.md +0 -739
- package/dist/ai/BaseDatePickerInput.md +0 -1517
- package/dist/ai/BaseDialog.md +0 -610
- package/dist/ai/BaseInputContainer.md +0 -570
- package/dist/ai/BaseNumberInput.md +0 -509
- package/dist/ai/BaseRadio.md +0 -405
- package/dist/ai/BaseRadioGroup.md +0 -535
- package/dist/ai/BaseRating.md +0 -489
- package/dist/ai/BaseSelect.md +0 -1742
- package/dist/ai/BaseSlider.md +0 -871
- package/dist/ai/BaseSwitch.md +0 -322
- package/dist/ai/BaseSwitchGroup.md +0 -298
- package/dist/ai/BaseTag.md +0 -623
- package/dist/ai/BaseTextInput.md +0 -392
- package/dist/ai/BaseTextarea.md +0 -398
- package/dist/ai/BbChip.md +0 -147
- package/dist/ai/BbIntersection.md +0 -120
- package/dist/ai/BbRatio.md +0 -61
- package/dist/ai/BbRows.md +0 -307
- package/dist/ai/BbTab.md +0 -950
- package/dist/ai/CommonInputInnerContainer.md +0 -414
- package/dist/ai/CommonInputOuterContainer.md +0 -55
- package/dist/components/BaseButton/BaseButton.vue.d.ts +0 -14
- package/dist/components/BaseButton/types.d.ts +0 -159
- package/dist/components/BaseCheckbox/BaseCheckbox.vue.d.ts +0 -39
- package/dist/components/BaseCheckbox/types.d.ts +0 -213
- package/dist/components/BaseCheckboxGroup/BaseCheckboxGroup.vue.d.ts +0 -30
- package/dist/components/BaseCheckboxGroup/types.d.ts +0 -282
- package/dist/components/BaseColorInput/BaseColorInput.vue.d.ts +0 -35
- package/dist/components/BaseColorInput/ColorPalette.vue.d.ts +0 -13
- package/dist/components/BaseColorInput/types.d.ts +0 -233
- package/dist/components/BaseDatePicker/BaseDatePickerHeader.vue.d.ts +0 -15
- package/dist/components/BaseDatePicker/BaseDatePickerInputDaySelector.vue.d.ts +0 -58
- package/dist/components/BaseDatePicker/BaseDatePickerMonthSelector.vue.d.ts +0 -12
- package/dist/components/BaseDatePicker/BaseDatePickerYearSelector.vue.d.ts +0 -12
- package/dist/components/BaseDatePicker/types.d.ts +0 -100
- package/dist/components/BaseDatePickerInput/BaseDatePickerInput.vue.d.ts +0 -26
- package/dist/components/BaseDatePickerInput/types.d.ts +0 -206
- package/dist/components/BaseDialog/BaseDialog.vue.d.ts +0 -37
- package/dist/components/BaseDialog/types.d.ts +0 -180
- package/dist/components/BaseInputContainer/BaseInputContainer.vue.d.ts +0 -18
- package/dist/components/BaseInputContainer/types.d.ts +0 -126
- package/dist/components/BaseNumberInput/BaseNumberInput.vue.d.ts +0 -46
- package/dist/components/BaseNumberInput/types.d.ts +0 -191
- package/dist/components/BaseRadio/BaseRadio.vue.d.ts +0 -31
- package/dist/components/BaseRadio/types.d.ts +0 -173
- package/dist/components/BaseRadioGroup/BaseRadioGroup.vue.d.ts +0 -30
- package/dist/components/BaseRadioGroup/types.d.ts +0 -240
- package/dist/components/BaseRating/BaseRating.vue.d.ts +0 -35
- package/dist/components/BaseRating/types.d.ts +0 -144
- package/dist/components/BaseSelect/BaseSelect.vue.d.ts +0 -28
- package/dist/components/BaseSelect/types.d.ts +0 -470
- package/dist/components/BaseSlider/BaseSlider.vue.d.ts +0 -38
- package/dist/components/BaseSlider/types.d.ts +0 -201
- package/dist/components/BaseSwitch/BaseSwitch.vue.d.ts +0 -34
- package/dist/components/BaseSwitch/types.d.ts +0 -25
- package/dist/components/BaseSwitchGroup/BaseSwitchGroup.vue.d.ts +0 -30
- package/dist/components/BaseSwitchGroup/types.d.ts +0 -8
- package/dist/components/BaseTag/BaseTag.vue.d.ts +0 -37
- package/dist/components/BaseTag/types.d.ts +0 -136
- package/dist/components/BaseTextInput/BaseTextInput.vue.d.ts +0 -33
- package/dist/components/BaseTextInput/types.d.ts +0 -166
- package/dist/components/BaseTextarea/BaseTextarea.vue.d.ts +0 -31
- package/dist/components/BaseTextarea/types.d.ts +0 -151
- package/dist/components/BbChip/BbChip.vue.d.ts +0 -17
- package/dist/components/BbChip/types.d.ts +0 -23
- package/dist/components/BbIntersection/BbIntersection.vue.d.ts +0 -23
- package/dist/components/BbIntersection/types.d.ts +0 -36
- package/dist/components/BbRatio/BbRatio.vue.d.ts +0 -14
- package/dist/components/BbRatio/types.d.ts +0 -15
- package/dist/components/BbRows/BbRows.vue.d.ts +0 -62
- package/dist/components/BbRows/types.d.ts +0 -21
- package/dist/components/BbTab/BbTab.vue.d.ts +0 -27
- package/dist/components/BbTab/types.d.ts +0 -186
- package/dist/components/CommonInputInnerContainer/CommonInputInnerContainer.vue.d.ts +0 -15
- package/dist/components/CommonInputInnerContainer/types.d.ts +0 -47
- package/dist/components/CommonInputOuterContainer/CommonInputOuterContainer.vue.d.ts +0 -11
- package/dist/components/CommonInputOuterContainer/types.d.ts +0 -16
- package/dist/composables/useModalsState.d.ts +0 -5
- package/dist/composables/useQueue.d.ts +0 -58
- package/dist/composables/useWizard.d.ts +0 -85
- package/dist/i18n/en.d.ts +0 -67
- package/dist/i18n/it.d.ts +0 -67
- package/dist/index.css +0 -2
- package/dist/index100.js +0 -6
- package/dist/index101.js +0 -300
- package/dist/index102.js +0 -16
- package/dist/index103.js +0 -16
- package/dist/index104.js +0 -27
- package/dist/index109.js +0 -19
- package/dist/index11.js +0 -42
- package/dist/index110.js +0 -12
- package/dist/index111.js +0 -19
- package/dist/index112.js +0 -25
- package/dist/index114.js +0 -7
- package/dist/index115.js +0 -241
- package/dist/index116.js +0 -5
- package/dist/index117.js +0 -42
- package/dist/index118.js +0 -5
- package/dist/index119.js +0 -53
- package/dist/index120.js +0 -5
- package/dist/index121.js +0 -32
- package/dist/index122.js +0 -5
- package/dist/index124.js +0 -52
- package/dist/index125.js +0 -5
- package/dist/index126.js +0 -223
- package/dist/index128.js +0 -6
- package/dist/index129.js +0 -162
- package/dist/index13.js +0 -92
- package/dist/index130.js +0 -25
- package/dist/index131.js +0 -51
- package/dist/index132.js +0 -5
- package/dist/index133.js +0 -607
- package/dist/index135.js +0 -6
- package/dist/index136.js +0 -14
- package/dist/index137.js +0 -153
- package/dist/index139.js +0 -6
- package/dist/index14.js +0 -306
- package/dist/index140.js +0 -224
- package/dist/index141.js +0 -5
- package/dist/index143.js +0 -128
- package/dist/index145.js +0 -6
- package/dist/index146.js +0 -8
- package/dist/index147.js +0 -182
- package/dist/index149.js +0 -6
- package/dist/index15.js +0 -10
- package/dist/index151.js +0 -4
- package/dist/index152.js +0 -95
- package/dist/index154.js +0 -6
- package/dist/index155.js +0 -168
- package/dist/index157.js +0 -6
- package/dist/index158.js +0 -145
- package/dist/index16.js +0 -59
- package/dist/index160.js +0 -6
- package/dist/index161.js +0 -53
- package/dist/index163.js +0 -6
- package/dist/index164.js +0 -16
- package/dist/index166.js +0 -35
- package/dist/index168.js +0 -6
- package/dist/index169.js +0 -89
- package/dist/index171.js +0 -6
- package/dist/index172.js +0 -82
- package/dist/index174.js +0 -6
- package/dist/index175.js +0 -38
- package/dist/index176.js +0 -461
- package/dist/index177.js +0 -28
- package/dist/index178.js +0 -66
- package/dist/index18.js +0 -35
- package/dist/index180.js +0 -162
- package/dist/index181.js +0 -5
- package/dist/index182.js +0 -217
- package/dist/index183.js +0 -5
- package/dist/index184.js +0 -112
- package/dist/index185.js +0 -5
- package/dist/index186.js +0 -459
- package/dist/index188.js +0 -6
- package/dist/index19.js +0 -4
- package/dist/index192.js +0 -268
- package/dist/index194.js +0 -6
- package/dist/index195.js +0 -124
- package/dist/index197.js +0 -6
- package/dist/index198.js +0 -174
- package/dist/index2.js +0 -20
- package/dist/index20.js +0 -9
- package/dist/index200.js +0 -6
- package/dist/index201.js +0 -224
- package/dist/index203.js +0 -6
- package/dist/index204.js +0 -135
- package/dist/index206.js +0 -6
- package/dist/index207.js +0 -5
- package/dist/index208.js +0 -170
- package/dist/index21.js +0 -35
- package/dist/index210.js +0 -6
- package/dist/index211.js +0 -37
- package/dist/index213.js +0 -6
- package/dist/index214.js +0 -63
- package/dist/index216.js +0 -6
- package/dist/index217.js +0 -74
- package/dist/index219.js +0 -6
- package/dist/index22.js +0 -6
- package/dist/index220.js +0 -65
- package/dist/index222.js +0 -6
- package/dist/index223.js +0 -67
- package/dist/index225.js +0 -6
- package/dist/index226.js +0 -41
- package/dist/index228.js +0 -6
- package/dist/index229.js +0 -10
- package/dist/index23.js +0 -7
- package/dist/index230.js +0 -22
- package/dist/index232.js +0 -8
- package/dist/index233.js +0 -297
- package/dist/index235.js +0 -6
- package/dist/index236.js +0 -47
- package/dist/index237.js +0 -165
- package/dist/index239.js +0 -6
- package/dist/index24.js +0 -9
- package/dist/index241.js +0 -159
- package/dist/index243.js +0 -6
- package/dist/index244.js +0 -134
- package/dist/index246.js +0 -6
- package/dist/index247.js +0 -167
- package/dist/index249.js +0 -6
- package/dist/index25.js +0 -24
- package/dist/index250.js +0 -147
- package/dist/index252.js +0 -6
- package/dist/index253.js +0 -35
- package/dist/index255.js +0 -6
- package/dist/index256.js +0 -65
- package/dist/index258.js +0 -6
- package/dist/index259.js +0 -19
- package/dist/index260.js +0 -5
- package/dist/index261.js +0 -160
- package/dist/index263.js +0 -6
- package/dist/index264.js +0 -60
- package/dist/index266.js +0 -6
- package/dist/index267.js +0 -134
- package/dist/index269.js +0 -6
- package/dist/index27.js +0 -4
- package/dist/index271.js +0 -206
- package/dist/index273.js +0 -6
- package/dist/index274.js +0 -85
- package/dist/index275.js +0 -5
- package/dist/index276.js +0 -55
- package/dist/index277.js +0 -5
- package/dist/index278.js +0 -164
- package/dist/index28.js +0 -8
- package/dist/index280.js +0 -6
- package/dist/index281.js +0 -145
- package/dist/index283.js +0 -6
- package/dist/index284.js +0 -11
- package/dist/index285.js +0 -200
- package/dist/index287.js +0 -6
- package/dist/index288.js +0 -241
- package/dist/index29.js +0 -7
- package/dist/index290.js +0 -6
- package/dist/index291.js +0 -21
- package/dist/index293.js +0 -6
- package/dist/index294.js +0 -125
- package/dist/index296.js +0 -6
- package/dist/index297.js +0 -161
- package/dist/index299.js +0 -6
- package/dist/index30.js +0 -118
- package/dist/index300.js +0 -127
- package/dist/index302.js +0 -6
- package/dist/index303.js +0 -20
- package/dist/index305.js +0 -6
- package/dist/index306.js +0 -116
- package/dist/index307.js +0 -5
- package/dist/index308.js +0 -507
- package/dist/index31.js +0 -10
- package/dist/index310.js +0 -6
- package/dist/index311.js +0 -196
- package/dist/index313.js +0 -6
- package/dist/index314.js +0 -142
- package/dist/index316.js +0 -6
- package/dist/index317.js +0 -134
- package/dist/index319.js +0 -6
- package/dist/index32.js +0 -28
- package/dist/index320.js +0 -162
- package/dist/index322.js +0 -6
- package/dist/index323.js +0 -319
- package/dist/index325.js +0 -6
- package/dist/index326.js +0 -40
- package/dist/index327.js +0 -43
- package/dist/index328.js +0 -665
- package/dist/index33.js +0 -5
- package/dist/index330.js +0 -6
- package/dist/index331.js +0 -155
- package/dist/index333.js +0 -6
- package/dist/index334.js +0 -142
- package/dist/index336.js +0 -6
- package/dist/index337.js +0 -155
- package/dist/index339.js +0 -6
- package/dist/index34.js +0 -112
- package/dist/index340.js +0 -58
- package/dist/index341.js +0 -5
- package/dist/index342.js +0 -20
- package/dist/index344.js +0 -6
- package/dist/index345.js +0 -142
- package/dist/index347.js +0 -6
- package/dist/index349.js +0 -109
- package/dist/index351.js +0 -6
- package/dist/index353.js +0 -24
- package/dist/index354.js +0 -23
- package/dist/index355.js +0 -839
- package/dist/index356.js +0 -474
- package/dist/index357.js +0 -52
- package/dist/index358.js +0 -7
- package/dist/index36.js +0 -6
- package/dist/index38.js +0 -63
- package/dist/index39.js +0 -63
- package/dist/index40.js +0 -9
- package/dist/index42.js +0 -8
- package/dist/index43.js +0 -179
- package/dist/index44.js +0 -21
- package/dist/index46.js +0 -385
- package/dist/index48.js +0 -6
- package/dist/index49.js +0 -33
- package/dist/index5.js +0 -34
- package/dist/index50.js +0 -12
- package/dist/index51.js +0 -8
- package/dist/index52.js +0 -106
- package/dist/index53.js +0 -330
- package/dist/index54.js +0 -97
- package/dist/index55.js +0 -328
- package/dist/index56.js +0 -28
- package/dist/index57.js +0 -102
- package/dist/index58.js +0 -157
- package/dist/index6.js +0 -38
- package/dist/index60.js +0 -6
- package/dist/index61.js +0 -131
- package/dist/index62.js +0 -5
- package/dist/index65.js +0 -35
- package/dist/index66.js +0 -26
- package/dist/index68.js +0 -6
- package/dist/index69.js +0 -54
- package/dist/index7.js +0 -58
- package/dist/index71.js +0 -6
- package/dist/index72.js +0 -14
- package/dist/index74.js +0 -6
- package/dist/index75.js +0 -159
- package/dist/index77.js +0 -6
- package/dist/index78.js +0 -4
- package/dist/index79.js +0 -4
- package/dist/index80.js +0 -54
- package/dist/index81.js +0 -5
- package/dist/index82.js +0 -5
- package/dist/index83.js +0 -141
- package/dist/index85.js +0 -6
- package/dist/index86.js +0 -65
- package/dist/index88.js +0 -6
- package/dist/index89.js +0 -30
- package/dist/index9.js +0 -11
- package/dist/index90.js +0 -19
- package/dist/index91.js +0 -17
- package/dist/index92.js +0 -9
- package/dist/index93.js +0 -34
- package/dist/index95.js +0 -16
- package/dist/index96.js +0 -10
- package/dist/index97.js +0 -18
- package/dist/index98.js +0 -189
- package/dist/types/VoidHtmlElements.d.ts +0 -1
- package/dist/utilities/functions/add.d.ts +0 -1
- package/dist/utilities/functions/booleanishToBoolean.d.ts +0 -6
- package/dist/utilities/functions/capitalize.d.ts +0 -4
- package/dist/utilities/functions/cloneDeep.d.ts +0 -1
- package/dist/utilities/functions/debounce.d.ts +0 -1
- package/dist/utilities/functions/drop.d.ts +0 -1
- package/dist/utilities/functions/exceedsPrecision.d.ts +0 -1
- package/dist/utilities/functions/findRight.d.ts +0 -4
- package/dist/utilities/functions/findRightIndex.d.ts +0 -4
- package/dist/utilities/functions/flow.d.ts +0 -1
- package/dist/utilities/functions/getHueFromRGB.d.ts +0 -9
- package/dist/utilities/functions/groupBy.d.ts +0 -6
- package/dist/utilities/functions/gt.d.ts +0 -7
- package/dist/utilities/functions/hexToRGB.d.ts +0 -7
- package/dist/utilities/functions/hslToHex.d.ts +0 -1
- package/dist/utilities/functions/includes.d.ts +0 -1
- package/dist/utilities/functions/initial.d.ts +0 -1
- package/dist/utilities/functions/isCssColor.d.ts +0 -5
- package/dist/utilities/functions/lt.d.ts +0 -7
- package/dist/utilities/functions/makeUrl.d.ts +0 -1
- package/dist/utilities/functions/mapKeys.d.ts +0 -5
- package/dist/utilities/functions/mapValues.d.ts +0 -1
- package/dist/utilities/functions/matchesPropertyInsensitive.d.ts +0 -1
- package/dist/utilities/functions/max.d.ts +0 -2
- package/dist/utilities/functions/mean.d.ts +0 -4
- package/dist/utilities/functions/merge.d.ts +0 -11
- package/dist/utilities/functions/millisecondsTo.d.ts +0 -1
- package/dist/utilities/functions/negate.d.ts +0 -4
- package/dist/utilities/functions/normalizeItemGroups.d.ts +0 -13
- package/dist/utilities/functions/omit.d.ts +0 -2
- package/dist/utilities/functions/overEvery.d.ts +0 -4
- package/dist/utilities/functions/pick.d.ts +0 -1
- package/dist/utilities/functions/replace.d.ts +0 -1
- package/dist/utilities/functions/replaceInTree.d.ts +0 -4
- package/dist/utilities/functions/retry.d.ts +0 -5
- package/dist/utilities/functions/roundToTheNearest.d.ts +0 -8
- package/dist/utilities/functions/set.d.ts +0 -15
- package/dist/utilities/functions/stub.d.ts +0 -6
- package/dist/utilities/functions/transposePercent.d.ts +0 -9
- package/dist/utilities/functions/tryTo.d.ts +0 -2
- package/dist/utilities/functions/uniqBy.d.ts +0 -1
- /package/dist/{index64.js → _virtual/_plugin-vue_export-helper.js} +0 -0
- /package/dist/components/{BaseButton → BbBaseButton}/RouterComponent.vue.d.ts +0 -0
- /package/dist/components/{BaseDatePicker/BaseDatePicker.vue.d.ts → BbBaseDatePicker/BbBaseDatePicker.vue.d.ts} +0 -0
- /package/dist/{index165.js → composables/useArray.js} +0 -0
- /package/dist/{index17.js → composables/useFrameworkDetection.js} +0 -0
- /package/dist/{index12.js → composables/useId.js} +0 -0
- /package/dist/{index352.js → directives/createPopoverDirective.js} +0 -0
- /package/dist/{index107.js → utilities/functions/chunk.js} +0 -0
- /package/dist/{index8.js → utilities/functions/clamp.js} +0 -0
- /package/dist/{index150.js → utilities/functions/curry.js} +0 -0
- /package/dist/{index45.js → utilities/functions/extractDomContainer.js} +0 -0
- /package/dist/{index270.js → utilities/functions/findInTree.js} +0 -0
- /package/dist/{index348.js → utilities/functions/flattenTree.js} +0 -0
- /package/dist/{index41.js → utilities/functions/get.js} +0 -0
- /package/dist/{index189.js → utilities/functions/head.js} +0 -0
- /package/dist/{index108.js → utilities/functions/identity.js} +0 -0
- /package/dist/{index179.js → utilities/functions/indexBy.js} +0 -0
- /package/dist/{index37.js → utilities/functions/isHex.js} +0 -0
- /package/dist/{index94.js → utilities/functions/isNil.js} +0 -0
- /package/dist/{index26.js → utilities/functions/isNotNil.js} +0 -0
- /package/dist/{index105.js → utilities/functions/last.js} +0 -0
- /package/dist/{index142.js → utilities/functions/noop.js} +0 -0
- /package/dist/{index231.js → utilities/functions/parseWidthString.js} +0 -0
- /package/dist/{index240.js → utilities/functions/pickBy.js} +0 -0
- /package/dist/{index123.js → utilities/functions/range.js} +0 -0
- /package/dist/{index190.js → utilities/functions/snapToStep.js} +0 -0
- /package/dist/{index191.js → utilities/functions/transpose.js} +0 -0
- /package/dist/{index106.js → utilities/functions/validateDateFormat.js} +0 -0
- /package/dist/{index10.js → utilities/functions/wait.js} +0 -0
|
@@ -0,0 +1,1281 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Ownership Atlas (Inertia)
|
|
3
|
+
summary: Nested-table ownership atlas for Laravel + Inertia — expandable owner rows whose holdings render as a child BbTable snapped onto the parent's column tracks (inherit-column-widths + per-column snap), select-all-across-pages bulk transfer, region-visit tabs, URL-mirrored filters, expand/collapse-all, and a row-highlight owner peek, all through one page context that coopts the Inertia Helpers toolkit.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Recipe: Ownership Atlas (Inertia)
|
|
7
|
+
|
|
8
|
+
A resource-ownership admin page for **Laravel + Inertia** — the "who owns
|
|
9
|
+
what" screen every internal console grows (Okta's people → assigned
|
|
10
|
+
resources, a cloud console's cost-by-owner rollup): a dense, server-paged
|
|
11
|
+
table of owners where **expanding a row reveals a nested `BbTable` of the
|
|
12
|
+
holdings that owner is responsible for, column-aligned under the parent's
|
|
13
|
+
own tracks**. Around that signature move sits the full standard anatomy:
|
|
14
|
+
breadcrumbs + page search, a holding-type filter pill, region tabs with live
|
|
15
|
+
counts, expand/collapse-all controls, selection with a floating bulk
|
|
16
|
+
**Transfer holdings** action, and an owner peek sidebar opened by row
|
|
17
|
+
highlight. The list is a page prop, filters mirror into the URL through
|
|
18
|
+
[`useQueryObject`](../../guides/inertia-helpers.md), selection and paging
|
|
19
|
+
come from the keyed [`useTableContext`](../../guides/inertia-helpers.md),
|
|
20
|
+
and the one mutation is a promise-wrapped `router.visit`. Anatomy,
|
|
21
|
+
components, the context shape, copy and data are identical to the Vue
|
|
22
|
+
recipe; only the data/URL/mutation layer changes.
|
|
23
|
+
|
|
24
|
+
Sibling recipes: [Vue](../vue/ownership-atlas.md) ·
|
|
25
|
+
[Nuxt](../nuxt/ownership-atlas.md).
|
|
26
|
+
|
|
27
|
+
## Prerequisites
|
|
28
|
+
|
|
29
|
+
- `<BbToast />` mounted once in the app layout.
|
|
30
|
+
- From the [Inertia Helpers](../../guides/inertia-helpers.md) toolkit:
|
|
31
|
+
`useTableContext`, `useQueryObject`, `useResourceContext` (plus the
|
|
32
|
+
`useProp` / `useQuery` prop-and-URL helpers).
|
|
33
|
+
- Controller: `Inertia::render('OwnershipAtlas', ['owners' =>
|
|
34
|
+
OwnerPaginator::make(...), 'tabCounts' => [...], 'ownerOptions' => [...]])` —
|
|
35
|
+
`owners` is a standard Laravel paginator (`PaginatedResponse<Owner>`) whose
|
|
36
|
+
rows **embed their holdings** (the expand row renders instantly, no
|
|
37
|
+
per-expand fetch), `tabCounts` a plain `{ all, americas, emea, apac }` map,
|
|
38
|
+
and `ownerOptions` the flat `{ id, name, team }` catalog the transfer
|
|
39
|
+
picker offers. All three are re-sent on the partial reloads the page
|
|
40
|
+
triggers. The `kinds` filter is applied to the holdings server-side: owners
|
|
41
|
+
with no matching holding drop out, and each surviving owner's
|
|
42
|
+
`holdingsCount` / `monthlyTotal` are recomputed over the filtered set.
|
|
43
|
+
Search matches owner name, email, team **and** holding names.
|
|
44
|
+
- Mutation route: `PATCH /ownership/owners/bulk/transfer` (accepts the
|
|
45
|
+
select-all-across-pages payload `{ ids, all, unselected, toOwnerId }`,
|
|
46
|
+
redirects back). A small JSON endpoint
|
|
47
|
+
(`GET /ownership/owners/:id/peek`) backs the sidebar peek so opening it is
|
|
48
|
+
not a full-page visit.
|
|
49
|
+
|
|
50
|
+
## Key ideas
|
|
51
|
+
|
|
52
|
+
- **One coopting page context.** `provideOwnershipAtlas()` joins the
|
|
53
|
+
page-shell stack **and** the keyed `useTableContext('owners')` once, owns
|
|
54
|
+
filters/tab/expansion, and exposes complete actions. Every leaf calls
|
|
55
|
+
`useOwnershipAtlas()` and nothing else — zero prop drilling anywhere on
|
|
56
|
+
the page.
|
|
57
|
+
- **The expand row is a real nested `BbTable` that inherits the parent's
|
|
58
|
+
column tracks.** `inherit-column-widths` snaps the holdings table onto the
|
|
59
|
+
owners table's grid; because the parent is `selectable`, every child
|
|
60
|
+
column carries an explicit `snap` starting at `1` (`snap: 1…4`), so
|
|
61
|
+
Resource sits exactly under Owner and the right-aligned $/mo columns share
|
|
62
|
+
one edge. This is the recipe's signature move — the full defense is in
|
|
63
|
+
"Why it is built this way" and in the
|
|
64
|
+
[BbTable guide](../../BbTable.md) ("Nested tables that align with the
|
|
65
|
+
parent").
|
|
66
|
+
- **Page-level cell-padding overrides are scoped with direct-child
|
|
67
|
+
combinators.** The full-bleed treatment (`.table-flush`) pads the outer
|
|
68
|
+
table's first/last cells via `:deep(> table > thead > tr > th:first-child)`
|
|
69
|
+
— a bare descendant selector would also hit the nested table and clobber
|
|
70
|
+
the structural offset padding it computes to stay flush with the parent
|
|
71
|
+
grid.
|
|
72
|
+
- **Expansion is page state, not table-internal state.** `expanded` (owner
|
|
73
|
+
ids) lives in the context and binds through `v-model:expanded-items`, so
|
|
74
|
+
the toolbar (expand-all/collapse-all), the bulk bar (expand selected) and
|
|
75
|
+
the peek footer (expand in table) all write the same array the table
|
|
76
|
+
reads.
|
|
77
|
+
- **Row highlight IS the peek.** A two-way computed maps
|
|
78
|
+
`v-model:highlighted` onto the shell stack: clicking a row opens the owner
|
|
79
|
+
peek, clicking it again (or closing the sidebar) clears the highlight —
|
|
80
|
+
highlight and selection stay independent axes.
|
|
81
|
+
- **The table has no client-side fetch at all.** `owners` arrives as a page
|
|
82
|
+
prop; `useTableContext('owners')` turns it into `items` +
|
|
83
|
+
`totalItems`/`page`/`perPage` (URL-backed) + `selected`/`unselected`/`all`
|
|
84
|
+
(select-all-across-pages), and `BbTable` binds directly to that handle.
|
|
85
|
+
Filters mirror into the URL with `useQueryObject`; tabs are real visits
|
|
86
|
+
(`href` + `server: true` with component-level `navigation`).
|
|
87
|
+
- **The one mutation is a promise-wrapped `router.visit`.** A tiny local
|
|
88
|
+
`visit()` helper turns Inertia's callback API into a promise so
|
|
89
|
+
`bulkTransfer` stays an `async function` — identical call site to the
|
|
90
|
+
Vue/Nuxt versions.
|
|
91
|
+
- **Buttons are `md` by default**; `sm`/`xs` only in the toolbar, the table
|
|
92
|
+
rows, the peek footer and the bottom bar — the dense surfaces the
|
|
93
|
+
doctrine allows.
|
|
94
|
+
|
|
95
|
+
## Page anatomy
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
OwnershipAtlas/
|
|
99
|
+
Index.vue ← assembly: PageShell slots, toolbar, owners table, pagination
|
|
100
|
+
context.ts ← coopting page context (shell + useTableContext + filters + expansion + actions)
|
|
101
|
+
FilterRail.vue ← holding-type pill + clear-all
|
|
102
|
+
HoldingsTable.vue ← the nested BbTable, snapped onto the parent's tracks
|
|
103
|
+
SelectionBar.vue ← expand-selected + bulk transfer in the floating bottom panel
|
|
104
|
+
OwnerPeek.vue ← sidebar workbench for the highlighted owner
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Chrome assumed from the guides: [App Layout](../../guides/app-layout.md)
|
|
108
|
+
(left nav + fat footer), [Page Shell](../../guides/page-shell.md),
|
|
109
|
+
[Floating Bottom Panel](../../guides/floating-bottom-panel.md).
|
|
110
|
+
|
|
111
|
+
## Action inventory
|
|
112
|
+
|
|
113
|
+
| # | Action | Trigger | Mechanism |
|
|
114
|
+
| --- | --------------------------- | ------------------------------------ | --------------------------------------------------------- |
|
|
115
|
+
| 1 | Page search | topbar right | `filters.search` → `useQueryObject` partial visit |
|
|
116
|
+
| 2 | Filter holding type | filter rail pill | `BbSelectPopover` multiple over the kind catalog |
|
|
117
|
+
| 3 | Clear filters | rail (only when active), empty state | context `clearFilters()` |
|
|
118
|
+
| 4 | Switch region tab | server-visit tabs with counts | `BbTabs` `href` + `server: true` visit |
|
|
119
|
+
| 5 | Expand / collapse one owner | holdings-count control, actions col | `expandProps` toggle → `v-model:expanded-items` |
|
|
120
|
+
| 6 | Expand all on this page | toolbar icon button | `expandAllOnPage()` over the current page's rows |
|
|
121
|
+
| 7 | Collapse all | toolbar icon button | `collapseAll()` |
|
|
122
|
+
| 8 | Peek owner | click anywhere on a row | `v-model:highlighted` ↔ shell stack, JSON fetch |
|
|
123
|
+
| 9 | Expand in table | peek footer | adds the peeked owner to `expanded` |
|
|
124
|
+
| 10 | Select rows / select all | table checkboxes | `useTableContext` selection (across pages) |
|
|
125
|
+
| 11 | Expand selected | floating bottom panel | `expandSelected()` resolves the selection payload |
|
|
126
|
+
| 12 | Bulk transfer holdings | bottom panel one-shot popover | `bulkTransfer(toOwnerId)` → promise-wrapped visit + toast |
|
|
127
|
+
| 13 | Clear selection / paginate | bottom panel ×, `BbPagination` | `table.resetSelection()` / `table.page` v-model |
|
|
128
|
+
|
|
129
|
+
## The code
|
|
130
|
+
|
|
131
|
+
### context.ts
|
|
132
|
+
|
|
133
|
+
```ts
|
|
134
|
+
// OwnershipAtlas/context.ts
|
|
135
|
+
import {
|
|
136
|
+
computed,
|
|
137
|
+
inject,
|
|
138
|
+
provide,
|
|
139
|
+
reactive,
|
|
140
|
+
ref,
|
|
141
|
+
type ComputedRef,
|
|
142
|
+
type InjectionKey,
|
|
143
|
+
type Ref,
|
|
144
|
+
} from 'vue';
|
|
145
|
+
import { router } from '@inertiajs/vue3';
|
|
146
|
+
import type { RequestPayload } from '@inertiajs/core';
|
|
147
|
+
import { useToast, type BadgeVariantType } from 'bitboss-ui';
|
|
148
|
+
import {
|
|
149
|
+
usePageShellContext,
|
|
150
|
+
type PageShellContext,
|
|
151
|
+
} from '@/components/layout/usePageShellContext';
|
|
152
|
+
import {
|
|
153
|
+
useTableContext,
|
|
154
|
+
type TableContext,
|
|
155
|
+
} from '@/composables/useTableContext';
|
|
156
|
+
import { useQueryObject } from '@/composables/useQueryObject';
|
|
157
|
+
import { useProp } from '@/composables/useProp';
|
|
158
|
+
import { useQuery } from '@/composables/useQuery';
|
|
159
|
+
import type {
|
|
160
|
+
HoldingKind,
|
|
161
|
+
HoldingStatus,
|
|
162
|
+
Owner,
|
|
163
|
+
OwnerDetail,
|
|
164
|
+
OwnerOption,
|
|
165
|
+
OwnerRegion,
|
|
166
|
+
} from '@/types';
|
|
167
|
+
|
|
168
|
+
export type OwnershipTab = 'all' | OwnerRegion;
|
|
169
|
+
|
|
170
|
+
/** What the sidebar can show. Row highlight pushes one of these. */
|
|
171
|
+
export type PeekItem = { type: 'owner'; id: string };
|
|
172
|
+
|
|
173
|
+
export interface OwnershipFilters {
|
|
174
|
+
search: string;
|
|
175
|
+
kinds: HoldingKind[];
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Shared label/variant catalogs: defined once beside the context, imported
|
|
179
|
+
// by every leaf that renders a kind, status or region.
|
|
180
|
+
export const KIND_LABEL: Record<HoldingKind, string> = {
|
|
181
|
+
workspace: 'Workspace',
|
|
182
|
+
project: 'Project',
|
|
183
|
+
domain: 'Domain',
|
|
184
|
+
database: 'Database',
|
|
185
|
+
vault: 'Vault',
|
|
186
|
+
device: 'Device',
|
|
187
|
+
'seat-pool': 'Seat pool',
|
|
188
|
+
bucket: 'Bucket',
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
export const STATUS_LABEL: Record<HoldingStatus, string> = {
|
|
192
|
+
active: 'Active',
|
|
193
|
+
paused: 'Paused',
|
|
194
|
+
provisioning: 'Provisioning',
|
|
195
|
+
retired: 'Retired',
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
export const STATUS_VARIANT: Record<HoldingStatus, BadgeVariantType> = {
|
|
199
|
+
active: 'soft-green',
|
|
200
|
+
paused: 'soft-amber',
|
|
201
|
+
provisioning: 'soft-blue',
|
|
202
|
+
retired: 'soft-gray',
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
export const REGION_LABEL: Record<OwnerRegion, string> = {
|
|
206
|
+
americas: 'Americas',
|
|
207
|
+
emea: 'EMEA',
|
|
208
|
+
apac: 'APAC',
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
const RELOAD_PROPS = ['owners', 'tabCounts', 'ownerOptions'] as const;
|
|
212
|
+
|
|
213
|
+
/** Comma-joined query value → typed array (or [] when absent). */
|
|
214
|
+
const toArray = <T = string>(value: unknown): T[] => {
|
|
215
|
+
if (Array.isArray(value)) return value as T[];
|
|
216
|
+
if (typeof value === 'string' && value.length) return value.split(',') as T[];
|
|
217
|
+
return [];
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
export interface OwnershipAtlasContext {
|
|
221
|
+
// -- Coopted contexts ------------------------------------------------------
|
|
222
|
+
shell: PageShellContext<PeekItem>;
|
|
223
|
+
table: TableContext<Owner, string>;
|
|
224
|
+
// -- Page-owned state ------------------------------------------------------
|
|
225
|
+
filters: OwnershipFilters;
|
|
226
|
+
hasActiveFilters: ComputedRef<boolean>;
|
|
227
|
+
tab: Ref<OwnershipTab>;
|
|
228
|
+
tabCounts: ComputedRef<Record<OwnershipTab, number>>;
|
|
229
|
+
/** Transfer-target catalog — every owner, not just the current page. */
|
|
230
|
+
ownerOptions: ComputedRef<OwnerOption[]>;
|
|
231
|
+
/** Owner ids currently expanded — drives the nested holdings tables. */
|
|
232
|
+
expanded: Ref<string[]>;
|
|
233
|
+
/** Bumped after every mutation — the peek watches it to re-fetch. */
|
|
234
|
+
refreshKey: Ref<number>;
|
|
235
|
+
// -- Data ------------------------------------------------------------------
|
|
236
|
+
fetchOwner: (id: string) => Promise<OwnerDetail>;
|
|
237
|
+
// -- Actions ---------------------------------------------------------------
|
|
238
|
+
clearFilters: () => void;
|
|
239
|
+
expandAllOnPage: () => void;
|
|
240
|
+
collapseAll: () => void;
|
|
241
|
+
expandSelected: () => void;
|
|
242
|
+
peekOwner: (id: string) => void;
|
|
243
|
+
bulkTransfer: (toOwnerId: string) => Promise<void>;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
const key: InjectionKey<OwnershipAtlasContext> = Symbol('ownership-atlas');
|
|
247
|
+
|
|
248
|
+
/** Inertia's callback-based visit, wrapped as a promise — so the context
|
|
249
|
+
* action stays `async`, exactly like the Vue/Nuxt versions. Always a
|
|
250
|
+
* partial reload of the props this page depends on. */
|
|
251
|
+
const visit = (
|
|
252
|
+
method: 'post' | 'put' | 'patch' | 'delete',
|
|
253
|
+
url: string,
|
|
254
|
+
// Inertia's own payload type — strings/numbers/booleans/arrays/files.
|
|
255
|
+
data: RequestPayload = {}
|
|
256
|
+
): Promise<void> =>
|
|
257
|
+
new Promise((resolve, reject) => {
|
|
258
|
+
router.visit(url, {
|
|
259
|
+
method,
|
|
260
|
+
data,
|
|
261
|
+
only: [...RELOAD_PROPS],
|
|
262
|
+
preserveScroll: true,
|
|
263
|
+
preserveState: true,
|
|
264
|
+
onSuccess: () => resolve(),
|
|
265
|
+
onError: (errors) => reject(errors),
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
export function provideOwnershipAtlas(): OwnershipAtlasContext {
|
|
270
|
+
const { toast } = useToast();
|
|
271
|
+
|
|
272
|
+
// -- Coopt the specific contexts: once, here, for the whole page. ----------
|
|
273
|
+
const shell = usePageShellContext<PeekItem>();
|
|
274
|
+
// `Owner, string`: BbTable's `item-value="id"` resolves selection to owner
|
|
275
|
+
// ids ('own_…'), matching the Vue/Nuxt `table.selected: string[]` shape.
|
|
276
|
+
const table = useTableContext<Owner, string>('owners');
|
|
277
|
+
|
|
278
|
+
// -- Filters: seeded from the current URL, mirrored back by useQueryObject. -
|
|
279
|
+
const query = useQuery();
|
|
280
|
+
const filters = reactive<OwnershipFilters>({
|
|
281
|
+
search: (query.search as string) ?? '',
|
|
282
|
+
kinds: toArray<HoldingKind>(query.kinds),
|
|
283
|
+
});
|
|
284
|
+
useQueryObject(filters, { only: [...RELOAD_PROPS] });
|
|
285
|
+
|
|
286
|
+
const hasActiveFilters = computed(
|
|
287
|
+
() => filters.search.trim().length > 0 || filters.kinds.length > 0
|
|
288
|
+
);
|
|
289
|
+
const clearFilters = () => {
|
|
290
|
+
filters.search = '';
|
|
291
|
+
filters.kinds = [];
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
// Tab: seeded from the URL; BbTabs' own `href` + `server` visit updates
|
|
295
|
+
// the URL, and its `v-model` write keeps this ref in sync with the click.
|
|
296
|
+
const tab = ref<OwnershipTab>((query.tab as OwnershipTab) ?? 'all');
|
|
297
|
+
const tabCounts = useProp<Record<OwnershipTab, number>>('tabCounts');
|
|
298
|
+
const ownerOptions = useProp<OwnerOption[]>('ownerOptions');
|
|
299
|
+
|
|
300
|
+
// -- Expansion: page state, one array, many writers. -----------------------
|
|
301
|
+
// The toolbar, the bulk bar and the peek all mutate this; the table binds
|
|
302
|
+
// it via `v-model:expanded-items`. Deliberately NOT in the URL: which rows
|
|
303
|
+
// are unfolded is working posture, not a shareable view.
|
|
304
|
+
const expanded = ref<string[]>([]);
|
|
305
|
+
|
|
306
|
+
const expandAllOnPage = () => {
|
|
307
|
+
expanded.value = table.items.value.map((owner) => owner.id);
|
|
308
|
+
};
|
|
309
|
+
|
|
310
|
+
const collapseAll = () => {
|
|
311
|
+
expanded.value = [];
|
|
312
|
+
};
|
|
313
|
+
|
|
314
|
+
// Bulk expand honors select-all-across-pages semantics, but can only unfold
|
|
315
|
+
// rows that are actually rendered — so it resolves against the current page.
|
|
316
|
+
const expandSelected = () => {
|
|
317
|
+
const ids = table.all.value
|
|
318
|
+
? table.items.value
|
|
319
|
+
.map((owner) => owner.id)
|
|
320
|
+
.filter((id) => !table.unselected.value.includes(id))
|
|
321
|
+
: [...table.selected.value];
|
|
322
|
+
expanded.value = [...new Set([...expanded.value, ...ids])];
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
const peekOwner = (id: string) => shell.push({ type: 'owner', id }, true);
|
|
326
|
+
|
|
327
|
+
const refreshKey = ref(0);
|
|
328
|
+
|
|
329
|
+
// Bulk payload carries the full select-all-across-pages triple — the
|
|
330
|
+
// server combines `all` + `unselected` the same way BbTable does.
|
|
331
|
+
const bulkPayload = () => ({
|
|
332
|
+
ids: table.selected.value,
|
|
333
|
+
all: table.all.value,
|
|
334
|
+
unselected: table.unselected.value,
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
const bulkTransfer = async (toOwnerId: string) => {
|
|
338
|
+
const target = ownerOptions.value.find((owner) => owner.id === toOwnerId);
|
|
339
|
+
await visit('patch', '/ownership/owners/bulk/transfer', {
|
|
340
|
+
...bulkPayload(),
|
|
341
|
+
toOwnerId,
|
|
342
|
+
});
|
|
343
|
+
refreshKey.value++;
|
|
344
|
+
table.resetSelection();
|
|
345
|
+
toast({
|
|
346
|
+
title: `Holdings transferred to ${target?.name ?? 'the selected owner'}.`,
|
|
347
|
+
variant: 'success',
|
|
348
|
+
});
|
|
349
|
+
};
|
|
350
|
+
|
|
351
|
+
// A small JSON endpoint, not a page visit — opening the peek never
|
|
352
|
+
// re-renders the list underneath it.
|
|
353
|
+
const fetchOwner = (id: string): Promise<OwnerDetail> =>
|
|
354
|
+
fetch(`/ownership/owners/${id}/peek`).then((res) => res.json());
|
|
355
|
+
|
|
356
|
+
const ctx: OwnershipAtlasContext = {
|
|
357
|
+
shell,
|
|
358
|
+
table,
|
|
359
|
+
filters,
|
|
360
|
+
hasActiveFilters,
|
|
361
|
+
tab,
|
|
362
|
+
tabCounts,
|
|
363
|
+
ownerOptions,
|
|
364
|
+
expanded,
|
|
365
|
+
refreshKey,
|
|
366
|
+
fetchOwner,
|
|
367
|
+
clearFilters,
|
|
368
|
+
expandAllOnPage,
|
|
369
|
+
collapseAll,
|
|
370
|
+
expandSelected,
|
|
371
|
+
peekOwner,
|
|
372
|
+
bulkTransfer,
|
|
373
|
+
};
|
|
374
|
+
provide(key, ctx);
|
|
375
|
+
return ctx;
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
export function useOwnershipAtlas(): OwnershipAtlasContext {
|
|
379
|
+
const ctx = inject(key);
|
|
380
|
+
if (!ctx)
|
|
381
|
+
throw new Error('useOwnershipAtlas() called outside OwnershipAtlas');
|
|
382
|
+
return ctx;
|
|
383
|
+
}
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
### Index.vue — the assembly
|
|
387
|
+
|
|
388
|
+
```vue
|
|
389
|
+
<!-- OwnershipAtlas/Index.vue -->
|
|
390
|
+
<template>
|
|
391
|
+
<PageShell>
|
|
392
|
+
<!-- Topbar: breadcrumbs left, page search right. No creation action on
|
|
393
|
+
this page, so no primary button anywhere. -->
|
|
394
|
+
<template #topbar>
|
|
395
|
+
<div class="flex items-center justify-between gap-4 border-b px-4 py-2">
|
|
396
|
+
<!-- Breadcrumbs take the row's slack on a stable basis (min-w-0 flex-auto);
|
|
397
|
+
without it their overflow recompute fights the flex layout every frame. -->
|
|
398
|
+
<BbBreadcrumbs
|
|
399
|
+
class="min-w-0 flex-auto"
|
|
400
|
+
:items="[
|
|
401
|
+
{ key: 'admin', text: 'Admin', href: '/admin' },
|
|
402
|
+
{ key: 'access', text: 'Access', href: '/access' },
|
|
403
|
+
{ key: 'ownership', text: 'Ownership' },
|
|
404
|
+
]"
|
|
405
|
+
/>
|
|
406
|
+
<BbTextInput
|
|
407
|
+
v-model="ctx.filters.search"
|
|
408
|
+
class="shrink-0"
|
|
409
|
+
clearable
|
|
410
|
+
compact
|
|
411
|
+
hide-label
|
|
412
|
+
label="Search owners or holdings"
|
|
413
|
+
placeholder="Search owner, team, or resource…"
|
|
414
|
+
prepend:icon="lucide:search"
|
|
415
|
+
/>
|
|
416
|
+
</div>
|
|
417
|
+
</template>
|
|
418
|
+
|
|
419
|
+
<div class="flex flex-col gap-3 p-4">
|
|
420
|
+
<FilterRail />
|
|
421
|
+
|
|
422
|
+
<!-- Toolbar row: region tabs share the line with the expansion
|
|
423
|
+
controls — expansion is page furniture, not a row concern. -->
|
|
424
|
+
<div class="flex items-center gap-2">
|
|
425
|
+
<div class="min-w-0 flex-1 overflow-clip">
|
|
426
|
+
<!-- Tabs are real visits: href + server (component-level
|
|
427
|
+
`navigation` is required alongside per-item `server`). The
|
|
428
|
+
transfer catalog can't change with the tab, so `ownerOptions`
|
|
429
|
+
stays out of the tab reload list. -->
|
|
430
|
+
<BbTabs
|
|
431
|
+
v-model="ctx.tab.value"
|
|
432
|
+
compact
|
|
433
|
+
:items="[
|
|
434
|
+
{
|
|
435
|
+
key: 'all',
|
|
436
|
+
label: `All · ${ctx.tabCounts.value.all}`,
|
|
437
|
+
href: '/ownership?tab=all',
|
|
438
|
+
server: true,
|
|
439
|
+
only: ['owners', 'tabCounts'],
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
key: 'americas',
|
|
443
|
+
label: `Americas · ${ctx.tabCounts.value.americas}`,
|
|
444
|
+
href: '/ownership?tab=americas',
|
|
445
|
+
server: true,
|
|
446
|
+
only: ['owners', 'tabCounts'],
|
|
447
|
+
},
|
|
448
|
+
{
|
|
449
|
+
key: 'emea',
|
|
450
|
+
label: `EMEA · ${ctx.tabCounts.value.emea}`,
|
|
451
|
+
href: '/ownership?tab=emea',
|
|
452
|
+
server: true,
|
|
453
|
+
only: ['owners', 'tabCounts'],
|
|
454
|
+
},
|
|
455
|
+
{
|
|
456
|
+
key: 'apac',
|
|
457
|
+
label: `APAC · ${ctx.tabCounts.value.apac}`,
|
|
458
|
+
href: '/ownership?tab=apac',
|
|
459
|
+
server: true,
|
|
460
|
+
only: ['owners', 'tabCounts'],
|
|
461
|
+
},
|
|
462
|
+
]"
|
|
463
|
+
navigation
|
|
464
|
+
preserve-scroll
|
|
465
|
+
preserve-state
|
|
466
|
+
replace
|
|
467
|
+
/>
|
|
468
|
+
</div>
|
|
469
|
+
<div class="flex shrink-0 items-center gap-0.5">
|
|
470
|
+
<BbButton
|
|
471
|
+
v-bb-tooltip="{ text: 'Expand all on this page', delay: 400 }"
|
|
472
|
+
aria-label="Expand all on this page"
|
|
473
|
+
icon="lucide:chevrons-down"
|
|
474
|
+
size="sm"
|
|
475
|
+
variant="ghost"
|
|
476
|
+
@click="ctx.expandAllOnPage"
|
|
477
|
+
/>
|
|
478
|
+
<BbButton
|
|
479
|
+
v-bb-tooltip="{ text: 'Collapse all', delay: 400 }"
|
|
480
|
+
aria-label="Collapse all"
|
|
481
|
+
icon="lucide:chevrons-up"
|
|
482
|
+
size="sm"
|
|
483
|
+
variant="ghost"
|
|
484
|
+
@click="ctx.collapseAll"
|
|
485
|
+
/>
|
|
486
|
+
</div>
|
|
487
|
+
</div>
|
|
488
|
+
|
|
489
|
+
<!-- No dependencies/items-fn: `owners` is a page prop, and selection
|
|
490
|
+
(across pages) binds straight onto the keyed table context.
|
|
491
|
+
`fixed` gives the parent equal-width tracks — a predictable grid
|
|
492
|
+
for the nested table to snap onto. -->
|
|
493
|
+
<BbTable
|
|
494
|
+
v-model="ctx.table.selected.value"
|
|
495
|
+
v-model:expanded-items="ctx.expanded.value"
|
|
496
|
+
v-model:highlighted="highlightedOwner"
|
|
497
|
+
v-model:select-all="ctx.table.all.value"
|
|
498
|
+
v-model:unselected-items="ctx.table.unselected.value"
|
|
499
|
+
actions
|
|
500
|
+
actions-text="Holdings"
|
|
501
|
+
caption="Resource owners"
|
|
502
|
+
class="table-flush"
|
|
503
|
+
:columns="columns"
|
|
504
|
+
compact
|
|
505
|
+
fixed
|
|
506
|
+
item-value="id"
|
|
507
|
+
:items="ctx.table.items.value"
|
|
508
|
+
loading-text="Loading owners…"
|
|
509
|
+
:row-class="rowClass"
|
|
510
|
+
selectable
|
|
511
|
+
>
|
|
512
|
+
<template #name="{ item, content }">
|
|
513
|
+
<div class="flex min-w-0 flex-col leading-tight">
|
|
514
|
+
<span class="font-semibold">{{ content }}</span>
|
|
515
|
+
<span class="truncate text-xs text-gray-500">{{ item.email }}</span>
|
|
516
|
+
</div>
|
|
517
|
+
</template>
|
|
518
|
+
|
|
519
|
+
<template #team="{ item, content }">
|
|
520
|
+
<div class="flex min-w-0 flex-col leading-tight">
|
|
521
|
+
<span>{{ content }}</span>
|
|
522
|
+
<span class="truncate text-xs text-gray-500">{{ item.title }}</span>
|
|
523
|
+
</div>
|
|
524
|
+
</template>
|
|
525
|
+
|
|
526
|
+
<template #region="{ item }">
|
|
527
|
+
<span class="text-xs text-gray-500">{{
|
|
528
|
+
REGION_LABEL[item.region]
|
|
529
|
+
}}</span>
|
|
530
|
+
</template>
|
|
531
|
+
|
|
532
|
+
<template #monthlytotal="{ content }">
|
|
533
|
+
<span class="tabular-nums">{{ money(content) }}</span>
|
|
534
|
+
</template>
|
|
535
|
+
|
|
536
|
+
<!-- The actions column IS the expand control: the holdings count
|
|
537
|
+
doubles as the toggle, `expandProps` wires aria + keyboard. -->
|
|
538
|
+
<template #actions="{ item, expanded: isOpen, expandProps }">
|
|
539
|
+
<BbButton
|
|
540
|
+
v-bind="expandProps"
|
|
541
|
+
:append:icon="isOpen ? 'lucide:chevron-up' : 'lucide:chevron-down'"
|
|
542
|
+
:aria-label="
|
|
543
|
+
isOpen
|
|
544
|
+
? `Collapse ${item.holdingsCount} holdings`
|
|
545
|
+
: `Expand ${item.holdingsCount} holdings`
|
|
546
|
+
"
|
|
547
|
+
size="xs"
|
|
548
|
+
variant="ghost"
|
|
549
|
+
>
|
|
550
|
+
<span class="tabular-nums">{{ item.holdingsCount }}</span>
|
|
551
|
+
</BbButton>
|
|
552
|
+
</template>
|
|
553
|
+
|
|
554
|
+
<!-- The signature move: a nested BbTable that inherits this
|
|
555
|
+
table's column tracks. -->
|
|
556
|
+
<template #expand="{ item }">
|
|
557
|
+
<HoldingsTable :owner="item" />
|
|
558
|
+
</template>
|
|
559
|
+
|
|
560
|
+
<template #no-data>
|
|
561
|
+
<div
|
|
562
|
+
class="mx-auto flex max-w-sm flex-col items-center gap-3 px-6 py-12 text-center"
|
|
563
|
+
>
|
|
564
|
+
<BbIcon
|
|
565
|
+
class="text-gray-400"
|
|
566
|
+
:icon="
|
|
567
|
+
ctx.hasActiveFilters.value ? 'lucide:search-x' : 'lucide:layers'
|
|
568
|
+
"
|
|
569
|
+
size="2xl"
|
|
570
|
+
/>
|
|
571
|
+
<p class="text-sm font-semibold">
|
|
572
|
+
{{
|
|
573
|
+
ctx.hasActiveFilters.value
|
|
574
|
+
? 'No matching owners'
|
|
575
|
+
: 'No owners in this region'
|
|
576
|
+
}}
|
|
577
|
+
</p>
|
|
578
|
+
<p class="text-xs text-gray-500">
|
|
579
|
+
{{
|
|
580
|
+
ctx.hasActiveFilters.value
|
|
581
|
+
? 'Clear the holding-type filter, or widen search.'
|
|
582
|
+
: 'Switch tabs to another region.'
|
|
583
|
+
}}
|
|
584
|
+
</p>
|
|
585
|
+
<BbButton
|
|
586
|
+
v-if="ctx.hasActiveFilters.value"
|
|
587
|
+
prepend:icon="lucide:x"
|
|
588
|
+
size="sm"
|
|
589
|
+
variant="outline"
|
|
590
|
+
@click="ctx.clearFilters"
|
|
591
|
+
>
|
|
592
|
+
Clear filters
|
|
593
|
+
</BbButton>
|
|
594
|
+
</div>
|
|
595
|
+
</template>
|
|
596
|
+
</BbTable>
|
|
597
|
+
|
|
598
|
+
<!-- No table-id: the keyed table context is the page count here. -->
|
|
599
|
+
<BbPagination
|
|
600
|
+
v-model="ctx.table.page.value"
|
|
601
|
+
label="Owners pagination"
|
|
602
|
+
:total-pages="ctx.table.totalPages.value"
|
|
603
|
+
/>
|
|
604
|
+
</div>
|
|
605
|
+
|
|
606
|
+
<SelectionBar />
|
|
607
|
+
|
|
608
|
+
<!-- The peek: rendered by type; row highlight drives the stack. -->
|
|
609
|
+
<template #sidebar>
|
|
610
|
+
<OwnerPeek
|
|
611
|
+
v-if="ctx.shell.current.value?.type === 'owner'"
|
|
612
|
+
:owner-id="ctx.shell.current.value.id"
|
|
613
|
+
/>
|
|
614
|
+
</template>
|
|
615
|
+
</PageShell>
|
|
616
|
+
</template>
|
|
617
|
+
|
|
618
|
+
<script setup lang="ts">
|
|
619
|
+
import { computed } from 'vue';
|
|
620
|
+
import {
|
|
621
|
+
BbBreadcrumbs,
|
|
622
|
+
BbButton,
|
|
623
|
+
BbIcon,
|
|
624
|
+
BbPagination,
|
|
625
|
+
BbTable,
|
|
626
|
+
BbTabs,
|
|
627
|
+
BbTextInput,
|
|
628
|
+
vBbTooltip,
|
|
629
|
+
type BbTableColumn,
|
|
630
|
+
} from 'bitboss-ui';
|
|
631
|
+
import PageShell from '@/components/layout/PageShell.vue';
|
|
632
|
+
import { provideOwnershipAtlas, REGION_LABEL } from './context';
|
|
633
|
+
import FilterRail from './FilterRail.vue';
|
|
634
|
+
import HoldingsTable from './HoldingsTable.vue';
|
|
635
|
+
import OwnerPeek from './OwnerPeek.vue';
|
|
636
|
+
import SelectionBar from './SelectionBar.vue';
|
|
637
|
+
import type { Owner } from '@/types';
|
|
638
|
+
|
|
639
|
+
const ctx = provideOwnershipAtlas();
|
|
640
|
+
|
|
641
|
+
/** Row highlight IS the peek: clicking a row opens owner detail in the
|
|
642
|
+
* sidebar; clicking it again (BbTable clears the highlight) closes it. */
|
|
643
|
+
const highlightedOwner = computed<string | null>({
|
|
644
|
+
get: () =>
|
|
645
|
+
ctx.shell.current.value?.type === 'owner'
|
|
646
|
+
? ctx.shell.current.value.id
|
|
647
|
+
: null,
|
|
648
|
+
set: (id) => {
|
|
649
|
+
if (id == null) ctx.shell.close();
|
|
650
|
+
else ctx.peekOwner(id);
|
|
651
|
+
},
|
|
652
|
+
});
|
|
653
|
+
|
|
654
|
+
/** Four data columns — the nested holdings table snaps onto them 1:1. The
|
|
655
|
+
* owner's title rides under Team; the holdings count lives on the expand
|
|
656
|
+
* control in the actions column. */
|
|
657
|
+
const columns: Array<BbTableColumn<Owner>> = [
|
|
658
|
+
{ key: 'name', label: 'Owner' },
|
|
659
|
+
{ key: 'team', label: 'Team' },
|
|
660
|
+
{ key: 'region', label: 'Region' },
|
|
661
|
+
{ key: 'monthlyTotal', label: '$ / mo', align: 'right' },
|
|
662
|
+
];
|
|
663
|
+
|
|
664
|
+
const money = (value: number) =>
|
|
665
|
+
new Intl.NumberFormat('en-US', {
|
|
666
|
+
style: 'currency',
|
|
667
|
+
currency: 'USD',
|
|
668
|
+
maximumFractionDigits: 0,
|
|
669
|
+
}).format(value);
|
|
670
|
+
|
|
671
|
+
// Public row-class API paints every row state: the base class carries the
|
|
672
|
+
// pointer cursor (rows are click targets — highlight opens the peek), the
|
|
673
|
+
// conditional classes carry the expanded / peek-open washes.
|
|
674
|
+
const rowClass = (item: Owner) => {
|
|
675
|
+
const classes = ['owner-row'];
|
|
676
|
+
if (ctx.expanded.value.includes(item.id)) classes.push('row-expanded');
|
|
677
|
+
if (highlightedOwner.value === item.id) classes.push('row-peeked');
|
|
678
|
+
return classes.join(' ');
|
|
679
|
+
};
|
|
680
|
+
</script>
|
|
681
|
+
|
|
682
|
+
<style scoped>
|
|
683
|
+
/* Full-bleed table: mirror the content wrapper's `p-4` so row washes and the
|
|
684
|
+
nested table run edge to edge, while the outermost cells keep the optical
|
|
685
|
+
margin — content stays lined up with the filter rail and tabs above. */
|
|
686
|
+
.table-flush {
|
|
687
|
+
--page-inset: 1rem;
|
|
688
|
+
margin-inline: calc(var(--page-inset) * -1);
|
|
689
|
+
width: calc(100% + var(--page-inset) * 2);
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
/* Direct-child combinators keep these overrides on the OWNER table's own
|
|
693
|
+
cells. A bare `:deep(tbody td:first-child)` would also match the nested
|
|
694
|
+
holdings table and clobber the structural offset padding it computes to
|
|
695
|
+
stay flush with the parent grid — the one selector mistake that silently
|
|
696
|
+
breaks nested-table alignment. */
|
|
697
|
+
.table-flush :deep(> table > thead > tr > th:first-child),
|
|
698
|
+
.table-flush
|
|
699
|
+
:deep(> table > tbody > tr > td:first-child:not(.bb-table-expand__cell)) {
|
|
700
|
+
padding-inline-start: var(--page-inset);
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
.table-flush :deep(> table > thead > tr > th:last-child),
|
|
704
|
+
.table-flush
|
|
705
|
+
:deep(> table > tbody > tr > td:last-child:not(.bb-table-expand__cell)) {
|
|
706
|
+
padding-inline-end: var(--page-inset);
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
/* Expand rows stay edge-to-edge so the nested table can inherit the parent
|
|
710
|
+
tracks without an extra inset shifting everything sideways. */
|
|
711
|
+
.table-flush :deep(> table > tbody > tr > td.bb-table-expand__cell) {
|
|
712
|
+
padding-inline: 0;
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
/* Row states, painted through the public row-class API. */
|
|
716
|
+
:deep(.owner-row) {
|
|
717
|
+
cursor: pointer;
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
/* Expanded = hierarchy only: a quiet ink wash, no accent. */
|
|
721
|
+
:deep(.row-expanded) {
|
|
722
|
+
background-color: color-mix(in oklab, var(--bb-text) 2.5%, transparent);
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
/* Peek-open = accent wash + a 1px lead pin on the row's start edge. */
|
|
726
|
+
:deep(.row-peeked) {
|
|
727
|
+
background-color: color-mix(in oklab, var(--bb-primary) 6%, transparent);
|
|
728
|
+
box-shadow: inset 1px 0 0 0 var(--bb-primary);
|
|
729
|
+
}
|
|
730
|
+
</style>
|
|
731
|
+
```
|
|
732
|
+
|
|
733
|
+
### HoldingsTable.vue — the nested table
|
|
734
|
+
|
|
735
|
+
```vue
|
|
736
|
+
<!-- OwnershipAtlas/HoldingsTable.vue — nested BbTable snapped under the owner. -->
|
|
737
|
+
<template>
|
|
738
|
+
<div class="holdings-nest">
|
|
739
|
+
<BbTable
|
|
740
|
+
:caption="`Holdings owned by ${owner.name}`"
|
|
741
|
+
class="w-full"
|
|
742
|
+
:columns="columns"
|
|
743
|
+
compact
|
|
744
|
+
inherit-column-widths
|
|
745
|
+
item-value="id"
|
|
746
|
+
:items="owner.holdings"
|
|
747
|
+
>
|
|
748
|
+
<template #name="{ item, content }">
|
|
749
|
+
<div class="flex min-w-0 flex-col leading-tight">
|
|
750
|
+
<span class="font-semibold">{{ content }}</span>
|
|
751
|
+
<span class="text-xs text-gray-500">
|
|
752
|
+
Since {{ monthLabel(item.since) }} · {{ item.region }}
|
|
753
|
+
</span>
|
|
754
|
+
</div>
|
|
755
|
+
</template>
|
|
756
|
+
|
|
757
|
+
<template #kind="{ item }">
|
|
758
|
+
<span class="text-xs text-gray-500">{{ KIND_LABEL[item.kind] }}</span>
|
|
759
|
+
</template>
|
|
760
|
+
|
|
761
|
+
<template #status="{ item }">
|
|
762
|
+
<BbBadge size="sm" :variant="STATUS_VARIANT[item.status]">
|
|
763
|
+
{{ STATUS_LABEL[item.status] }}
|
|
764
|
+
</BbBadge>
|
|
765
|
+
</template>
|
|
766
|
+
|
|
767
|
+
<template #monthlycost="{ content }">
|
|
768
|
+
<span class="tabular-nums">{{ money(content) }}</span>
|
|
769
|
+
</template>
|
|
770
|
+
</BbTable>
|
|
771
|
+
</div>
|
|
772
|
+
</template>
|
|
773
|
+
|
|
774
|
+
<script setup lang="ts">
|
|
775
|
+
import { BbBadge, BbTable, type BbTableColumn } from 'bitboss-ui';
|
|
776
|
+
import { KIND_LABEL, STATUS_LABEL, STATUS_VARIANT } from './context';
|
|
777
|
+
import type { Holding, Owner } from '@/types';
|
|
778
|
+
|
|
779
|
+
defineProps<{ owner: Owner }>();
|
|
780
|
+
|
|
781
|
+
/**
|
|
782
|
+
* Explicit snaps onto the parent grid. The parent is `selectable`, so its
|
|
783
|
+
* select column occupies tracks [0, 1] and the data columns sit at 1…4 —
|
|
784
|
+
* `snap` base is 1 (it would be 0 under a non-selectable parent). Every
|
|
785
|
+
* column defines a snap so none becomes the auto fill track: a width-free
|
|
786
|
+
* last column would absorb the parent's actions region, and right-aligned
|
|
787
|
+
* $/mo would land under the expand control instead of under the parent's
|
|
788
|
+
* $/mo. With all four snapped, the parent's select and actions tracks fold
|
|
789
|
+
* into the child's first/last cells as padding — the child starts flush with
|
|
790
|
+
* the parent's first data column, and that inset is what reads as hierarchy.
|
|
791
|
+
*/
|
|
792
|
+
const columns: Array<BbTableColumn<Holding>> = [
|
|
793
|
+
{ key: 'name', label: 'Resource', snap: 1 },
|
|
794
|
+
{ key: 'kind', label: 'Type', snap: 2 },
|
|
795
|
+
{ key: 'status', label: 'Status', snap: 3 },
|
|
796
|
+
{ key: 'monthlyCost', label: '$ / mo', align: 'right', snap: 4 },
|
|
797
|
+
];
|
|
798
|
+
|
|
799
|
+
const money = (value: number) =>
|
|
800
|
+
value === 0
|
|
801
|
+
? '—'
|
|
802
|
+
: new Intl.NumberFormat('en-US', {
|
|
803
|
+
style: 'currency',
|
|
804
|
+
currency: 'USD',
|
|
805
|
+
maximumFractionDigits: 0,
|
|
806
|
+
}).format(value);
|
|
807
|
+
|
|
808
|
+
const monthLabel = (value: string) =>
|
|
809
|
+
new Date(value).toLocaleDateString('en-US', {
|
|
810
|
+
month: 'short',
|
|
811
|
+
year: 'numeric',
|
|
812
|
+
});
|
|
813
|
+
</script>
|
|
814
|
+
|
|
815
|
+
<style scoped>
|
|
816
|
+
/* Full-bleed inside the expand cell — the inherited snaps keep Resource
|
|
817
|
+
under Owner. Hierarchy is the hairline + faint wash, NOT a padding inset:
|
|
818
|
+
an inset would shift the child's cells off the parent's tracks and make
|
|
819
|
+
the alignment lie. */
|
|
820
|
+
.holdings-nest {
|
|
821
|
+
background: color-mix(in oklab, var(--bb-text) 1.5%, transparent);
|
|
822
|
+
border-block-start: 1px solid var(--bb-border);
|
|
823
|
+
width: 100%;
|
|
824
|
+
}
|
|
825
|
+
</style>
|
|
826
|
+
```
|
|
827
|
+
|
|
828
|
+
### FilterRail.vue
|
|
829
|
+
|
|
830
|
+
```vue
|
|
831
|
+
<!-- OwnershipAtlas/FilterRail.vue -->
|
|
832
|
+
<template>
|
|
833
|
+
<div class="flex flex-wrap items-center gap-2">
|
|
834
|
+
<!-- Holding type: multi-select pill over the kind catalog. Filtering by
|
|
835
|
+
kind reshapes the owners themselves (server-side): owners with no
|
|
836
|
+
matching holding drop out, counts and totals recompute. -->
|
|
837
|
+
<BbSelectPopover
|
|
838
|
+
v-model="ctx.filters.kinds"
|
|
839
|
+
clearable
|
|
840
|
+
item-text="label"
|
|
841
|
+
item-value="value"
|
|
842
|
+
:items="kindOptions"
|
|
843
|
+
multiple
|
|
844
|
+
>
|
|
845
|
+
<template #activator="{ props }">
|
|
846
|
+
<BbButton
|
|
847
|
+
v-bind="props"
|
|
848
|
+
append:icon="lucide:chevron-down"
|
|
849
|
+
prepend:icon="lucide:layers"
|
|
850
|
+
size="sm"
|
|
851
|
+
variant="outline"
|
|
852
|
+
>
|
|
853
|
+
Holding type{{
|
|
854
|
+
ctx.filters.kinds.length ? ` · ${ctx.filters.kinds.length}` : ''
|
|
855
|
+
}}
|
|
856
|
+
</BbButton>
|
|
857
|
+
</template>
|
|
858
|
+
</BbSelectPopover>
|
|
859
|
+
|
|
860
|
+
<!-- Clear-all renders only while something is active. -->
|
|
861
|
+
<BbButton
|
|
862
|
+
v-if="ctx.hasActiveFilters.value"
|
|
863
|
+
prepend:icon="lucide:x"
|
|
864
|
+
size="sm"
|
|
865
|
+
variant="ghost"
|
|
866
|
+
@click="ctx.clearFilters"
|
|
867
|
+
>
|
|
868
|
+
Clear
|
|
869
|
+
</BbButton>
|
|
870
|
+
</div>
|
|
871
|
+
</template>
|
|
872
|
+
|
|
873
|
+
<script setup lang="ts">
|
|
874
|
+
import { BbButton, BbSelectPopover } from 'bitboss-ui';
|
|
875
|
+
import { KIND_LABEL, useOwnershipAtlas } from './context';
|
|
876
|
+
import type { HoldingKind } from '@/types';
|
|
877
|
+
|
|
878
|
+
const ctx = useOwnershipAtlas();
|
|
879
|
+
|
|
880
|
+
// The pill's options come straight from the shared label catalog.
|
|
881
|
+
const kindOptions = (
|
|
882
|
+
Object.entries(KIND_LABEL) as Array<[HoldingKind, string]>
|
|
883
|
+
).map(([value, label]) => ({ value, label }));
|
|
884
|
+
</script>
|
|
885
|
+
```
|
|
886
|
+
|
|
887
|
+
### SelectionBar.vue
|
|
888
|
+
|
|
889
|
+
```vue
|
|
890
|
+
<!-- OwnershipAtlas/SelectionBar.vue -->
|
|
891
|
+
<template>
|
|
892
|
+
<FloatingBottomPanel :open="selectedCount > 0">
|
|
893
|
+
<span class="px-2 text-sm text-gray-500">
|
|
894
|
+
<span class="font-semibold tabular-nums">{{ selectedCount }}</span>
|
|
895
|
+
selected
|
|
896
|
+
</span>
|
|
897
|
+
|
|
898
|
+
<BbButton
|
|
899
|
+
prepend:icon="lucide:chevrons-down"
|
|
900
|
+
size="sm"
|
|
901
|
+
variant="ghost"
|
|
902
|
+
@click="ctx.expandSelected"
|
|
903
|
+
>
|
|
904
|
+
Expand
|
|
905
|
+
</BbButton>
|
|
906
|
+
|
|
907
|
+
<!-- Bulk transfer: a one-shot popover (model stays null) whose pick IS
|
|
908
|
+
the action. Targets exclude every selected owner — you cannot
|
|
909
|
+
transfer holdings onto an owner you are emptying. -->
|
|
910
|
+
<BbSelectPopover
|
|
911
|
+
item-text="name"
|
|
912
|
+
item-value="id"
|
|
913
|
+
:items="transferTargets"
|
|
914
|
+
:model-value="null"
|
|
915
|
+
:offset="10"
|
|
916
|
+
placement="top"
|
|
917
|
+
width="240px"
|
|
918
|
+
@update:model-value="onTransfer"
|
|
919
|
+
>
|
|
920
|
+
<template #activator="{ props }">
|
|
921
|
+
<BbButton
|
|
922
|
+
v-bind="props"
|
|
923
|
+
append:icon="lucide:chevron-up"
|
|
924
|
+
prepend:icon="lucide:arrow-right-left"
|
|
925
|
+
size="sm"
|
|
926
|
+
variant="ghost"
|
|
927
|
+
>
|
|
928
|
+
Transfer holdings
|
|
929
|
+
</BbButton>
|
|
930
|
+
</template>
|
|
931
|
+
</BbSelectPopover>
|
|
932
|
+
|
|
933
|
+
<div class="floating-bottom-panel__right flex items-center gap-1">
|
|
934
|
+
<BbButton
|
|
935
|
+
aria-label="Clear selection"
|
|
936
|
+
icon="lucide:x"
|
|
937
|
+
size="sm"
|
|
938
|
+
variant="ghost"
|
|
939
|
+
@click="ctx.table.resetSelection"
|
|
940
|
+
/>
|
|
941
|
+
</div>
|
|
942
|
+
</FloatingBottomPanel>
|
|
943
|
+
</template>
|
|
944
|
+
|
|
945
|
+
<script setup lang="ts">
|
|
946
|
+
import { computed } from 'vue';
|
|
947
|
+
import { BbButton, BbSelectPopover } from 'bitboss-ui';
|
|
948
|
+
import FloatingBottomPanel from '@/components/layout/FloatingBottomPanel.vue';
|
|
949
|
+
import { useOwnershipAtlas } from './context';
|
|
950
|
+
|
|
951
|
+
const ctx = useOwnershipAtlas();
|
|
952
|
+
|
|
953
|
+
// `all` (select-all-across-pages) does not enumerate rows, so the visible
|
|
954
|
+
// count is the total minus whatever the user manually deselected.
|
|
955
|
+
const selectedCount = computed(() =>
|
|
956
|
+
ctx.table.all.value
|
|
957
|
+
? ctx.table.totalItems.value - ctx.table.unselected.value.length
|
|
958
|
+
: ctx.table.selected.value.length
|
|
959
|
+
);
|
|
960
|
+
|
|
961
|
+
/** Don't offer transferring onto an owner who is already in the selection. */
|
|
962
|
+
const transferTargets = computed(() => {
|
|
963
|
+
const selected = new Set(
|
|
964
|
+
ctx.table.all.value
|
|
965
|
+
? ctx.ownerOptions.value
|
|
966
|
+
.map((owner) => owner.id)
|
|
967
|
+
.filter((id) => !ctx.table.unselected.value.includes(id))
|
|
968
|
+
: ctx.table.selected.value
|
|
969
|
+
);
|
|
970
|
+
return ctx.ownerOptions.value.filter((owner) => !selected.has(owner.id));
|
|
971
|
+
});
|
|
972
|
+
|
|
973
|
+
const onTransfer = (value: unknown) => {
|
|
974
|
+
if (typeof value !== 'string' || !value) return;
|
|
975
|
+
void ctx.bulkTransfer(value);
|
|
976
|
+
};
|
|
977
|
+
</script>
|
|
978
|
+
```
|
|
979
|
+
|
|
980
|
+
### OwnerPeek.vue
|
|
981
|
+
|
|
982
|
+
```vue
|
|
983
|
+
<!-- OwnershipAtlas/OwnerPeek.vue — sidebar workbench for the highlighted owner. -->
|
|
984
|
+
<template>
|
|
985
|
+
<div v-if="owner" class="flex flex-col gap-4 text-sm">
|
|
986
|
+
<!-- Identity header. -->
|
|
987
|
+
<header class="flex flex-col gap-1">
|
|
988
|
+
<h2 class="text-base font-semibold tracking-tight">{{ owner.name }}</h2>
|
|
989
|
+
<p class="text-xs text-gray-500">{{ owner.email }}</p>
|
|
990
|
+
<p class="text-xs text-gray-500">
|
|
991
|
+
{{ owner.title }} · {{ owner.team }} ·
|
|
992
|
+
{{ REGION_LABEL[owner.region] }}
|
|
993
|
+
</p>
|
|
994
|
+
</header>
|
|
995
|
+
|
|
996
|
+
<!-- Properties. -->
|
|
997
|
+
<dl class="grid grid-cols-[auto_1fr] gap-x-4 gap-y-1.5">
|
|
998
|
+
<dt class="text-gray-500">Holdings</dt>
|
|
999
|
+
<dd class="text-right tabular-nums">{{ owner.holdingsCount }}</dd>
|
|
1000
|
+
<dt class="text-gray-500">Monthly</dt>
|
|
1001
|
+
<dd class="text-right font-medium tabular-nums">
|
|
1002
|
+
{{ money(owner.monthlyTotal) }}
|
|
1003
|
+
</dd>
|
|
1004
|
+
<dt class="text-gray-500">Joined</dt>
|
|
1005
|
+
<dd class="text-right">{{ longDate(owner.joinedAt) }}</dd>
|
|
1006
|
+
<dt class="text-gray-500">Manager</dt>
|
|
1007
|
+
<dd class="text-right">{{ owner.manager ?? '—' }}</dd>
|
|
1008
|
+
</dl>
|
|
1009
|
+
|
|
1010
|
+
<section v-if="owner.notes" class="flex flex-col gap-1.5">
|
|
1011
|
+
<h3 class="text-xs font-semibold uppercase tracking-wide text-gray-500">
|
|
1012
|
+
Notes
|
|
1013
|
+
</h3>
|
|
1014
|
+
<p>{{ owner.notes }}</p>
|
|
1015
|
+
</section>
|
|
1016
|
+
|
|
1017
|
+
<!-- Rollup by holding type. -->
|
|
1018
|
+
<section class="flex flex-col gap-1.5">
|
|
1019
|
+
<h3 class="text-xs font-semibold uppercase tracking-wide text-gray-500">
|
|
1020
|
+
By type
|
|
1021
|
+
</h3>
|
|
1022
|
+
<ul class="flex flex-col gap-1.5">
|
|
1023
|
+
<li
|
|
1024
|
+
v-for="row in owner.kindBreakdown"
|
|
1025
|
+
:key="row.kind"
|
|
1026
|
+
class="grid grid-cols-[1fr_auto_auto] items-baseline gap-3"
|
|
1027
|
+
>
|
|
1028
|
+
<span class="min-w-0">{{ KIND_LABEL[row.kind] }}</span>
|
|
1029
|
+
<span class="text-xs tabular-nums text-gray-500">{{
|
|
1030
|
+
row.count
|
|
1031
|
+
}}</span>
|
|
1032
|
+
<span class="text-xs tabular-nums text-gray-500">{{
|
|
1033
|
+
money(row.monthlyCost)
|
|
1034
|
+
}}</span>
|
|
1035
|
+
</li>
|
|
1036
|
+
</ul>
|
|
1037
|
+
</section>
|
|
1038
|
+
|
|
1039
|
+
<!-- The holdings themselves — a real list, not a summary sentence. -->
|
|
1040
|
+
<section class="flex flex-col gap-1.5">
|
|
1041
|
+
<h3 class="text-xs font-semibold uppercase tracking-wide text-gray-500">
|
|
1042
|
+
Holdings
|
|
1043
|
+
</h3>
|
|
1044
|
+
<ul class="flex flex-col gap-2">
|
|
1045
|
+
<li
|
|
1046
|
+
v-for="holding in owner.holdings"
|
|
1047
|
+
:key="holding.id"
|
|
1048
|
+
class="flex items-start justify-between gap-3"
|
|
1049
|
+
>
|
|
1050
|
+
<div class="flex min-w-0 flex-1 flex-col gap-0.5">
|
|
1051
|
+
<span class="font-medium">{{ holding.name }}</span>
|
|
1052
|
+
<span class="text-xs text-gray-500"
|
|
1053
|
+
>{{ KIND_LABEL[holding.kind] }} · {{ holding.region }}</span
|
|
1054
|
+
>
|
|
1055
|
+
</div>
|
|
1056
|
+
<div class="flex flex-col items-end gap-1">
|
|
1057
|
+
<BbBadge size="sm" :variant="STATUS_VARIANT[holding.status]">
|
|
1058
|
+
{{ STATUS_LABEL[holding.status] }}
|
|
1059
|
+
</BbBadge>
|
|
1060
|
+
<span class="text-xs tabular-nums text-gray-500">{{
|
|
1061
|
+
money(holding.monthlyCost)
|
|
1062
|
+
}}</span>
|
|
1063
|
+
</div>
|
|
1064
|
+
</li>
|
|
1065
|
+
</ul>
|
|
1066
|
+
</section>
|
|
1067
|
+
|
|
1068
|
+
<!-- Workbench footer: act from the peek back into the table. -->
|
|
1069
|
+
<footer class="mt-2 flex items-center gap-2 border-t pt-3">
|
|
1070
|
+
<BbButton
|
|
1071
|
+
prepend:icon="lucide:chevrons-down"
|
|
1072
|
+
size="sm"
|
|
1073
|
+
variant="secondary"
|
|
1074
|
+
@click="onExpandInTable"
|
|
1075
|
+
>
|
|
1076
|
+
Expand in table
|
|
1077
|
+
</BbButton>
|
|
1078
|
+
</footer>
|
|
1079
|
+
</div>
|
|
1080
|
+
|
|
1081
|
+
<div v-else class="flex justify-center p-8">
|
|
1082
|
+
<BbSpinner />
|
|
1083
|
+
</div>
|
|
1084
|
+
</template>
|
|
1085
|
+
|
|
1086
|
+
<script setup lang="ts">
|
|
1087
|
+
import { watch } from 'vue';
|
|
1088
|
+
import { BbBadge, BbButton, BbSpinner } from 'bitboss-ui';
|
|
1089
|
+
import { useResourceContext } from '@/composables/useResourceContext';
|
|
1090
|
+
import {
|
|
1091
|
+
KIND_LABEL,
|
|
1092
|
+
REGION_LABEL,
|
|
1093
|
+
STATUS_LABEL,
|
|
1094
|
+
STATUS_VARIANT,
|
|
1095
|
+
useOwnershipAtlas,
|
|
1096
|
+
} from './context';
|
|
1097
|
+
import type { OwnerDetail } from '@/types';
|
|
1098
|
+
|
|
1099
|
+
const props = defineProps<{ ownerId: string }>();
|
|
1100
|
+
|
|
1101
|
+
const ctx = useOwnershipAtlas();
|
|
1102
|
+
|
|
1103
|
+
// A small JSON endpoint, not a page visit — opening the peek never
|
|
1104
|
+
// re-renders the list underneath it. Re-fetches whenever the highlight moves
|
|
1105
|
+
// to a different owner; `refreshKey` makes bulk transfers reflect here
|
|
1106
|
+
// immediately.
|
|
1107
|
+
const { data: owner, refresh } = useResourceContext<OwnerDetail, string>(
|
|
1108
|
+
() => props.ownerId,
|
|
1109
|
+
ctx.fetchOwner
|
|
1110
|
+
);
|
|
1111
|
+
watch(() => ctx.refreshKey.value, refresh);
|
|
1112
|
+
|
|
1113
|
+
const money = (value: number) =>
|
|
1114
|
+
value === 0
|
|
1115
|
+
? '—'
|
|
1116
|
+
: new Intl.NumberFormat('en-US', {
|
|
1117
|
+
style: 'currency',
|
|
1118
|
+
currency: 'USD',
|
|
1119
|
+
maximumFractionDigits: 0,
|
|
1120
|
+
}).format(value);
|
|
1121
|
+
|
|
1122
|
+
const longDate = (value: string) =>
|
|
1123
|
+
new Date(value).toLocaleDateString('en-US', {
|
|
1124
|
+
month: 'short',
|
|
1125
|
+
day: 'numeric',
|
|
1126
|
+
year: 'numeric',
|
|
1127
|
+
});
|
|
1128
|
+
|
|
1129
|
+
// The peek writes the same expansion array the table reads — one rung-3
|
|
1130
|
+
// state, three writers (toolbar, bulk bar, peek).
|
|
1131
|
+
const onExpandInTable = () => {
|
|
1132
|
+
if (!owner.value) return;
|
|
1133
|
+
if (!ctx.expanded.value.includes(owner.value.id)) {
|
|
1134
|
+
ctx.expanded.value = [...ctx.expanded.value, owner.value.id];
|
|
1135
|
+
}
|
|
1136
|
+
};
|
|
1137
|
+
</script>
|
|
1138
|
+
```
|
|
1139
|
+
|
|
1140
|
+
### The domain types (`@/types`)
|
|
1141
|
+
|
|
1142
|
+
```ts
|
|
1143
|
+
export type HoldingKind =
|
|
1144
|
+
| 'workspace'
|
|
1145
|
+
| 'project'
|
|
1146
|
+
| 'domain'
|
|
1147
|
+
| 'database'
|
|
1148
|
+
| 'vault'
|
|
1149
|
+
| 'device'
|
|
1150
|
+
| 'seat-pool'
|
|
1151
|
+
| 'bucket';
|
|
1152
|
+
|
|
1153
|
+
export type HoldingStatus = 'active' | 'paused' | 'provisioning' | 'retired';
|
|
1154
|
+
|
|
1155
|
+
export type OwnerRegion = 'americas' | 'emea' | 'apac';
|
|
1156
|
+
|
|
1157
|
+
/** A resource an owner is responsible for — one nested-table row. */
|
|
1158
|
+
export interface Holding {
|
|
1159
|
+
id: string;
|
|
1160
|
+
name: string;
|
|
1161
|
+
kind: HoldingKind;
|
|
1162
|
+
status: HoldingStatus;
|
|
1163
|
+
/** `YYYY-MM-DD` — when ownership began. */
|
|
1164
|
+
since: string;
|
|
1165
|
+
monthlyCost: number;
|
|
1166
|
+
region: string;
|
|
1167
|
+
}
|
|
1168
|
+
|
|
1169
|
+
/** Parent row: a person with the holdings they own embedded. */
|
|
1170
|
+
export interface Owner {
|
|
1171
|
+
id: string;
|
|
1172
|
+
name: string;
|
|
1173
|
+
email: string;
|
|
1174
|
+
team: string;
|
|
1175
|
+
title: string;
|
|
1176
|
+
region: OwnerRegion;
|
|
1177
|
+
holdingsCount: number;
|
|
1178
|
+
monthlyTotal: number;
|
|
1179
|
+
holdings: Holding[];
|
|
1180
|
+
}
|
|
1181
|
+
|
|
1182
|
+
/** Transfer-picker option. */
|
|
1183
|
+
export type OwnerOption = { id: string; name: string; team: string };
|
|
1184
|
+
|
|
1185
|
+
/** Rich owner detail for the sidebar peek. */
|
|
1186
|
+
export interface OwnerDetail extends Owner {
|
|
1187
|
+
joinedAt: string;
|
|
1188
|
+
manager: string | null;
|
|
1189
|
+
notes: string;
|
|
1190
|
+
kindBreakdown: Array<{
|
|
1191
|
+
kind: HoldingKind;
|
|
1192
|
+
count: number;
|
|
1193
|
+
monthlyCost: number;
|
|
1194
|
+
}>;
|
|
1195
|
+
}
|
|
1196
|
+
```
|
|
1197
|
+
|
|
1198
|
+
## Why it is built this way
|
|
1199
|
+
|
|
1200
|
+
- **The nested table inherits the parent's tracks — never eyeballed
|
|
1201
|
+
widths.** `inherit-column-widths` is the whole alignment mechanism: the
|
|
1202
|
+
holdings table reads the owners table's measured tracks, so Resource sits
|
|
1203
|
+
under Owner and both $/mo columns share one right edge at every viewport
|
|
1204
|
+
width. Two hand-maintained `<colgroup>`s (or two tables that merely look
|
|
1205
|
+
similar) drift apart the first time a label changes; the inheritance
|
|
1206
|
+
cannot.
|
|
1207
|
+
- **Every child column snaps, and the base is 1.** The parent is
|
|
1208
|
+
`selectable`, so its select column occupies the region before the first
|
|
1209
|
+
data track — child snaps start at `1` (`0` would put Resource under the
|
|
1210
|
+
checkboxes). And no child column may be left width-free: the width-free
|
|
1211
|
+
column becomes the fill track and absorbs the parent's **actions** region,
|
|
1212
|
+
which visually parks right-aligned $/mo under the expand control. With
|
|
1213
|
+
all four columns snapped, the select and actions tracks fold into the
|
|
1214
|
+
child's first/last cells as padding, and the child starts flush with the
|
|
1215
|
+
parent's first data column — that structural inset, plus a hairline and a
|
|
1216
|
+
faint wash, is the entire hierarchy treatment. No extra padding inset:
|
|
1217
|
+
an inset would make the alignment lie.
|
|
1218
|
+
- **Cell-padding overrides use direct-child combinators.** `.table-flush`
|
|
1219
|
+
bleeds the owner table past the page padding and re-adds the inset on the
|
|
1220
|
+
outermost cells — but only via
|
|
1221
|
+
`:deep(> table > tbody > tr > td:first-child)`. A bare descendant
|
|
1222
|
+
selector would also hit the nested table's cells and clobber the offset
|
|
1223
|
+
padding it computes to stay on the parent grid. The expand cell itself is
|
|
1224
|
+
excluded from the inset and zero-padded, so the nested table gets the full
|
|
1225
|
+
row width to snap within.
|
|
1226
|
+
- **Expansion is rung-3 page state.** `expanded` lives in the context
|
|
1227
|
+
because four surfaces touch it: the per-row control, the toolbar's
|
|
1228
|
+
expand-all/collapse-all, the bulk bar's Expand, and the peek's "Expand in
|
|
1229
|
+
table". Binding it through `v-model:expanded-items` (tracked by
|
|
1230
|
+
`item-value`) means expansion survives the partial reloads that replace
|
|
1231
|
+
the row objects. It stays out of the URL deliberately — unfolded rows are
|
|
1232
|
+
working posture, not a shareable view.
|
|
1233
|
+
- **The actions column is the expand control.** This page's per-row action
|
|
1234
|
+
_is_ "show me the holdings", so the holdings count doubles as the toggle
|
|
1235
|
+
(`expandProps` wires `aria-expanded` and keyboard handling onto a real
|
|
1236
|
+
button). No `…` dropdown padding out the inventory.
|
|
1237
|
+
- **Row highlight is the peek, via one two-way computed.** `get` derives the
|
|
1238
|
+
highlighted id from the shell stack; `set` pushes or closes. Highlight and
|
|
1239
|
+
selection remain independent axes — you can peek one owner while twelve
|
|
1240
|
+
are selected for transfer.
|
|
1241
|
+
- **The context coopts, leaves consume.** `shell` and the keyed
|
|
1242
|
+
`useTableContext('owners')` are joined once in `provideOwnershipAtlas()`;
|
|
1243
|
+
five components share filters, selection, expansion, the peek and the
|
|
1244
|
+
transfer action through one `useOwnershipAtlas()` call. Leaves receive
|
|
1245
|
+
only the data they render (`owner`, `owner-id`).
|
|
1246
|
+
- **`owners` is a page prop, not a client fetch.** The server owns
|
|
1247
|
+
filtering, search, tab scoping and pagination; `useQueryObject` (filters)
|
|
1248
|
+
and `href` + `server: true` tabs are two doors into the same partial
|
|
1249
|
+
reload. The `kinds` filter reshapes the owners themselves server-side —
|
|
1250
|
+
the client never re-derives counts or totals.
|
|
1251
|
+
- **Bulk transfer carries the full select-all-across-pages payload**
|
|
1252
|
+
(`ids`/`all`/`unselected` + `toOwnerId`), and the target list excludes the
|
|
1253
|
+
current selection — the UI cannot express "transfer onto an owner being
|
|
1254
|
+
emptied". The action is complete: visit, refresh bump, selection reset,
|
|
1255
|
+
toast naming the target.
|
|
1256
|
+
- **Sizing:** the topbar search is `compact` (28px) per `md`-first; `sm`
|
|
1257
|
+
appears only in the toolbar, rail pills, peek footer and bottom bar, and
|
|
1258
|
+
the in-row expand control is `xs` — the densest surface on the page. This
|
|
1259
|
+
page creates nothing, so no `variant="primary"` appears anywhere, and its
|
|
1260
|
+
one mutation is not destructive, so there is no `useConfirm` — holdings
|
|
1261
|
+
move, they are not lost.
|
|
1262
|
+
|
|
1263
|
+
## Variations
|
|
1264
|
+
|
|
1265
|
+
- **Per-holding actions**: give the nested table its own `actions` column
|
|
1266
|
+
(a `…` dropdown with "Transfer this holding") calling the same context
|
|
1267
|
+
action with a single id. Snap indices are unaffected — structural columns
|
|
1268
|
+
are accounted for automatically.
|
|
1269
|
+
- **Divergent child columns**: if the holdings table needs columns that
|
|
1270
|
+
should _not_ align (say, an audit-log expansion), drop
|
|
1271
|
+
`inherit-column-widths` and let it lay out independently — inheritance is
|
|
1272
|
+
for continuation, not for every nested table.
|
|
1273
|
+
- **Confirmed transfers**: if a transfer is heavyweight in your domain
|
|
1274
|
+
(billing moves with it), wrap `bulkTransfer` in `useConfirm` with the
|
|
1275
|
+
count and target in the message.
|
|
1276
|
+
- **Deep-linkable expansion**: mirror `expanded` into the URL alongside the
|
|
1277
|
+
filters if support wants to share "look at this owner's holdings" links.
|
|
1278
|
+
- **Keyboard triage**: add `keyboard-navigation` to the owners table —
|
|
1279
|
+
highlight already opens the peek, so arrows + Enter make the page
|
|
1280
|
+
reviewable hands-on-keyboard; the approvals-inbox recipe is the full
|
|
1281
|
+
treatment.
|