bitboss-ui 2.1.134 → 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 +161 -59
- 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,1328 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Records Workspace (Inertia)
|
|
3
|
+
summary: Full-anatomy invoices workspace for Laravel + Inertia — breadcrumbs + page search, chip filter rail (one Filters menu + editable filter chips), server-visit tabs with counts, one-click status cells via promise-wrapped visits, bulk bottom panel with select-all-across-pages, and a stacked peek sidebar, all through one page context that coopts the Inertia Helpers toolkit.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Recipe: Records Workspace (Inertia)
|
|
7
|
+
|
|
8
|
+
The flagship advanced-page recipe adapted for **Laravel + Inertia**: the
|
|
9
|
+
same Stripe-invoices × Linear list workspace — app chrome, breadcrumbs +
|
|
10
|
+
page search, chip filter rail, tabs with live counts, a dense server-paged
|
|
11
|
+
table, a floating bulk-action bar, and a stacked peek sidebar — but the list
|
|
12
|
+
is a page prop, filters mirror into the URL through
|
|
13
|
+
[`useQueryObject`](../../guides/inertia-helpers.md), selection and paging
|
|
14
|
+
come from the keyed [`useTableContext`](../../guides/inertia-helpers.md),
|
|
15
|
+
and every mutation is a promise-wrapped `router.visit`. Anatomy, components,
|
|
16
|
+
the context shape, copy and data are identical to the Vue recipe; only the
|
|
17
|
+
data/URL/mutation layer changes.
|
|
18
|
+
|
|
19
|
+
Sibling recipes: [Vue](../vue/records-workspace.md) ·
|
|
20
|
+
[Nuxt](../nuxt/records-workspace.md).
|
|
21
|
+
|
|
22
|
+
## Prerequisites
|
|
23
|
+
|
|
24
|
+
- `<BbConfirm />` and `<BbToast />` mounted once in the app layout.
|
|
25
|
+
- From the [Inertia Helpers](../../guides/inertia-helpers.md) toolkit:
|
|
26
|
+
`useTableContext`, `useQueryObject`, `useResourceContext`.
|
|
27
|
+
- Controller: `Inertia::render('Invoices/Index', ['invoices' =>
|
|
28
|
+
InvoicePaginator::make(...), 'tabCounts' => [...]])` — `invoices` is a
|
|
29
|
+
standard Laravel paginator (`PaginatedResponse<Invoice>`) and `tabCounts`
|
|
30
|
+
a plain `{ all, outstanding, paid, archived }` map. Both are re-sent on
|
|
31
|
+
every partial reload the page triggers (`only: ['invoices', 'tabCounts']`).
|
|
32
|
+
Mutation routes are plain Laravel routes (`PATCH /invoices/:id`,
|
|
33
|
+
`POST /invoices/:id/duplicate`, …) that redirect back; small JSON GET
|
|
34
|
+
endpoints (`GET /invoices/:id/peek`, `GET /customers/:id/peek`,
|
|
35
|
+
`GET /customers/search`) back the sidebar peeks and the customer filter
|
|
36
|
+
facet so neither is a full-page visit.
|
|
37
|
+
|
|
38
|
+
## Key ideas
|
|
39
|
+
|
|
40
|
+
- **One coopting page context.** `provideInvoicesWorkspace()` joins the
|
|
41
|
+
page-shell stack **and** the keyed `useTableContext('invoices')` once,
|
|
42
|
+
owns filters/tab/dialogs, and exposes complete actions. Every leaf calls
|
|
43
|
+
`useInvoicesWorkspace()` and nothing else — zero prop drilling anywhere
|
|
44
|
+
on the page.
|
|
45
|
+
- **The table has no client-side fetch at all.** `invoices` arrives as a
|
|
46
|
+
page prop; `useTableContext('invoices')` turns it into `items` +
|
|
47
|
+
`totalItems`/`page`/`perPage` (URL-backed) + `selected`/`unselected`/`all`
|
|
48
|
+
(select-all-across-pages), and `BbTable` binds directly to that handle —
|
|
49
|
+
no `dependencies`, no items function.
|
|
50
|
+
- **Filters mirror into the URL with `useQueryObject`.** Changing a filter
|
|
51
|
+
performs a debounced partial Inertia visit
|
|
52
|
+
(`only: ['invoices', 'tabCounts']`); the server is the single source of
|
|
53
|
+
filtered, paginated truth.
|
|
54
|
+
- **One Filters menu, one chip per applied facet.** The rail is a single
|
|
55
|
+
`BbDropdown` of searchable categories (status / customer / due-date
|
|
56
|
+
presets) plus one chip per APPLIED facet — never one per value. Each chip
|
|
57
|
+
is itself a dropdown onto the same filter group, so it edits in place;
|
|
58
|
+
clearing happens chip by chip (no bulk clear-all).
|
|
59
|
+
- **Tabs are real visits.** `BbTabs` items carry `href` + `server: true`
|
|
60
|
+
(component-level `navigation` is required alongside it) so switching tabs
|
|
61
|
+
is a genuine, partial-reloaded Inertia visit — not a client-only URL
|
|
62
|
+
change.
|
|
63
|
+
- **Mutations are promise-wrapped `router.visit` calls.** A tiny local
|
|
64
|
+
`visit()` helper turns Inertia's callback-based API into a promise, so
|
|
65
|
+
context actions stay `async function`s exactly like the Vue/Nuxt
|
|
66
|
+
versions — `await ctx.updateStatus(...)` reads the same everywhere.
|
|
67
|
+
- **Clicking a row peeks it.** `v-model:highlighted` is bound to the shell
|
|
68
|
+
stack, so the highlighted row and the open peek are the same fact; the
|
|
69
|
+
invoice number cell links to the full detail page instead. Peeks fetch
|
|
70
|
+
from a small JSON endpoint via `useResourceContext` — not a full-page
|
|
71
|
+
visit, so opening the sidebar never replaces the list underneath it.
|
|
72
|
+
- **Buttons are `md` by default** (28px, flush beside `compact` inputs);
|
|
73
|
+
`sm` only in the table rows, the peeks' headers and the bottom bar.
|
|
74
|
+
|
|
75
|
+
## Page anatomy
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
InvoicesWorkspace/
|
|
79
|
+
Index.vue ← assembly: PageShell slots, table, tabs, pagination
|
|
80
|
+
context.ts ← coopting page context (shell + useTableContext + filters + actions)
|
|
81
|
+
facets.ts ← the facet contract (shape only — deliberately no shared builder)
|
|
82
|
+
dueRange.ts ← due-date preset keys + range math
|
|
83
|
+
FilterRail.vue ← one Filters menu + one chip per applied facet
|
|
84
|
+
FilterChip.vue ← applied-facet chip — itself a dropdown onto the same filter
|
|
85
|
+
StatusCell.vue ← one-click status change (soft badge → BbSelectPopover)
|
|
86
|
+
DueDateCell.vue ← inline due-date reschedule (BbPopover calendar)
|
|
87
|
+
RowActions.vue ← per-row "…" dropdown
|
|
88
|
+
SelectionBar.vue ← bulk actions in the floating bottom panel
|
|
89
|
+
InvoicePeek.vue ← sidebar workbench, stack level 1
|
|
90
|
+
CustomerPeek.vue ← stacked peek, back arrow via the shell
|
|
91
|
+
RecordPaymentDialog.vue ← page-level dialog, driven by the context
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Chrome assumed from the guides: [App Layout](../../guides/app-layout.md)
|
|
95
|
+
(left nav + fat footer), [Page Shell](../../guides/page-shell.md),
|
|
96
|
+
[Floating Bottom Panel](../../guides/floating-bottom-panel.md).
|
|
97
|
+
|
|
98
|
+
## Action inventory
|
|
99
|
+
|
|
100
|
+
| # | Action | Trigger | Mechanism |
|
|
101
|
+
| --- | ------------------------------ | -------------------------------- | ------------------------------------------------------ |
|
|
102
|
+
| 1 | New invoice | topbar, the page's one `primary` | navigation (`href="/invoices/create"`) |
|
|
103
|
+
| 2 | Page search | topbar right | `filters.search` → `useQueryObject` partial visit |
|
|
104
|
+
| 3 | Filter status / customer / due | Filters menu + filter chips | `BbDropdown` facets; chips edit the filter in place |
|
|
105
|
+
| 4 | Clear a filter | chip clear button | facet `clear()` — one facet at a time, no bulk CTA |
|
|
106
|
+
| 5 | Switch tab | server-visit tabs with counts | `BbTabs` `href` + `server: true` visit |
|
|
107
|
+
| 6 | Peek invoice | row click / peek lists | `v-model:highlighted` → `peekInvoice(id)`, JSON fetch |
|
|
108
|
+
| 7 | Peek customer | customer cell (fresh) / in peeks | `peekCustomer(id)` / `stackCustomer(id)` → back arrow |
|
|
109
|
+
| 8 | Change status inline | status badge in row & peek | one-click `BbSelectPopover` → undoable visit |
|
|
110
|
+
| 9 | Reschedule due date inline | due-date cell | `BbPopover` calendar → undoable visit |
|
|
111
|
+
| 10 | Record payment | row `…`, peek button | `BbDialog` via `ctx.dialogs` → promise-wrapped visit |
|
|
112
|
+
| 11 | Edit / duplicate | row `…` dropdown | navigation (`href`) / context action |
|
|
113
|
+
| 12 | Archive / delete | row `…`, bulk bar | destructive behind `useConfirm` |
|
|
114
|
+
| 13 | Bulk mark paid / remind | floating bottom panel | context actions on `table.selected`/`all`/`unselected` |
|
|
115
|
+
| 14 | Select rows / select all | table checkboxes | `useTableContext` selection (across pages) |
|
|
116
|
+
| 15 | Open full invoice | invoice number cell, peek footer | navigation (`href="/invoices/:id"`) |
|
|
117
|
+
| 16 | Back / close peek | shell chrome | shell stack pop / close |
|
|
118
|
+
|
|
119
|
+
## The code
|
|
120
|
+
|
|
121
|
+
### context.ts
|
|
122
|
+
|
|
123
|
+
```ts
|
|
124
|
+
// InvoicesWorkspace/context.ts
|
|
125
|
+
import {
|
|
126
|
+
computed,
|
|
127
|
+
inject,
|
|
128
|
+
provide,
|
|
129
|
+
reactive,
|
|
130
|
+
ref,
|
|
131
|
+
type ComputedRef,
|
|
132
|
+
type InjectionKey,
|
|
133
|
+
type Ref,
|
|
134
|
+
} from 'vue';
|
|
135
|
+
import { router } from '@inertiajs/vue3';
|
|
136
|
+
import type { RequestPayload } from '@inertiajs/core';
|
|
137
|
+
import { useConfirm, useToast } from 'bitboss-ui';
|
|
138
|
+
import {
|
|
139
|
+
usePageShellContext,
|
|
140
|
+
type PageShellContext,
|
|
141
|
+
} from '@/components/layout/usePageShellContext';
|
|
142
|
+
import {
|
|
143
|
+
useTableContext,
|
|
144
|
+
type TableContext,
|
|
145
|
+
} from '@/composables/useTableContext';
|
|
146
|
+
import { useQueryObject } from '@/composables/useQueryObject';
|
|
147
|
+
import { useProp } from '@/composables/useProp';
|
|
148
|
+
import { useQuery } from '@/composables/useQuery';
|
|
149
|
+
import type { Invoice, InvoiceStatus, PaymentDraft } from '@/types';
|
|
150
|
+
|
|
151
|
+
/** What the stacked sidebar can show. Clicking a name pushes one of these. */
|
|
152
|
+
export type PeekItem =
|
|
153
|
+
| { type: 'invoice'; id: number }
|
|
154
|
+
| { type: 'customer'; id: number };
|
|
155
|
+
|
|
156
|
+
export type WorkspaceTab = 'all' | 'outstanding' | 'paid' | 'archived';
|
|
157
|
+
|
|
158
|
+
export interface InvoiceFilters {
|
|
159
|
+
search: string;
|
|
160
|
+
status: InvoiceStatus[];
|
|
161
|
+
customerId: number | null;
|
|
162
|
+
/**
|
|
163
|
+
* `[start, end]` ISO strings, or `[]` when unset. Range mode requires an
|
|
164
|
+
* array modelValue -- binding `null` throws, so the empty filter is `[]`.
|
|
165
|
+
*/
|
|
166
|
+
dueBetween: string[];
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const RELOAD_PROPS = ['invoices', 'tabCounts'] as const;
|
|
170
|
+
|
|
171
|
+
export interface InvoicesWorkspaceContext {
|
|
172
|
+
// -- Coopted contexts ------------------------------------------------------
|
|
173
|
+
shell: PageShellContext<PeekItem>;
|
|
174
|
+
table: TableContext<Invoice, number>;
|
|
175
|
+
// -- Page-owned state ------------------------------------------------------
|
|
176
|
+
filters: InvoiceFilters;
|
|
177
|
+
hasActiveFilters: ComputedRef<boolean>;
|
|
178
|
+
tab: Ref<WorkspaceTab>;
|
|
179
|
+
tabCounts: ComputedRef<Record<WorkspaceTab, number>>;
|
|
180
|
+
dialogs: { recordPayment: Ref<Invoice | null> };
|
|
181
|
+
/** Bumped after every mutation — peeks watch it to re-fetch their JSON detail. */
|
|
182
|
+
refreshKey: Ref<number>;
|
|
183
|
+
// -- Peek grammar ----------------------------------------------------------
|
|
184
|
+
peekInvoice: (id: number) => void;
|
|
185
|
+
stackInvoice: (id: number) => void;
|
|
186
|
+
stackCustomer: (id: number) => void;
|
|
187
|
+
// -- Actions (complete: visit + refresh + toast) -----------------------------
|
|
188
|
+
clearFilters: () => void;
|
|
189
|
+
updateStatus: (invoice: Invoice, status: InvoiceStatus) => Promise<void>;
|
|
190
|
+
duplicateInvoice: (invoice: Invoice) => Promise<void>;
|
|
191
|
+
recordPayment: (invoice: Invoice, draft: PaymentDraft) => Promise<void>;
|
|
192
|
+
archiveInvoice: (invoice: Invoice) => Promise<void>;
|
|
193
|
+
deleteInvoice: (invoice: Invoice) => Promise<void>;
|
|
194
|
+
bulkMarkPaid: () => Promise<void>;
|
|
195
|
+
bulkRemind: () => Promise<void>;
|
|
196
|
+
bulkArchive: () => Promise<void>;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
const key: InjectionKey<InvoicesWorkspaceContext> =
|
|
200
|
+
Symbol('invoices-workspace');
|
|
201
|
+
|
|
202
|
+
/** Comma-joined query value → string[] (or null when absent). */
|
|
203
|
+
const toArray = (value: unknown): string[] | null => {
|
|
204
|
+
if (value == null || value === '') return null;
|
|
205
|
+
return Array.isArray(value) ? value.map(String) : String(value).split(',');
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
/** Inertia's callback-based visit, wrapped as a promise — so every context
|
|
209
|
+
* action stays `async`, exactly like the Vue/Nuxt versions. Always a
|
|
210
|
+
* partial reload of the props this page depends on. */
|
|
211
|
+
const visit = (
|
|
212
|
+
method: 'post' | 'put' | 'patch' | 'delete',
|
|
213
|
+
url: string,
|
|
214
|
+
// Inertia's own payload type — strings/numbers/booleans/arrays/files.
|
|
215
|
+
// (`Record<string, unknown>` does not satisfy it.)
|
|
216
|
+
data: RequestPayload = {}
|
|
217
|
+
): Promise<void> =>
|
|
218
|
+
new Promise((resolve, reject) => {
|
|
219
|
+
router.visit(url, {
|
|
220
|
+
method,
|
|
221
|
+
data,
|
|
222
|
+
only: [...RELOAD_PROPS],
|
|
223
|
+
preserveScroll: true,
|
|
224
|
+
preserveState: true,
|
|
225
|
+
onSuccess: () => resolve(),
|
|
226
|
+
onError: (errors) => reject(errors),
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
export function provideInvoicesWorkspace(): InvoicesWorkspaceContext {
|
|
231
|
+
const { toast } = useToast();
|
|
232
|
+
const { confirm } = useConfirm();
|
|
233
|
+
|
|
234
|
+
// -- Coopt the specific contexts: once, here, for the whole page. ----------
|
|
235
|
+
const shell = usePageShellContext<PeekItem>();
|
|
236
|
+
// `Invoice, number`: BbTable's `item-value="id"` resolves selection to
|
|
237
|
+
// invoice ids, matching the Vue/Nuxt `table.selected: number[]` shape.
|
|
238
|
+
const table = useTableContext<Invoice, number>('invoices');
|
|
239
|
+
|
|
240
|
+
// -- Filters: seeded from the current URL, mirrored back by useQueryObject. -
|
|
241
|
+
const query = useQuery();
|
|
242
|
+
const filters = reactive<InvoiceFilters>({
|
|
243
|
+
search: (query.search as string) ?? '',
|
|
244
|
+
status: (toArray(query.status) ?? []) as InvoiceStatus[],
|
|
245
|
+
customerId: query.customerId ? Number(query.customerId) : null,
|
|
246
|
+
dueBetween: toArray(query.dueBetween) ?? [],
|
|
247
|
+
});
|
|
248
|
+
useQueryObject(filters, { only: [...RELOAD_PROPS] });
|
|
249
|
+
|
|
250
|
+
const hasActiveFilters = computed(
|
|
251
|
+
() =>
|
|
252
|
+
filters.search !== '' ||
|
|
253
|
+
filters.status.length > 0 ||
|
|
254
|
+
filters.customerId !== null ||
|
|
255
|
+
filters.dueBetween.length > 0
|
|
256
|
+
);
|
|
257
|
+
const clearFilters = () => {
|
|
258
|
+
filters.search = '';
|
|
259
|
+
filters.status = [];
|
|
260
|
+
filters.customerId = null;
|
|
261
|
+
filters.dueBetween = [];
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
// Tab: seeded from the URL; BbTabs' own `href` + `server` visit updates
|
|
265
|
+
// the URL, and its `v-model` write keeps this ref in sync with the click.
|
|
266
|
+
const tab = ref<WorkspaceTab>((query.tab as WorkspaceTab) ?? 'all');
|
|
267
|
+
const tabCounts = useProp<Record<WorkspaceTab, number>>('tabCounts');
|
|
268
|
+
|
|
269
|
+
const refreshKey = ref(0);
|
|
270
|
+
const dialogs = { recordPayment: ref<Invoice | null>(null) };
|
|
271
|
+
|
|
272
|
+
// -- Peek grammar ----------------------------------------------------------------
|
|
273
|
+
// peekX opens a fresh stack (from the list); stackX drills down (from a peek).
|
|
274
|
+
const peekInvoice = (id: number) => shell.push({ type: 'invoice', id }, true);
|
|
275
|
+
const stackInvoice = (id: number) => shell.push({ type: 'invoice', id });
|
|
276
|
+
const stackCustomer = (id: number) => shell.push({ type: 'customer', id });
|
|
277
|
+
|
|
278
|
+
// -- Actions --------------------------------------------------------------------
|
|
279
|
+
const refresh = () => {
|
|
280
|
+
refreshKey.value++;
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
const updateStatus = async (invoice: Invoice, status: InvoiceStatus) => {
|
|
284
|
+
await visit('patch', `/invoices/${invoice.id}`, { status });
|
|
285
|
+
refresh();
|
|
286
|
+
toast({
|
|
287
|
+
title: `${invoice.number} moved to ${status}.`,
|
|
288
|
+
variant: 'success',
|
|
289
|
+
});
|
|
290
|
+
};
|
|
291
|
+
|
|
292
|
+
const duplicateInvoice = async (invoice: Invoice) => {
|
|
293
|
+
await visit('post', `/invoices/${invoice.id}/duplicate`);
|
|
294
|
+
refresh();
|
|
295
|
+
toast({ title: `${invoice.number} duplicated.`, variant: 'success' });
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
const recordPayment = async (invoice: Invoice, draft: PaymentDraft) => {
|
|
299
|
+
await visit('post', `/invoices/${invoice.id}/payments`, { ...draft });
|
|
300
|
+
dialogs.recordPayment.value = null;
|
|
301
|
+
refresh();
|
|
302
|
+
toast({
|
|
303
|
+
title: `Payment recorded on ${invoice.number}.`,
|
|
304
|
+
variant: 'success',
|
|
305
|
+
});
|
|
306
|
+
};
|
|
307
|
+
|
|
308
|
+
const archiveInvoice = async (invoice: Invoice) => {
|
|
309
|
+
await visit('patch', `/invoices/${invoice.id}/archive`);
|
|
310
|
+
refresh();
|
|
311
|
+
toast({ title: `${invoice.number} archived.`, variant: 'success' });
|
|
312
|
+
};
|
|
313
|
+
|
|
314
|
+
const deleteInvoice = async (invoice: Invoice) => {
|
|
315
|
+
const ok = await confirm({
|
|
316
|
+
variant: 'destructive',
|
|
317
|
+
title: 'Delete invoice',
|
|
318
|
+
text: `Delete ${invoice.number}? This cannot be undone.`,
|
|
319
|
+
yes: 'Delete',
|
|
320
|
+
no: 'Cancel',
|
|
321
|
+
});
|
|
322
|
+
if (!ok) return;
|
|
323
|
+
await visit('delete', `/invoices/${invoice.id}`);
|
|
324
|
+
refresh();
|
|
325
|
+
toast({ title: `${invoice.number} deleted.`, variant: 'success' });
|
|
326
|
+
};
|
|
327
|
+
|
|
328
|
+
// Bulk actions carry the full select-all-across-pages payload — the
|
|
329
|
+
// server combines `all` + `unselected` the same way BbTable does.
|
|
330
|
+
const bulkPayload = () => ({
|
|
331
|
+
ids: table.selected.value,
|
|
332
|
+
all: table.all.value,
|
|
333
|
+
unselected: table.unselected.value,
|
|
334
|
+
});
|
|
335
|
+
const bulkCount = () =>
|
|
336
|
+
table.all.value
|
|
337
|
+
? table.totalItems.value - table.unselected.value.length
|
|
338
|
+
: table.selected.value.length;
|
|
339
|
+
|
|
340
|
+
const bulkMarkPaid = async () => {
|
|
341
|
+
const count = bulkCount();
|
|
342
|
+
await visit('patch', '/invoices/bulk/mark-paid', bulkPayload());
|
|
343
|
+
table.resetSelection();
|
|
344
|
+
toast({ title: `${count} invoices marked as paid.`, variant: 'success' });
|
|
345
|
+
};
|
|
346
|
+
|
|
347
|
+
const bulkRemind = async () => {
|
|
348
|
+
const count = bulkCount();
|
|
349
|
+
await visit('post', '/invoices/bulk/remind', bulkPayload());
|
|
350
|
+
table.resetSelection();
|
|
351
|
+
toast({
|
|
352
|
+
title: `Reminder sent for ${count} invoices.`,
|
|
353
|
+
variant: 'success',
|
|
354
|
+
});
|
|
355
|
+
};
|
|
356
|
+
|
|
357
|
+
const bulkArchive = async () => {
|
|
358
|
+
const count = bulkCount();
|
|
359
|
+
const ok = await confirm({
|
|
360
|
+
variant: 'destructive',
|
|
361
|
+
title: 'Archive invoices',
|
|
362
|
+
text: `Archive ${count} invoices? They move out of every tab except Archived.`,
|
|
363
|
+
yes: 'Archive',
|
|
364
|
+
no: 'Cancel',
|
|
365
|
+
});
|
|
366
|
+
if (!ok) return;
|
|
367
|
+
await visit('patch', '/invoices/bulk/archive', bulkPayload());
|
|
368
|
+
table.resetSelection();
|
|
369
|
+
toast({ title: `${count} invoices archived.`, variant: 'success' });
|
|
370
|
+
};
|
|
371
|
+
|
|
372
|
+
const ctx: InvoicesWorkspaceContext = {
|
|
373
|
+
shell,
|
|
374
|
+
table,
|
|
375
|
+
filters,
|
|
376
|
+
hasActiveFilters,
|
|
377
|
+
tab,
|
|
378
|
+
tabCounts,
|
|
379
|
+
dialogs,
|
|
380
|
+
refreshKey,
|
|
381
|
+
peekInvoice,
|
|
382
|
+
stackInvoice,
|
|
383
|
+
stackCustomer,
|
|
384
|
+
clearFilters,
|
|
385
|
+
updateStatus,
|
|
386
|
+
duplicateInvoice,
|
|
387
|
+
recordPayment,
|
|
388
|
+
archiveInvoice,
|
|
389
|
+
deleteInvoice,
|
|
390
|
+
bulkMarkPaid,
|
|
391
|
+
bulkRemind,
|
|
392
|
+
bulkArchive,
|
|
393
|
+
};
|
|
394
|
+
provide(key, ctx);
|
|
395
|
+
return ctx;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
export function useInvoicesWorkspace(): InvoicesWorkspaceContext {
|
|
399
|
+
const ctx = inject(key);
|
|
400
|
+
if (!ctx)
|
|
401
|
+
throw new Error('useInvoicesWorkspace() called outside InvoicesWorkspace');
|
|
402
|
+
return ctx;
|
|
403
|
+
}
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
### Index.vue — the assembly
|
|
407
|
+
|
|
408
|
+
```vue
|
|
409
|
+
<!-- InvoicesWorkspace/Index.vue -->
|
|
410
|
+
<template>
|
|
411
|
+
<PageShell>
|
|
412
|
+
<!-- Topbar: breadcrumbs left, page search + primary action right. -->
|
|
413
|
+
<template #topbar>
|
|
414
|
+
<div class="flex items-center justify-between gap-4 border-b px-4 py-2">
|
|
415
|
+
<!-- Breadcrumbs take the row's slack on a stable basis (min-w-0 flex-auto);
|
|
416
|
+
without it their overflow recompute fights the flex layout every frame. -->
|
|
417
|
+
<BbBreadcrumbs
|
|
418
|
+
class="min-w-0 flex-auto"
|
|
419
|
+
:items="[
|
|
420
|
+
{ key: 'dashboard', text: 'Dashboard', href: '/dashboard' },
|
|
421
|
+
{ key: 'billing', text: 'Billing', href: '/billing' },
|
|
422
|
+
{ key: 'invoices', text: 'Invoices' },
|
|
423
|
+
]"
|
|
424
|
+
/>
|
|
425
|
+
<div class="flex shrink-0 items-center gap-2">
|
|
426
|
+
<BbTextInput
|
|
427
|
+
v-model="ctx.filters.search"
|
|
428
|
+
hide-label
|
|
429
|
+
label="Search invoices"
|
|
430
|
+
clearable
|
|
431
|
+
compact
|
|
432
|
+
placeholder="Search number or customer…"
|
|
433
|
+
prepend:icon="lucide:search"
|
|
434
|
+
/>
|
|
435
|
+
<BbButton
|
|
436
|
+
href="/invoices/create"
|
|
437
|
+
prepend:icon="lucide:plus"
|
|
438
|
+
variant="primary"
|
|
439
|
+
>
|
|
440
|
+
New invoice
|
|
441
|
+
</BbButton>
|
|
442
|
+
</div>
|
|
443
|
+
</div>
|
|
444
|
+
</template>
|
|
445
|
+
|
|
446
|
+
<div class="flex flex-col gap-3 p-4">
|
|
447
|
+
<FilterRail />
|
|
448
|
+
|
|
449
|
+
<!-- Tabs are real visits: href + server (component-level `navigation`
|
|
450
|
+
is required alongside per-item `server`), each carrying the same
|
|
451
|
+
partial-reload prop list as the filter watcher. `preserve-state`
|
|
452
|
+
keeps this page (and the tabs instance) alive across the visit so
|
|
453
|
+
the sliding pill animates to the new tab instead of the page
|
|
454
|
+
remounting and the pill snapping — matching the filter watcher,
|
|
455
|
+
which already visits with preserveState. -->
|
|
456
|
+
<BbTabs
|
|
457
|
+
v-model="ctx.tab.value"
|
|
458
|
+
compact
|
|
459
|
+
navigation
|
|
460
|
+
preserve-scroll
|
|
461
|
+
preserve-state
|
|
462
|
+
replace
|
|
463
|
+
:items="[
|
|
464
|
+
{
|
|
465
|
+
key: 'all',
|
|
466
|
+
label: `All · ${ctx.tabCounts.value.all}`,
|
|
467
|
+
href: '/invoices?tab=all',
|
|
468
|
+
server: true,
|
|
469
|
+
only: ['invoices', 'tabCounts'],
|
|
470
|
+
},
|
|
471
|
+
{
|
|
472
|
+
key: 'outstanding',
|
|
473
|
+
label: `Outstanding · ${ctx.tabCounts.value.outstanding}`,
|
|
474
|
+
href: '/invoices?tab=outstanding',
|
|
475
|
+
server: true,
|
|
476
|
+
only: ['invoices', 'tabCounts'],
|
|
477
|
+
},
|
|
478
|
+
{
|
|
479
|
+
key: 'paid',
|
|
480
|
+
label: `Paid · ${ctx.tabCounts.value.paid}`,
|
|
481
|
+
href: '/invoices?tab=paid',
|
|
482
|
+
server: true,
|
|
483
|
+
only: ['invoices', 'tabCounts'],
|
|
484
|
+
},
|
|
485
|
+
{
|
|
486
|
+
key: 'archived',
|
|
487
|
+
label: `Archived · ${ctx.tabCounts.value.archived}`,
|
|
488
|
+
href: '/invoices?tab=archived',
|
|
489
|
+
server: true,
|
|
490
|
+
only: ['invoices', 'tabCounts'],
|
|
491
|
+
},
|
|
492
|
+
]"
|
|
493
|
+
/>
|
|
494
|
+
|
|
495
|
+
<!-- No dependencies/items-fn: `invoices` is a page prop, and selection
|
|
496
|
+
(across pages) binds straight onto the keyed table context. -->
|
|
497
|
+
<BbTable
|
|
498
|
+
v-model="ctx.table.selected.value"
|
|
499
|
+
v-model:select-all="ctx.table.all.value"
|
|
500
|
+
v-model:unselected-items="ctx.table.unselected.value"
|
|
501
|
+
actions
|
|
502
|
+
caption="Invoices"
|
|
503
|
+
:columns="columns"
|
|
504
|
+
compact
|
|
505
|
+
item-value="id"
|
|
506
|
+
:items="ctx.table.items.value"
|
|
507
|
+
loading-text="Loading invoices…"
|
|
508
|
+
:row-class="rowClass"
|
|
509
|
+
selectable
|
|
510
|
+
>
|
|
511
|
+
<!-- Clicking the NAME of a thing peeks it. -->
|
|
512
|
+
<template #number="{ item, content }">
|
|
513
|
+
<BbButton
|
|
514
|
+
size="sm"
|
|
515
|
+
variant="link"
|
|
516
|
+
@click="() => ctx.peekInvoice(item.id)"
|
|
517
|
+
>
|
|
518
|
+
{{ content }}
|
|
519
|
+
</BbButton>
|
|
520
|
+
</template>
|
|
521
|
+
|
|
522
|
+
<template #customer_name="{ item, content }">
|
|
523
|
+
<BbButton
|
|
524
|
+
size="sm"
|
|
525
|
+
variant="ghost"
|
|
526
|
+
@click="() => ctx.stackCustomer(item.customer.id)"
|
|
527
|
+
>
|
|
528
|
+
{{ content }}
|
|
529
|
+
</BbButton>
|
|
530
|
+
</template>
|
|
531
|
+
|
|
532
|
+
<template #status="{ item }">
|
|
533
|
+
<StatusCell :invoice="item" />
|
|
534
|
+
</template>
|
|
535
|
+
|
|
536
|
+
<template #actions="{ item }">
|
|
537
|
+
<RowActions :invoice="item" />
|
|
538
|
+
</template>
|
|
539
|
+
|
|
540
|
+
<template #no-data>
|
|
541
|
+
<div class="flex flex-col items-center gap-2 p-6 text-center">
|
|
542
|
+
<p class="text-sm text-gray-500">
|
|
543
|
+
No invoices match
|
|
544
|
+
{{
|
|
545
|
+
ctx.hasActiveFilters.value ? 'the current filters' : 'this tab'
|
|
546
|
+
}}.
|
|
547
|
+
</p>
|
|
548
|
+
<BbButton
|
|
549
|
+
v-if="ctx.hasActiveFilters.value"
|
|
550
|
+
variant="ghost"
|
|
551
|
+
@click="ctx.clearFilters"
|
|
552
|
+
>
|
|
553
|
+
Clear filters
|
|
554
|
+
</BbButton>
|
|
555
|
+
</div>
|
|
556
|
+
</template>
|
|
557
|
+
</BbTable>
|
|
558
|
+
|
|
559
|
+
<!-- No table-id: the keyed table context is the page count here. -->
|
|
560
|
+
<BbPagination
|
|
561
|
+
v-model="ctx.table.page.value"
|
|
562
|
+
label="Invoices pagination"
|
|
563
|
+
:total-pages="ctx.table.totalPages.value"
|
|
564
|
+
/>
|
|
565
|
+
</div>
|
|
566
|
+
|
|
567
|
+
<SelectionBar />
|
|
568
|
+
|
|
569
|
+
<!-- Stacked peek sidebar: the shell owns back/close; we render by type. -->
|
|
570
|
+
<template #sidebar>
|
|
571
|
+
<InvoicePeek
|
|
572
|
+
v-if="ctx.shell.current.value?.type === 'invoice'"
|
|
573
|
+
:invoice-id="ctx.shell.current.value.id"
|
|
574
|
+
/>
|
|
575
|
+
<CustomerPeek
|
|
576
|
+
v-else-if="ctx.shell.current.value?.type === 'customer'"
|
|
577
|
+
:customer-id="ctx.shell.current.value.id"
|
|
578
|
+
/>
|
|
579
|
+
</template>
|
|
580
|
+
|
|
581
|
+
<template #dialogs>
|
|
582
|
+
<RecordPaymentDialog />
|
|
583
|
+
</template>
|
|
584
|
+
</PageShell>
|
|
585
|
+
</template>
|
|
586
|
+
|
|
587
|
+
<script setup lang="ts">
|
|
588
|
+
import {
|
|
589
|
+
BbBreadcrumbs,
|
|
590
|
+
BbButton,
|
|
591
|
+
BbPagination,
|
|
592
|
+
BbTable,
|
|
593
|
+
BbTabs,
|
|
594
|
+
BbTextInput,
|
|
595
|
+
} from 'bitboss-ui';
|
|
596
|
+
import PageShell from '@/components/layout/PageShell.vue';
|
|
597
|
+
import { provideInvoicesWorkspace } from './context';
|
|
598
|
+
import CustomerPeek from './CustomerPeek.vue';
|
|
599
|
+
import FilterRail from './FilterRail.vue';
|
|
600
|
+
import InvoicePeek from './InvoicePeek.vue';
|
|
601
|
+
import RecordPaymentDialog from './RecordPaymentDialog.vue';
|
|
602
|
+
import RowActions from './RowActions.vue';
|
|
603
|
+
import SelectionBar from './SelectionBar.vue';
|
|
604
|
+
import StatusCell from './StatusCell.vue';
|
|
605
|
+
import type { Invoice } from '@/types';
|
|
606
|
+
|
|
607
|
+
const ctx = provideInvoicesWorkspace();
|
|
608
|
+
|
|
609
|
+
const currency = new Intl.NumberFormat('en-US', {
|
|
610
|
+
style: 'currency',
|
|
611
|
+
currency: 'USD',
|
|
612
|
+
});
|
|
613
|
+
const shortDate = (value: string) =>
|
|
614
|
+
new Date(value).toLocaleDateString('en-US', {
|
|
615
|
+
month: 'short',
|
|
616
|
+
day: 'numeric',
|
|
617
|
+
});
|
|
618
|
+
|
|
619
|
+
const columns = [
|
|
620
|
+
{ key: 'number', label: 'Invoice' },
|
|
621
|
+
{ key: 'customer.name', label: 'Customer' },
|
|
622
|
+
{
|
|
623
|
+
key: 'amount',
|
|
624
|
+
label: 'Amount',
|
|
625
|
+
formatter: (value: number) => currency.format(value),
|
|
626
|
+
},
|
|
627
|
+
{ key: 'status', label: 'Status' },
|
|
628
|
+
{ key: 'dueDate', label: 'Due', formatter: shortDate },
|
|
629
|
+
{ key: 'issuedAt', label: 'Issued', formatter: shortDate },
|
|
630
|
+
];
|
|
631
|
+
|
|
632
|
+
// Overdue rows get a tinted background — public row-class API, no internals.
|
|
633
|
+
const rowClass = (item: Invoice) =>
|
|
634
|
+
item.status === 'overdue' ? 'bg-red-50 dark:bg-red-950/20' : undefined;
|
|
635
|
+
</script>
|
|
636
|
+
```
|
|
637
|
+
|
|
638
|
+
### FilterRail.vue
|
|
639
|
+
|
|
640
|
+
```vue
|
|
641
|
+
<!-- InvoicesWorkspace/FilterRail.vue -->
|
|
642
|
+
<template>
|
|
643
|
+
<div class="flex flex-wrap items-center gap-2">
|
|
644
|
+
<!-- Status: multi-select pill. -->
|
|
645
|
+
<BbSelectPopover
|
|
646
|
+
v-model="ctx.filters.status"
|
|
647
|
+
:items="['draft', 'pending', 'paid', 'overdue']"
|
|
648
|
+
multiple
|
|
649
|
+
>
|
|
650
|
+
<template #activator="{ props }">
|
|
651
|
+
<BbButton
|
|
652
|
+
v-bind="props"
|
|
653
|
+
append:icon="lucide:chevron-down"
|
|
654
|
+
size="sm"
|
|
655
|
+
variant="outline"
|
|
656
|
+
>
|
|
657
|
+
Status{{
|
|
658
|
+
ctx.filters.status.length ? ` · ${ctx.filters.status.length}` : ''
|
|
659
|
+
}}
|
|
660
|
+
</BbButton>
|
|
661
|
+
</template>
|
|
662
|
+
</BbSelectPopover>
|
|
663
|
+
|
|
664
|
+
<!-- Customer: single, query-aware search against a small JSON endpoint. -->
|
|
665
|
+
<BbSelectPopover
|
|
666
|
+
v-model="ctx.filters.customerId"
|
|
667
|
+
item-text="name"
|
|
668
|
+
item-value="id"
|
|
669
|
+
:items="searchCustomers"
|
|
670
|
+
>
|
|
671
|
+
<template #activator="{ props }">
|
|
672
|
+
<BbButton
|
|
673
|
+
v-bind="props"
|
|
674
|
+
append:icon="lucide:chevron-down"
|
|
675
|
+
size="sm"
|
|
676
|
+
variant="outline"
|
|
677
|
+
>
|
|
678
|
+
{{ customerLabel }}
|
|
679
|
+
</BbButton>
|
|
680
|
+
</template>
|
|
681
|
+
</BbSelectPopover>
|
|
682
|
+
|
|
683
|
+
<!-- Due date range: a compact input is 28px — flush with the sm pills' row. -->
|
|
684
|
+
<BbDatePickerInput
|
|
685
|
+
v-model="ctx.filters.dueBetween"
|
|
686
|
+
hide-label
|
|
687
|
+
label="Due date range"
|
|
688
|
+
clearable
|
|
689
|
+
compact
|
|
690
|
+
placeholder="Due between…"
|
|
691
|
+
range
|
|
692
|
+
/>
|
|
693
|
+
|
|
694
|
+
<!-- Clear-all renders only while something is active. -->
|
|
695
|
+
<BbButton
|
|
696
|
+
v-if="ctx.hasActiveFilters.value"
|
|
697
|
+
class="ml-auto"
|
|
698
|
+
prepend:icon="lucide:x"
|
|
699
|
+
size="sm"
|
|
700
|
+
variant="ghost"
|
|
701
|
+
@click="ctx.clearFilters"
|
|
702
|
+
>
|
|
703
|
+
Clear filters
|
|
704
|
+
</BbButton>
|
|
705
|
+
</div>
|
|
706
|
+
</template>
|
|
707
|
+
|
|
708
|
+
<script setup lang="ts">
|
|
709
|
+
import { computed, ref, watchEffect } from 'vue';
|
|
710
|
+
import { BbButton, BbDatePickerInput, BbSelectPopover } from 'bitboss-ui';
|
|
711
|
+
import { useInvoicesWorkspace } from './context';
|
|
712
|
+
import type { Customer } from '@/types';
|
|
713
|
+
|
|
714
|
+
const ctx = useInvoicesWorkspace();
|
|
715
|
+
|
|
716
|
+
// Query-aware items function: BbSelectPopover calls it with the search text.
|
|
717
|
+
// A small JSON endpoint, not an Inertia visit — searching a filter pill
|
|
718
|
+
// must not re-render the page.
|
|
719
|
+
const searchCustomers = (query: string): Promise<Customer[]> =>
|
|
720
|
+
fetch(`/customers/search?q=${encodeURIComponent(query)}`).then((res) =>
|
|
721
|
+
res.json()
|
|
722
|
+
);
|
|
723
|
+
|
|
724
|
+
// The trigger labels itself from page state (the popover is lazy by design
|
|
725
|
+
// and cannot know the selected label before its first open).
|
|
726
|
+
const selectedCustomer = ref<Customer | null>(null);
|
|
727
|
+
watchEffect(async () => {
|
|
728
|
+
selectedCustomer.value =
|
|
729
|
+
ctx.filters.customerId == null
|
|
730
|
+
? null
|
|
731
|
+
: await fetch(`/customers/${ctx.filters.customerId}/peek`).then((res) =>
|
|
732
|
+
res.json()
|
|
733
|
+
);
|
|
734
|
+
});
|
|
735
|
+
const customerLabel = computed(
|
|
736
|
+
() => selectedCustomer.value?.name ?? 'Customer'
|
|
737
|
+
);
|
|
738
|
+
</script>
|
|
739
|
+
```
|
|
740
|
+
|
|
741
|
+
### StatusCell.vue
|
|
742
|
+
|
|
743
|
+
```vue
|
|
744
|
+
<!-- InvoicesWorkspace/StatusCell.vue -->
|
|
745
|
+
<template>
|
|
746
|
+
<BbSelectPopover
|
|
747
|
+
:items="['draft', 'pending', 'paid', 'overdue']"
|
|
748
|
+
:model-value="invoice.status"
|
|
749
|
+
@update:model-value="(status) => pick(status as InvoiceStatus)"
|
|
750
|
+
>
|
|
751
|
+
<template #activator="{ props: activatorProps }">
|
|
752
|
+
<!-- The badge IS the trigger: BbBadgeButton turns the badge's own
|
|
753
|
+
body into the button, so the pill is the hit target and draws its
|
|
754
|
+
own focus ring — no wrapper element, no chrome class. The internal
|
|
755
|
+
trailing chevron says "clickable"; while the save runs the badge's
|
|
756
|
+
`loading` swaps the spinner into the chevron's place (§6.1
|
|
757
|
+
niceties). -->
|
|
758
|
+
<BbBadge
|
|
759
|
+
append:icon="lucide:chevron-down"
|
|
760
|
+
:loading="saving"
|
|
761
|
+
variant="outline"
|
|
762
|
+
>
|
|
763
|
+
<BbBadgeButton v-bind="activatorProps">{{
|
|
764
|
+
invoice.status
|
|
765
|
+
}}</BbBadgeButton>
|
|
766
|
+
</BbBadge>
|
|
767
|
+
</template>
|
|
768
|
+
</BbSelectPopover>
|
|
769
|
+
</template>
|
|
770
|
+
|
|
771
|
+
<script setup lang="ts">
|
|
772
|
+
import { ref } from 'vue';
|
|
773
|
+
import { BbBadge, BbBadgeButton, BbSelectPopover } from 'bitboss-ui';
|
|
774
|
+
import { useInvoicesWorkspace } from './context';
|
|
775
|
+
import type { Invoice, InvoiceStatus } from '@/types';
|
|
776
|
+
|
|
777
|
+
const props = defineProps<{ invoice: Invoice }>();
|
|
778
|
+
|
|
779
|
+
const ctx = useInvoicesWorkspace();
|
|
780
|
+
|
|
781
|
+
// In-flight flag for the save feedback — rung-1 local state, not context.
|
|
782
|
+
const saving = ref(false);
|
|
783
|
+
const pick = async (status: InvoiceStatus) => {
|
|
784
|
+
saving.value = true;
|
|
785
|
+
try {
|
|
786
|
+
await ctx.updateStatus(props.invoice, status);
|
|
787
|
+
} finally {
|
|
788
|
+
saving.value = false;
|
|
789
|
+
}
|
|
790
|
+
};
|
|
791
|
+
</script>
|
|
792
|
+
```
|
|
793
|
+
|
|
794
|
+
### RowActions.vue
|
|
795
|
+
|
|
796
|
+
```vue
|
|
797
|
+
<!-- InvoicesWorkspace/RowActions.vue -->
|
|
798
|
+
<template>
|
|
799
|
+
<BbDropdown
|
|
800
|
+
:items="[
|
|
801
|
+
{
|
|
802
|
+
key: 'edit',
|
|
803
|
+
text: 'Edit',
|
|
804
|
+
'prepend:icon': 'lucide:pencil',
|
|
805
|
+
href: `/invoices/${invoice.id}/edit`,
|
|
806
|
+
},
|
|
807
|
+
{
|
|
808
|
+
key: 'duplicate',
|
|
809
|
+
text: 'Duplicate',
|
|
810
|
+
'prepend:icon': 'lucide:copy',
|
|
811
|
+
onClick: () => ctx.duplicateInvoice(invoice),
|
|
812
|
+
},
|
|
813
|
+
{
|
|
814
|
+
key: 'payment',
|
|
815
|
+
text: 'Record payment',
|
|
816
|
+
'prepend:icon': 'lucide:banknote',
|
|
817
|
+
onClick: () => (ctx.dialogs.recordPayment.value = invoice),
|
|
818
|
+
},
|
|
819
|
+
{
|
|
820
|
+
key: 'archive',
|
|
821
|
+
text: 'Archive',
|
|
822
|
+
'prepend:icon': 'lucide:archive',
|
|
823
|
+
onClick: () => ctx.archiveInvoice(invoice),
|
|
824
|
+
},
|
|
825
|
+
{
|
|
826
|
+
key: 'delete',
|
|
827
|
+
text: 'Delete',
|
|
828
|
+
'prepend:icon': 'lucide:trash-2',
|
|
829
|
+
variant: 'destructive',
|
|
830
|
+
onClick: () => ctx.deleteInvoice(invoice),
|
|
831
|
+
},
|
|
832
|
+
]"
|
|
833
|
+
>
|
|
834
|
+
<template #activator="{ props }">
|
|
835
|
+
<BbButton v-bind="props" icon="lucide:ellipsis" size="sm" variant="ghost">
|
|
836
|
+
Invoice actions
|
|
837
|
+
</BbButton>
|
|
838
|
+
</template>
|
|
839
|
+
</BbDropdown>
|
|
840
|
+
</template>
|
|
841
|
+
|
|
842
|
+
<script setup lang="ts">
|
|
843
|
+
import { BbButton, BbDropdown } from 'bitboss-ui';
|
|
844
|
+
import { useInvoicesWorkspace } from './context';
|
|
845
|
+
import type { Invoice } from '@/types';
|
|
846
|
+
|
|
847
|
+
defineProps<{ invoice: Invoice }>();
|
|
848
|
+
|
|
849
|
+
const ctx = useInvoicesWorkspace();
|
|
850
|
+
</script>
|
|
851
|
+
```
|
|
852
|
+
|
|
853
|
+
### SelectionBar.vue
|
|
854
|
+
|
|
855
|
+
```vue
|
|
856
|
+
<!-- InvoicesWorkspace/SelectionBar.vue -->
|
|
857
|
+
<template>
|
|
858
|
+
<FloatingBottomPanel :open="selectedCount > 0">
|
|
859
|
+
<span class="px-2 text-sm">{{ selectedCount }} selected</span>
|
|
860
|
+
<BbButton
|
|
861
|
+
prepend:icon="lucide:check"
|
|
862
|
+
size="sm"
|
|
863
|
+
variant="ghost"
|
|
864
|
+
@click="ctx.bulkMarkPaid"
|
|
865
|
+
>
|
|
866
|
+
Mark as paid
|
|
867
|
+
</BbButton>
|
|
868
|
+
<BbButton
|
|
869
|
+
prepend:icon="lucide:send"
|
|
870
|
+
size="sm"
|
|
871
|
+
variant="ghost"
|
|
872
|
+
@click="ctx.bulkRemind"
|
|
873
|
+
>
|
|
874
|
+
Send reminder
|
|
875
|
+
</BbButton>
|
|
876
|
+
<div class="floating-bottom-panel__right flex items-center gap-1">
|
|
877
|
+
<BbButton size="sm" variant="destructive" @click="ctx.bulkArchive"
|
|
878
|
+
>Archive</BbButton
|
|
879
|
+
>
|
|
880
|
+
<BbButton
|
|
881
|
+
aria-label="Clear selection"
|
|
882
|
+
icon="lucide:x"
|
|
883
|
+
size="sm"
|
|
884
|
+
variant="ghost"
|
|
885
|
+
@click="ctx.table.resetSelection"
|
|
886
|
+
/>
|
|
887
|
+
</div>
|
|
888
|
+
</FloatingBottomPanel>
|
|
889
|
+
</template>
|
|
890
|
+
|
|
891
|
+
<script setup lang="ts">
|
|
892
|
+
import { computed } from 'vue';
|
|
893
|
+
import { BbButton } from 'bitboss-ui';
|
|
894
|
+
import { useInvoicesWorkspace } from './context';
|
|
895
|
+
import FloatingBottomPanel from '@/components/layout/FloatingBottomPanel.vue';
|
|
896
|
+
|
|
897
|
+
const ctx = useInvoicesWorkspace();
|
|
898
|
+
|
|
899
|
+
// `all` (select-all-across-pages) does not enumerate rows, so the visible
|
|
900
|
+
// count is the total minus whatever the user manually deselected.
|
|
901
|
+
const selectedCount = computed(() =>
|
|
902
|
+
ctx.table.all.value
|
|
903
|
+
? ctx.table.totalItems.value - ctx.table.unselected.value.length
|
|
904
|
+
: ctx.table.selected.value.length
|
|
905
|
+
);
|
|
906
|
+
</script>
|
|
907
|
+
```
|
|
908
|
+
|
|
909
|
+
### InvoicePeek.vue
|
|
910
|
+
|
|
911
|
+
```vue
|
|
912
|
+
<!-- InvoicesWorkspace/InvoicePeek.vue -->
|
|
913
|
+
<template>
|
|
914
|
+
<div v-if="invoice" class="flex flex-col gap-4 text-sm">
|
|
915
|
+
<!-- Header: identity + one-click status + amount. -->
|
|
916
|
+
<header class="flex flex-col gap-1.5">
|
|
917
|
+
<div class="flex items-center justify-between gap-2">
|
|
918
|
+
<h2 class="text-base font-semibold">{{ invoice.number }}</h2>
|
|
919
|
+
<StatusCell :invoice="invoice" />
|
|
920
|
+
</div>
|
|
921
|
+
<p class="text-xl font-semibold">{{ currency.format(invoice.amount) }}</p>
|
|
922
|
+
<p class="text-xs text-gray-500">
|
|
923
|
+
Issued {{ longDate(invoice.issuedAt) }} · due
|
|
924
|
+
{{ longDate(invoice.dueDate) }}
|
|
925
|
+
</p>
|
|
926
|
+
</header>
|
|
927
|
+
|
|
928
|
+
<!-- Properties: customer name drills DOWN — stacked peek, back arrow. -->
|
|
929
|
+
<dl class="grid grid-cols-[auto_1fr] gap-x-4 gap-y-1.5">
|
|
930
|
+
<dt class="text-gray-500">Customer</dt>
|
|
931
|
+
<dd>
|
|
932
|
+
<BbButton
|
|
933
|
+
size="sm"
|
|
934
|
+
variant="link"
|
|
935
|
+
@click="() => ctx.stackCustomer(invoice!.customer.id)"
|
|
936
|
+
>
|
|
937
|
+
{{ invoice.customer.name }}
|
|
938
|
+
</BbButton>
|
|
939
|
+
</dd>
|
|
940
|
+
<dt class="text-gray-500">Project</dt>
|
|
941
|
+
<dd>{{ invoice.project.name }}</dd>
|
|
942
|
+
<dt class="text-gray-500">Payment terms</dt>
|
|
943
|
+
<dd>{{ invoice.paymentTerms }}</dd>
|
|
944
|
+
<dt class="text-gray-500">Reference</dt>
|
|
945
|
+
<dd>{{ invoice.reference }}</dd>
|
|
946
|
+
</dl>
|
|
947
|
+
|
|
948
|
+
<!-- Line items: a real mini-table, not a summary sentence. -->
|
|
949
|
+
<section class="flex flex-col gap-1.5">
|
|
950
|
+
<h3 class="text-xs font-semibold uppercase tracking-wide text-gray-500">
|
|
951
|
+
Line items
|
|
952
|
+
</h3>
|
|
953
|
+
<BbTable
|
|
954
|
+
caption="Invoice line items"
|
|
955
|
+
:columns="[
|
|
956
|
+
{ key: 'description', label: 'Description' },
|
|
957
|
+
{ key: 'quantity', label: 'Qty' },
|
|
958
|
+
{
|
|
959
|
+
key: 'total',
|
|
960
|
+
label: 'Total',
|
|
961
|
+
formatter: (value: number) => currency.format(value),
|
|
962
|
+
},
|
|
963
|
+
]"
|
|
964
|
+
compact
|
|
965
|
+
item-value="id"
|
|
966
|
+
:items="invoice.lineItems"
|
|
967
|
+
/>
|
|
968
|
+
</section>
|
|
969
|
+
|
|
970
|
+
<!-- Payments so far. -->
|
|
971
|
+
<section v-if="invoice.payments.length" class="flex flex-col gap-1.5">
|
|
972
|
+
<h3 class="text-xs font-semibold uppercase tracking-wide text-gray-500">
|
|
973
|
+
Payments
|
|
974
|
+
</h3>
|
|
975
|
+
<ul class="flex flex-col gap-1">
|
|
976
|
+
<li
|
|
977
|
+
v-for="payment in invoice.payments"
|
|
978
|
+
:key="payment.id"
|
|
979
|
+
class="flex items-center justify-between gap-2"
|
|
980
|
+
>
|
|
981
|
+
<span
|
|
982
|
+
>{{ currency.format(payment.amount) }} · {{ payment.method }}</span
|
|
983
|
+
>
|
|
984
|
+
<span class="text-xs text-gray-500">{{
|
|
985
|
+
longDate(payment.paidAt)
|
|
986
|
+
}}</span>
|
|
987
|
+
</li>
|
|
988
|
+
</ul>
|
|
989
|
+
</section>
|
|
990
|
+
|
|
991
|
+
<!-- Activity feed. -->
|
|
992
|
+
<section class="flex flex-col gap-1.5">
|
|
993
|
+
<h3 class="text-xs font-semibold uppercase tracking-wide text-gray-500">
|
|
994
|
+
Activity
|
|
995
|
+
</h3>
|
|
996
|
+
<ul class="flex flex-col gap-2">
|
|
997
|
+
<li
|
|
998
|
+
v-for="entry in invoice.activity"
|
|
999
|
+
:key="entry.id"
|
|
1000
|
+
class="flex gap-2"
|
|
1001
|
+
>
|
|
1002
|
+
<BbIcon
|
|
1003
|
+
class="mt-0.5 shrink-0 text-gray-400"
|
|
1004
|
+
:icon="entry.icon"
|
|
1005
|
+
size="14"
|
|
1006
|
+
/>
|
|
1007
|
+
<div class="flex flex-col">
|
|
1008
|
+
<span>{{ entry.text }}</span>
|
|
1009
|
+
<span class="text-xs text-gray-500"
|
|
1010
|
+
>{{ entry.actor }} · {{ longDate(entry.at) }}</span
|
|
1011
|
+
>
|
|
1012
|
+
</div>
|
|
1013
|
+
</li>
|
|
1014
|
+
</ul>
|
|
1015
|
+
</section>
|
|
1016
|
+
|
|
1017
|
+
<!-- Peek is a workbench: act here, or leave for the full page. -->
|
|
1018
|
+
<footer class="mt-2 flex items-center gap-2 border-t pt-3">
|
|
1019
|
+
<BbButton
|
|
1020
|
+
prepend:icon="lucide:banknote"
|
|
1021
|
+
size="sm"
|
|
1022
|
+
variant="secondary"
|
|
1023
|
+
@click="() => (ctx.dialogs.recordPayment.value = invoice)"
|
|
1024
|
+
>
|
|
1025
|
+
Record payment
|
|
1026
|
+
</BbButton>
|
|
1027
|
+
<BbButton
|
|
1028
|
+
append:icon="lucide:arrow-up-right"
|
|
1029
|
+
:href="`/invoices/${invoice.id}`"
|
|
1030
|
+
size="sm"
|
|
1031
|
+
variant="ghost"
|
|
1032
|
+
>
|
|
1033
|
+
Open full page
|
|
1034
|
+
</BbButton>
|
|
1035
|
+
</footer>
|
|
1036
|
+
</div>
|
|
1037
|
+
|
|
1038
|
+
<div v-else class="flex justify-center p-8">
|
|
1039
|
+
<BbSpinner />
|
|
1040
|
+
</div>
|
|
1041
|
+
</template>
|
|
1042
|
+
|
|
1043
|
+
<script setup lang="ts">
|
|
1044
|
+
import { watch } from 'vue';
|
|
1045
|
+
import { BbButton, BbIcon, BbSpinner, BbTable } from 'bitboss-ui';
|
|
1046
|
+
import { useResourceContext } from '@/composables/useResourceContext';
|
|
1047
|
+
import StatusCell from './StatusCell.vue';
|
|
1048
|
+
import { useInvoicesWorkspace } from './context';
|
|
1049
|
+
import type { InvoiceDetail } from '@/types';
|
|
1050
|
+
|
|
1051
|
+
const props = defineProps<{ invoiceId: number }>();
|
|
1052
|
+
|
|
1053
|
+
const ctx = useInvoicesWorkspace();
|
|
1054
|
+
|
|
1055
|
+
// A small JSON endpoint, not a page visit — opening the peek never
|
|
1056
|
+
// re-renders the list underneath it. Re-fetches whenever the stack shows a
|
|
1057
|
+
// different invoice; `refreshKey` makes mutations (status, payment) reflect
|
|
1058
|
+
// here immediately.
|
|
1059
|
+
const { data: invoice, refresh } = useResourceContext<InvoiceDetail, number>(
|
|
1060
|
+
() => props.invoiceId,
|
|
1061
|
+
(id) => fetch(`/invoices/${id}/peek`).then((res) => res.json())
|
|
1062
|
+
);
|
|
1063
|
+
watch(() => ctx.refreshKey.value, refresh);
|
|
1064
|
+
|
|
1065
|
+
const currency = new Intl.NumberFormat('en-US', {
|
|
1066
|
+
style: 'currency',
|
|
1067
|
+
currency: 'USD',
|
|
1068
|
+
});
|
|
1069
|
+
const longDate = (value: string) =>
|
|
1070
|
+
new Date(value).toLocaleDateString('en-US', {
|
|
1071
|
+
month: 'short',
|
|
1072
|
+
day: 'numeric',
|
|
1073
|
+
year: 'numeric',
|
|
1074
|
+
});
|
|
1075
|
+
</script>
|
|
1076
|
+
```
|
|
1077
|
+
|
|
1078
|
+
### CustomerPeek.vue
|
|
1079
|
+
|
|
1080
|
+
```vue
|
|
1081
|
+
<!-- InvoicesWorkspace/CustomerPeek.vue -->
|
|
1082
|
+
<template>
|
|
1083
|
+
<div v-if="customer" class="flex flex-col gap-4 text-sm">
|
|
1084
|
+
<header class="flex items-center gap-3">
|
|
1085
|
+
<BbAvatar :alt="customer.name" :src="customer.avatarUrl" />
|
|
1086
|
+
<div class="flex flex-col">
|
|
1087
|
+
<h2 class="text-base font-semibold">{{ customer.name }}</h2>
|
|
1088
|
+
<p class="text-xs text-gray-500">
|
|
1089
|
+
{{ customer.email }} · {{ customer.country }}
|
|
1090
|
+
</p>
|
|
1091
|
+
</div>
|
|
1092
|
+
</header>
|
|
1093
|
+
|
|
1094
|
+
<!-- Stat strip. -->
|
|
1095
|
+
<div class="grid grid-cols-3 gap-2">
|
|
1096
|
+
<div class="rounded-[var(--bb-radius)] border p-2">
|
|
1097
|
+
<p class="text-xs text-gray-500">Total billed</p>
|
|
1098
|
+
<p class="font-semibold">{{ currency.format(customer.totalBilled) }}</p>
|
|
1099
|
+
</div>
|
|
1100
|
+
<div class="rounded-[var(--bb-radius)] border p-2">
|
|
1101
|
+
<p class="text-xs text-gray-500">Outstanding</p>
|
|
1102
|
+
<p class="font-semibold">{{ currency.format(customer.outstanding) }}</p>
|
|
1103
|
+
</div>
|
|
1104
|
+
<div class="rounded-[var(--bb-radius)] border p-2">
|
|
1105
|
+
<p class="text-xs text-gray-500">Invoices</p>
|
|
1106
|
+
<p class="font-semibold">{{ customer.invoiceCount }}</p>
|
|
1107
|
+
</div>
|
|
1108
|
+
</div>
|
|
1109
|
+
|
|
1110
|
+
<!-- Recent invoices: names drill down again — the stack keeps growing. -->
|
|
1111
|
+
<section class="flex flex-col gap-1.5">
|
|
1112
|
+
<h3 class="text-xs font-semibold uppercase tracking-wide text-gray-500">
|
|
1113
|
+
Recent invoices
|
|
1114
|
+
</h3>
|
|
1115
|
+
<ul class="flex flex-col">
|
|
1116
|
+
<li
|
|
1117
|
+
v-for="recent in customer.recentInvoices"
|
|
1118
|
+
:key="recent.id"
|
|
1119
|
+
class="flex items-center justify-between gap-2 border-b py-1.5 last:border-b-0"
|
|
1120
|
+
>
|
|
1121
|
+
<BbButton
|
|
1122
|
+
size="sm"
|
|
1123
|
+
variant="link"
|
|
1124
|
+
@click="() => ctx.stackInvoice(recent.id)"
|
|
1125
|
+
>
|
|
1126
|
+
{{ recent.number }}
|
|
1127
|
+
</BbButton>
|
|
1128
|
+
<BbBadge variant="outline">{{ recent.status }}</BbBadge>
|
|
1129
|
+
<span class="text-xs text-gray-500">{{
|
|
1130
|
+
currency.format(recent.amount)
|
|
1131
|
+
}}</span>
|
|
1132
|
+
</li>
|
|
1133
|
+
</ul>
|
|
1134
|
+
</section>
|
|
1135
|
+
|
|
1136
|
+
<footer class="mt-2 flex items-center gap-2 border-t pt-3">
|
|
1137
|
+
<BbButton
|
|
1138
|
+
append:icon="lucide:arrow-up-right"
|
|
1139
|
+
:href="`/customers/${customer.id}`"
|
|
1140
|
+
size="sm"
|
|
1141
|
+
variant="ghost"
|
|
1142
|
+
>
|
|
1143
|
+
Open customer
|
|
1144
|
+
</BbButton>
|
|
1145
|
+
</footer>
|
|
1146
|
+
</div>
|
|
1147
|
+
|
|
1148
|
+
<div v-else class="flex justify-center p-8">
|
|
1149
|
+
<BbSpinner />
|
|
1150
|
+
</div>
|
|
1151
|
+
</template>
|
|
1152
|
+
|
|
1153
|
+
<script setup lang="ts">
|
|
1154
|
+
import { BbAvatar, BbBadge, BbButton, BbSpinner } from 'bitboss-ui';
|
|
1155
|
+
import { useResourceContext } from '@/composables/useResourceContext';
|
|
1156
|
+
import { useInvoicesWorkspace } from './context';
|
|
1157
|
+
import type { CustomerDetail } from '@/types';
|
|
1158
|
+
|
|
1159
|
+
const props = defineProps<{ customerId: number }>();
|
|
1160
|
+
|
|
1161
|
+
const ctx = useInvoicesWorkspace();
|
|
1162
|
+
|
|
1163
|
+
const { data: customer } = useResourceContext<CustomerDetail, number>(
|
|
1164
|
+
() => props.customerId,
|
|
1165
|
+
(id) => fetch(`/customers/${id}/peek`).then((res) => res.json())
|
|
1166
|
+
);
|
|
1167
|
+
|
|
1168
|
+
const currency = new Intl.NumberFormat('en-US', {
|
|
1169
|
+
style: 'currency',
|
|
1170
|
+
currency: 'USD',
|
|
1171
|
+
});
|
|
1172
|
+
</script>
|
|
1173
|
+
```
|
|
1174
|
+
|
|
1175
|
+
### RecordPaymentDialog.vue
|
|
1176
|
+
|
|
1177
|
+
```vue
|
|
1178
|
+
<!-- InvoicesWorkspace/RecordPaymentDialog.vue -->
|
|
1179
|
+
<template>
|
|
1180
|
+
<BbDialog
|
|
1181
|
+
:model-value="invoice !== null"
|
|
1182
|
+
size="sm"
|
|
1183
|
+
:title="invoice ? `Record payment — ${invoice.number}` : ''"
|
|
1184
|
+
@update:model-value="close"
|
|
1185
|
+
>
|
|
1186
|
+
<form
|
|
1187
|
+
v-if="invoice"
|
|
1188
|
+
class="flex flex-col gap-3"
|
|
1189
|
+
novalidate
|
|
1190
|
+
@submit.prevent="submit"
|
|
1191
|
+
>
|
|
1192
|
+
<BbNumberInput
|
|
1193
|
+
v-model="draft.amount"
|
|
1194
|
+
label="Amount"
|
|
1195
|
+
label-mode="outside"
|
|
1196
|
+
:max-precision="2"
|
|
1197
|
+
:min="0"
|
|
1198
|
+
>
|
|
1199
|
+
<template #prefix>$</template>
|
|
1200
|
+
</BbNumberInput>
|
|
1201
|
+
<BbDatePickerInput
|
|
1202
|
+
v-model="draft.paidAt"
|
|
1203
|
+
label="Paid on"
|
|
1204
|
+
label-mode="outside"
|
|
1205
|
+
/>
|
|
1206
|
+
<BbSelect
|
|
1207
|
+
v-model="draft.method"
|
|
1208
|
+
:items="['bank transfer', 'card', 'check', 'cash']"
|
|
1209
|
+
label="Method"
|
|
1210
|
+
label-mode="outside"
|
|
1211
|
+
/>
|
|
1212
|
+
<div class="mt-1 flex justify-end gap-2">
|
|
1213
|
+
<BbButton type="button" variant="ghost" @click="close">Cancel</BbButton>
|
|
1214
|
+
<BbButton type="submit" variant="secondary">Record payment</BbButton>
|
|
1215
|
+
</div>
|
|
1216
|
+
</form>
|
|
1217
|
+
</BbDialog>
|
|
1218
|
+
</template>
|
|
1219
|
+
|
|
1220
|
+
<script setup lang="ts">
|
|
1221
|
+
import { computed, reactive, watch } from 'vue';
|
|
1222
|
+
import {
|
|
1223
|
+
BbButton,
|
|
1224
|
+
BbDatePickerInput,
|
|
1225
|
+
BbDialog,
|
|
1226
|
+
BbNumberInput,
|
|
1227
|
+
BbSelect,
|
|
1228
|
+
} from 'bitboss-ui';
|
|
1229
|
+
import { useInvoicesWorkspace } from './context';
|
|
1230
|
+
import type { PaymentDraft } from '@/types';
|
|
1231
|
+
|
|
1232
|
+
const ctx = useInvoicesWorkspace();
|
|
1233
|
+
|
|
1234
|
+
// The dialog's subject lives in the page context — any component on the
|
|
1235
|
+
// page (row actions, the peek) can open it by assigning the invoice.
|
|
1236
|
+
const invoice = computed(() => ctx.dialogs.recordPayment.value);
|
|
1237
|
+
const close = () => {
|
|
1238
|
+
ctx.dialogs.recordPayment.value = null;
|
|
1239
|
+
};
|
|
1240
|
+
|
|
1241
|
+
const draft = reactive<PaymentDraft>({
|
|
1242
|
+
amount: null,
|
|
1243
|
+
paidAt: null,
|
|
1244
|
+
method: null,
|
|
1245
|
+
});
|
|
1246
|
+
watch(invoice, (next) => {
|
|
1247
|
+
// Re-seed per invoice: default to paying the remaining balance today.
|
|
1248
|
+
draft.amount = next?.amountDue ?? null;
|
|
1249
|
+
draft.paidAt = next ? new Date().toISOString() : null;
|
|
1250
|
+
draft.method = null;
|
|
1251
|
+
});
|
|
1252
|
+
|
|
1253
|
+
// Returning the promise lets the submit button track the async work.
|
|
1254
|
+
const submit = () =>
|
|
1255
|
+
invoice.value ? ctx.recordPayment(invoice.value, { ...draft }) : undefined;
|
|
1256
|
+
</script>
|
|
1257
|
+
```
|
|
1258
|
+
|
|
1259
|
+
## Why it is built this way
|
|
1260
|
+
|
|
1261
|
+
- **The context coopts, leaves consume.** `shell` and the keyed
|
|
1262
|
+
`useTableContext('invoices')` are joined once in
|
|
1263
|
+
`provideInvoicesWorkspace()`; nine components share filters, selection,
|
|
1264
|
+
the peek stack and every action through one `useInvoicesWorkspace()`
|
|
1265
|
+
call. No component on this page receives a callback prop, and only
|
|
1266
|
+
peeks/cells receive data props (the item or id they render).
|
|
1267
|
+
- **`invoices` is a page prop, not a client fetch.** `useTableContext`
|
|
1268
|
+
turns the Laravel paginator into `items`/`totalItems`/`page`/`perPage`
|
|
1269
|
+
(URL-backed) plus `selected`/`unselected`/`all`; `BbTable` binds directly
|
|
1270
|
+
to that handle with `v-model`/`v-model:select-all`/`v-model:unselected-items`
|
|
1271
|
+
— there is no items function and no `dependencies` array, because the
|
|
1272
|
+
server already did the filtering, sorting and paging before the props
|
|
1273
|
+
arrived.
|
|
1274
|
+
- **One watcher for filters, one visit mechanism for tabs.**
|
|
1275
|
+
`useQueryObject(filters, { only: ['invoices', 'tabCounts'] })` is the
|
|
1276
|
+
entire filter-to-URL wiring; `BbTabs`' `href` + `server: true` items (with
|
|
1277
|
+
the required component-level `navigation`) make tab switches real,
|
|
1278
|
+
partial-reloaded visits with the same `only` list — one source of
|
|
1279
|
+
server truth, reached two ways.
|
|
1280
|
+
- **The `visit()` helper is the promise-wrapped router-visit pattern** the
|
|
1281
|
+
base's adaptation notes call for: it turns Inertia's
|
|
1282
|
+
`onSuccess`/`onError` callbacks into a promise so every context action
|
|
1283
|
+
(`updateStatus`, `duplicateInvoice`, the bulk actions, …) stays an
|
|
1284
|
+
`async function` — identical call sites to the Vue/Nuxt recipes,
|
|
1285
|
+
`await ctx.updateStatus(...)`.
|
|
1286
|
+
- **Bulk actions carry the full select-all-across-pages payload**
|
|
1287
|
+
(`ids`/`all`/`unselected`) so "select all, deselect three, archive" sends
|
|
1288
|
+
the same semantics the table itself models — never just an enumerated id
|
|
1289
|
+
list that silently drops rows outside the current page.
|
|
1290
|
+
- **Peeks are JSON fetches, not visits.** `useResourceContext` re-fetches
|
|
1291
|
+
on id change and exposes a `refresh()` the peek re-runs whenever
|
|
1292
|
+
`ctx.refreshKey` bumps (every mutation bumps it) — opening or updating a
|
|
1293
|
+
peek never re-renders the list page underneath it.
|
|
1294
|
+
- **`peekX` vs `stackX` is the whole stack grammar.** Fresh peeks replace,
|
|
1295
|
+
drill-downs push; the shell renders the back arrow when depth > 1. The
|
|
1296
|
+
grammar lives in the context — a leaf cannot accidentally nuke the
|
|
1297
|
+
stack.
|
|
1298
|
+
- **Dialogs hang off the context** (`ctx.dialogs.recordPayment` holds the
|
|
1299
|
+
subject invoice, not a boolean) so row actions and the peek open the
|
|
1300
|
+
same dialog with zero coordination.
|
|
1301
|
+
- **Sizing:** topbar and rail follow `md`-first (`compact` inputs at 28px
|
|
1302
|
+
flush beside the default buttons); `sm` appears exactly where the
|
|
1303
|
+
doctrine allows — row actions, pills, peek footers, the bulk bar.
|
|
1304
|
+
- **One `variant="primary"`** (New invoice). Destructive actions —
|
|
1305
|
+
single, bulk, in-peek — all ride `useConfirm`.
|
|
1306
|
+
- **The status badge tells you it saves.** `StatusCell` carries the §6.1
|
|
1307
|
+
niceties: an internal trailing chevron (a clickable status must say so)
|
|
1308
|
+
and `:loading` around the awaited context action, so the spinner takes
|
|
1309
|
+
the chevron's place while the save runs. The flag is a local `ref` —
|
|
1310
|
+
rung 1, not context state. The ownership grammar behind inline edits is
|
|
1311
|
+
the [Inline Edit Playbook](../../guides/inline-edit-playbook.md).
|
|
1312
|
+
|
|
1313
|
+
## Variations
|
|
1314
|
+
|
|
1315
|
+
- **Keyboard triage**: add `keyboard-navigation` to the table and open the
|
|
1316
|
+
peek from `v-model:highlighted` — the approvals-inbox recipe is the
|
|
1317
|
+
full treatment.
|
|
1318
|
+
- **Saved views**: persist `filters` + `tab` per user in a store
|
|
1319
|
+
(`useSavedViewsStore`) and render a view switcher before the tabs.
|
|
1320
|
+
- **Inline amount editing**: swap the amount cell for an
|
|
1321
|
+
`EditableAmountCell` per the inline-editing pattern. Choosing between
|
|
1322
|
+
explicit-commit cells and a fully autosaving grid is the
|
|
1323
|
+
[Inline Edit Playbook](../../guides/inline-edit-playbook.md); the
|
|
1324
|
+
autosave treatment is the inline-edit-workspace recipe.
|
|
1325
|
+
- **Lazy tab counts**: if `tabCounts` is expensive to compute, share it as
|
|
1326
|
+
`Inertia::lazy()` and read it with `useLazyProp` instead of a plain
|
|
1327
|
+
prop — the tab labels resolve once it lands instead of blocking the
|
|
1328
|
+
first render.
|