Skip to content

draft of BApp #2732

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 11 commits into
base: main
Choose a base branch
from
Open

draft of BApp #2732

wants to merge 11 commits into from

Conversation

xvaara
Copy link
Contributor

@xvaara xvaara commented Jun 6, 2025

BApp Component

The BApp component is the new recommended way to configure bootstrap-vue-next. It replaces the plugin-based approach and provides better defaults management and orchestrator integration.

Features

  • Defaults Management: Inject and merge component defaults throughout your application
  • Orchestrator Integration: Automatically includes Modal, Toast, and Popover orchestrators
  • Plugin Compatibility: Works alongside existing plugins for backward compatibility
  • Type Safety: Full TypeScript support with proper type inference
  • RTL Support: Built-in right-to-left language support
  • Flexible Teleporting: Control where orchestrators are rendered in the DOM

Basic Usage

<template>
  <BApp>
    <!-- Your application content -->
    <router-view />
  </BApp>
</template>

<script setup lang="ts">
import {BApp} from 'bootstrap-vue-next'
</script>

Configuration

Setting Component Defaults

<template>
  <BApp :defaults="appDefaults">
    <!-- Your application content -->
  </BApp>
</template>

<script setup lang="ts">
import {BApp} from 'bootstrap-vue-next'

const appDefaults = {
  BButton: {
    variant: 'primary',
    size: 'sm',
  },
  BModal: {
    centered: true,
    noCloseOnBackdrop: true,
  },
  BToast: {
    variant: 'success',
    solid: true,
  },
}
</script>

Advanced Defaults Configuration

<template>
  <BApp :defaults="appDefaults" :merge-defaults="true" :deep-merge="true">
    <!-- Your application content -->
  </BApp>
</template>

<script setup lang="ts">
import {BApp} from 'bootstrap-vue-next'

const appDefaults = {
  BButton: {
    variant: 'primary',
    size: 'sm',
  },
}
</script>

Orchestrator Configuration

<template>
  <BApp :teleport-to="'body'" :append-toast="true">
    <!-- Your application content -->
  </BApp>
</template>

Disabling Orchestrators

<template>
  <BApp :no-modals="true" :no-toasts="true" :no-popovers="true">
    <!-- Your application content -->
  </BApp>
</template>

RTL Configuration

<template>
  <BApp :rtl="rtlConfig">
    <!-- Your application content -->
  </BApp>
</template>

<script setup lang="ts">
import {BApp} from 'bootstrap-vue-next'

const rtlConfig = {
  rtlInitial: true,
  localeInitial: 'ar',
}
</script>

Migration from Plugins

Before (Plugin-based)

import {createApp} from 'vue'
import {createBootstrap} from 'bootstrap-vue-next'

const app = createApp(App)

app.use(
  createBootstrap({
    components: {
      BButton: {
        variant: 'primary',
      },
    },
  })
)

After (BApp-based)

<template>
  <BApp :defaults="{BButton: {variant: 'primary'}}">
    <App />
  </BApp>
</template>

<script setup lang="ts">
import {BApp} from 'bootstrap-vue-next'
import App from './App.vue'
</script>

Props

Prop Type Default Description
defaults Partial<BvnComponentProps> undefined Component defaults to apply globally
mergeDefaults boolean false Whether to merge with existing defaults
deepMerge boolean false Whether to perform deep merge of nested objects
teleportTo TeleportProps['to'] undefined Where to teleport the orchestrator container
noModals boolean false Whether to disable modal orchestrator
noToasts boolean false Whether to disable toast orchestrator
noPopovers boolean false Whether to disable popover orchestrator
noOrchestrator boolean false Whether to disable all orchestrators
appendToast boolean false Whether new toasts should be appended to the list
inhert boolean false Whether to inherit parent orchestrator controllers
rtl boolean | RTLConfig false RTL configuration object or boolean

RTL Configuration Object

interface RTLConfig {
  rtlInitial: boolean // Initial RTL state
  localeInitial?: string // Initial locale
}

Composables

When using BApp, the following composables work without requiring plugin installation:

  • useToastController() - Create and manage toasts programmatically
  • useModalController() - Create and manage modals programmatically
  • usePopoverController() - Create and manage popovers programmatically

Internal Features

The BApp component automatically provides several internal services:

  • Show/Hide Registry: Global registry for show/hide components
  • Modal Manager: Stack management for multiple modals
  • Breadcrumb Service: Global breadcrumb item management
  • RTL Service: Right-to-left text direction support

Default Merging Behavior

The component supports three modes for handling defaults:

  1. Replace Mode (default): defaults prop completely replaces any existing defaults
  2. Merge Mode (mergeDefaults: true): Shallow merge with existing defaults
  3. Deep Merge Mode (mergeDefaults: true, deepMerge: true): Deep merge nested objects

Teleporting

By default, orchestrators render inline. Use teleportTo to render them elsewhere:

<template>
  <BApp teleport-to="body">
    <!-- Orchestrators will render in document.body -->
  </BApp>
</template>

Backward Compatibility

The BApp component is fully backward compatible with existing plugin-based setups. You can gradually migrate by:

  1. Adding BApp to your root component
  2. Moving defaults from plugin configuration to BApp props
  3. Removing plugin installations once migration is complete

The plugins will show deprecation warnings but continue to work until removed in a future version.

Notes

  • Only one BApp or orchestrator should be active at a time per application
  • The component uses Vue's provide/inject system for dependency injection
  • All orchestrators are automatically teleported when teleportTo is specified
  • The component inherits all attributes and passes them to the default slot

PR checklist

What kind of change does this PR introduce? (check at least one)

  • Bugfix 🐛 - fix(...)
  • Feature - feat(...)
  • ARIA accessibility - fix(...)
  • Documentation update - docs(...)
  • Other (please describe)

The PR fulfills these requirements:

  • Pull request title and all commits follow the Conventional Commits convention or has an override in this pull request body This is very important, as the CHANGELOG is generated from these messages, and determines the next version type. Pull requests that do not follow conventional commits or do not have an override will be denied

Summary by CodeRabbit

  • New Features

    • Introduced a unified orchestrator system for managing modals, toasts, and popovers with new BApp and BOrchestrator components.
    • Added composables useModal, useToast, usePopover, useRoot, and useProvideDefaults for enhanced programmatic control and global defaults management.
    • Implemented promise-based APIs for dynamic creation, control, and lifecycle management of modals, toasts, and popovers.
  • Bug Fixes

    • Improved DOM operations safety by handling environments without a document object.
  • Documentation

    • Updated documentation and guides to reflect new orchestrator components and composable APIs, replacing deprecated controller-based methods.
    • Added detailed usage examples and migration instructions for the new APIs.
  • Refactor

    • Removed deprecated controller plugins and composables, consolidating overlay orchestration logic.
    • Simplified internal state and plugin management for overlays and global defaults.
  • Tests

    • Added new tests and updated existing ones to cover orchestrator components and composables.
  • Chores

    • Cleaned up legacy code, adjusted exports, and updated component imports to align with the new architecture.

Copy link

Review PR in StackBlitz Codeflow Run & review this pull request in StackBlitz Codeflow.

Copy link

coderabbitai bot commented Jun 6, 2025

## Walkthrough

This change refactors modal, toast, and popover orchestration in the codebase. It removes separate controller plugins and composables, introduces a unified orchestrator plugin and composables (`useModal`, `useToast`, `usePopover`), adds new orchestrator components, updates documentation and tests, and centralizes state management for overlays.

## Changes

| File(s)                                                                                                 | Change Summary                                                                                                                                                                                                                                       |
|---------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `.../BApp/BApp.vue`, `.../BApp/BOrchestrator.vue`, `.../BApp/index.ts`, `.../BApp/bapp.spec.ts`        | Added new `BApp` and `BOrchestrator` components for root-level orchestration, with tests and export.                                                                                                                                                |
| `.../BModal/BModalOrchestrator.vue`, `.../BPopover/BPopoverOrchestrator.vue`, `.../BToast/BToastOrchestrator.vue` | Refactored orchestrator components to delegate rendering and control to `BOrchestrator`, removing manual orchestration and adding deprecation warnings.                                                       |
| `.../src/composables/useModal/index.ts`, `.../src/composables/usePopover/index.ts`, `.../src/composables/useToast/index.ts` | Replaced controller composables with unified `useModal`, `usePopover`, and `useToast` composables, providing promise-based creation and lifecycle management.                                                |
| `.../src/composables/orchestratorShared.ts`, `.../src/composables/useProvideDefaults/index.ts`, `.../src/composables/useRoot.ts` | Added new composables for orchestrator registry, hierarchical defaults, and root-level state management.                                                                                                      |
| `.../src/plugins/orchestrator/index.ts`, `.../src/plugins/index.ts`, `.../src/plugins/createBootstrap/index.ts` | Added and registered a new orchestrator plugin, removing previous modal, toast, and popover controller plugins.                                                                                              |
| `.../src/types/ComponentOrchestratorTypes.ts`, `.../src/types/ComponentProps.ts`, `.../src/types/BootstrapVueOptions.ts` | Updated and unified orchestrator-related types, added new props and options for `BApp`, and updated composable and component path mappings.                                                                  |
| `.../src/utils/keys.ts`                                                                                 | Unified orchestrator injection keys, removing separate keys for modal, toast, and popover controllers.                                                                                                       |
| `.../src/composables/index.ts`, `.../src/components/index.ts`                                           | Updated exports to reflect new composables and components.                                                                                                                                                    |
| `.../src/plugins/showHide/index.ts`                                                                     | Refactored show/hide plugin to use centralized registry logic.                                                                                                                                                |
| `.../src/utils/getElement.ts`                                                                           | Improved environment safety for element selection utility.                                                                                                                                                    |
| `.../src/composables/useModalController/index.ts`, `.../src/composables/usePopoverController/index.ts`, `.../src/composables/useToastController/index.ts` | Deleted controller composables for modal, popover, and toast.                                                                                                          |
| `.../src/plugins/modalController/index.ts`, `.../src/plugins/popoverController/index.ts`, `.../src/plugins/toastController/index.ts` | Deleted controller plugins for modal, popover, and toast.                                                                                                              |
| `.../App.vue`, `.../main.ts`                                                                           | Updated root component and app setup to use new orchestrator and app components.                                                                                                                             |
| `.../src/docs/demo/ModalConfirm.vue`, `.../src/docs/demo/ModalMessageBox.vue`, `.../src/components/TableOfContentsNav.vue` | Updated demo and navigation components to use new composables and orchestrator store.                                                                                                                        |
| `.../src/docs/components/modal.md`, `.../src/docs/components/popover.md`, `.../src/docs/components/toast.md`, `.../src/docs/composables.md`, `.../src/docs/composables/useModal.md`, `.../src/docs/composables/usePopover.md`, `.../src/docs/composables/useToast.md`, `.../src/docs/migration-guide.md` | Updated documentation to reflect new APIs, composable names, and usage patterns.                                                                                       |
| `.../src/docs/composables/useModalController.md`                                                        | Deleted documentation for removed `useModalController` composable.                                                                                                                                            |
| `.../src/components/Comps/TModal.vue`, `.../src/components/Comps/TToast.vue`                           | Updated playground components to use new composables and orchestrator store.                                                                                                                                  |
| `.../src/components/BToast/toast-orchestrator.spec.ts`                                                 | Updated test assertions for toast orchestrator container class.                                                                                                                                                |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant App
    participant BApp
    participant BOrchestrator
    participant useModal/useToast/usePopover
    participant Store

    App->>BApp: Mount root component
    BApp->>BOrchestrator: Conditionally render orchestrator
    useModal/useToast/usePopover->>Store: create({props, slots, ...})
    Store->>BOrchestrator: Reactive updates (store array)
    BOrchestrator->>App: Render overlays (modal/toast/popover) via TransitionGroup
    App->>useModal/useToast/usePopover: Call control methods (show/hide/toggle/destroy)
    useModal/useToast/usePopover->>Store: Update store/reactivity
    BOrchestrator->>App: Emit events, resolve promises, handle lifecycle

Possibly related PRs

  • bootstrap-vue-next/bootstrap-vue-next#2425: Refactors modal, toast, and popover composables and orchestrators, unifying and simplifying APIs, and replacing controller plugins with a single orchestrator plugin and promise-based lifecycle management.

Suggested reviewers

  • dwgray
  • VividLemon

Poem

🐇✨
A hop, a leap, a modal toast—
Controllers gone, orchestration most!
With promises now, our overlays sing,
Unified composables—what joy they bring!
BApp and friends, a rabbit's delight,
Overlay harmony, code shining bright.
🥕


<!-- walkthrough_end -->
<!-- internal state start -->


<!-- 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= -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details open="true">
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=bootstrap-vue-next/bootstrap-vue-next&utm_content=2732):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Explain this complex logic.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai explain this code block.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and explain its main purpose.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->

@dwgray
Copy link
Member

dwgray commented Jun 6, 2025

@xvaara, I really like this for the core setup. It's what I would use in my app, given a choice between this and the current plugin.

The main question I have is about tree shaking. As @VividLemon mentioned previously, there is some segment of our user base that is quite concerned about the deployed size of BSVN. If we eventually deprecate the plugins and only allow this method of installation, do we effectively disable tree shaking?

@VividLemon
Copy link
Member

@xvaara, I really like this for the core setup. It's what I would use in my app, given a choice between this and the current plugin.

The main question I have is about tree shaking. As @VividLemon mentioned previously, there is some segment of our user base that is quite concerned about the deployed size of BSVN. If we eventually deprecate the plugins and only allow this method of installation, do we effectively disable tree shaking?

I think the best solution to this is to effectively give people the tools to build their own "bapp" and document how to do it well

@xvaara
Copy link
Contributor Author

xvaara commented Jun 10, 2025

The main question I have is about tree shaking. As @VividLemon mentioned previously, there is some segment of our user base that is quite concerned about the deployed size of BSVN. If we eventually deprecate the plugins and only allow this method of installation, do we effectively disable tree shaking?

@dwgray BApp or the orchestrators imports nothing complex, just keys and conditionalTeleport, so if the user doesn't import them or the composables there shouldn't be any extra components included.

@dwgray
Copy link
Member

dwgray commented Jun 16, 2025

The main question I have is about tree shaking. As @VividLemon mentioned previously, there is some segment of our user base that is quite concerned about the deployed size of BSVN. If we eventually deprecate the plugins and only allow this method of installation, do we effectively disable tree shaking?

@dwgray BApp or the orchestrators imports nothing complex, just keys and conditionalTeleport, so if the user doesn't import them or the composables there shouldn't be any extra components included.

@xvaara I've been thinking about this some more. If this doesn't significantly affect tree shaking, I am still a bit torn.

I'd very much prefer it if we land on one solution or the other, rather than maintaining both. @VividLemon 's suggestion of "give people the tools to build their own 'bapp' and document how to do it well" sounds appealing as a solution to only maintaining one implementation, but that really ends up being what I consider a scaffolding solution in one way or the other and moves the burden of managing changes over time on the user of the library (I wrote a Medium article on this a while back - just to show how frustrating I find it).

Advantages of BApp:

  • Easier initial use
  • More flexibility for us to modify how things work without forcing users to migrate/react to breaking changes (see above)
  • This looks like what Vuetify.js does, and I've found their decisions have generally been solid when I've dug into them

Advantages of Plugin:

  • Less churn for existing users
  • More granular control/Less abstraction
  • Feels less notional - enforcing the use of a top-level app moves us from a set of components that one can use to build a vue.js app, to a framework where we provide the top-level app and the developer fills in their details - this may just be a historical quirk from someone who's dealt with way too many variations on this issue over the years but I lean towards being less notional where we can.

Overall, that does land me on seeing if we can make BApp work, again assuming it doesn't affect tree shaking. I started digging into the mechanics of tree-shaking to convince myself that we would be safe, and quickly realized that this is one of those problems where I wouldn't be able to truly convince myself of the results without experimental evidence. I think it's probably good for us to be able to regression test tree shaking overall, since some part of our user base really cares about this (and others may care more if they dug into it).

My basic idea around this is to have a small project that we can build and establish baseline sizes to confirm that we've not changed the pay-to-play nature of the tree shaking. We should then be able to just change the target bsvn installation in the package.json file and rebuild to see how sizes are affected.

Here's the stats for a recent build without the BApp changes:

Simple Vue.js/Vite app using create vue@latest

vite v6.2.4 building for production...
✓ 26 modules transformed.
dist/index.html                  0.43 kB │ gzip:  0.28 kB
dist/assets/index-TXLObeWa.css   3.71 kB │ gzip:  1.19 kB
dist/assets/index-usgfJ6g8.js   69.64 kB │ gzip: 27.43 kB
✓ built in 865ms

Add bootstrap and BSVN

✓ 136 modules transformed.
dist/index.html                   0.43 kB │ gzip:  0.29 kB
dist/assets/index-BtuzhIq3.css  254.56 kB │ gzip: 34.92 kB
dist/assets/index-91SiXKPq.js    85.35 kB │ gzip: 31.81 kB
✓ built in 1.82s

Add a reference to BLink

vite v6.2.4 building for production...
✓ 136 modules transformed.
dist/index.html                   0.43 kB │ gzip:  0.29 kB
dist/assets/index-BRDhJoMO.css  254.56 kB │ gzip: 34.92 kB
dist/assets/index-CMzBWzqN.js    92.56 kB │ gzip: 34.24 kB
✓ built in 1.50s

Add a reference to BAvatar

vite v6.2.4 building for production...
✓ 136 modules transformed.
dist/index.html                   0.43 kB │ gzip:  0.28 kB
dist/assets/index-vRN9tOtg.css  254.56 kB │ gzip: 34.92 kB
dist/assets/index-r0dbNEhh.js   101.61 kB │ gzip: 36.74 kB
✓ built in 1.58s

Overall, these seem like reasonable results and show that adding references to new components increases the size of the packet (presumably more than the reference). I also did a bit of digging into the generated files to prove to myself that there weren't references to BLink or BAvatar in the generated results until I added them in my app.

The place where I stalled out is that I wasn't able to change the reference to BSVN to @xvaara's BApp branch. I think that's because it doesn't build? But it may be because I don't have the syntax right. Here's what I tried:

    "bootstrap-vue-next": "bootstrap-vue-next/bootstrap-vue-next#bapp-composables-makeover",

I've pushed the project up to https://github.com/[dwgray/bsvn-tree-shake](https://github.com/dwgray/bsvn-tree-shake) - let me know if you think this is a reasonable way to approach confirming our tree-shaking (and that we don't degrade it with features like this) @xvaara and @VividLemon and if I should add other features to test (I'm thinking BModal or something that requires an orchestrator would be a good next step).

P.S. Looks like I accidentally wrote over your comment rather than replying to it - I think I managed to restore the original comment, but that's why it's tagged as edited by me...

@xvaara xvaara marked this pull request as ready for review June 18, 2025 09:44
@xvaara xvaara marked this pull request as draft June 18, 2025 09:47
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 12

🔭 Outside diff range comments (2)
packages/bootstrap-vue-next/src/components/BToast/BToastOrchestrator.vue (1)

5-8: :key attribute is empty – breaks list-diffing

v-for="(value, key) in positionClasses" requires a proper key binding:

- :key
+ :key="key"

Without this, Vue cannot uniquely identify the containers, which may cause rendering glitches and warnings.

packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (1)

63-75: PromiseWithPopover methods are not chainable like the others

hide, toggle, and set return void, whereas every other promise interface returns PromiseWith*, enabling await ctrl.hide().show() patterns.

Align for consistency:

-  hide: (trigger?: string) => void
-  toggle: () => void
-  set: (val: Partial<...>) => void
+  hide: (trigger?: string) => PromiseWithPopover
+  toggle: () => PromiseWithPopover
+  set: (val: Partial<...>) => PromiseWithPopover

Breaking this contract will surface as type errors in user code.

♻️ Duplicate comments (4)
packages/bootstrap-vue-next/src/composables/useModalController/index.ts (2)

52-63: Extract duplicate component and slot assignment logic.

Similar to the popover controller, this logic is duplicated and should be extracted.


132-132: Document the purpose of the true parameter in onScopeDispose.

Same as in usePopoverController, the second parameter needs documentation.

packages/bootstrap-vue-next/src/composables/useToastController/index.ts (2)

103-103: Remove unnecessary semicolon prefix.

Same issue as in useModalController.


44-55: Extract duplicate component and slot assignment logic.

This is the third occurrence of the same pattern. Should be extracted into a shared utility.

Consider creating a shared utility function in the composables/shared.ts file to handle this common pattern across all controllers.

🧹 Nitpick comments (17)
packages/bootstrap-vue-next/src/components/BApp/index.ts (1)

1-1: Nit: also re-export the props type for DX.

Most components in the lib expose their prop types, e.g. export type {BAlertProps}. Consider:

 export {default as BApp} from './BApp.vue'
+export type {BAppProps} from '../../types/ComponentProps'

Keeps IDE-intellisense symmetrical with the rest of the API.

packages/bootstrap-vue-next/src/components/BModal/BModalOrchestrator.vue (1)

6-8: Move heavy inline destructuring into a computed for readability/performance.

Repeatedly doing the destructure + null-coalescing inside the template re-executes on every render. A tiny computed keeps the template clean and avoids reallocations:

-import {useModalController} from '../../composables/useModalController'
+import {useModalController} from '../../composables/useModalController'
+import {computed} from 'vue'
 ...
-        v-for="{_self, component: _component, promise, options, slots, ...val} in tools.modals
-          ?.value ?? []"
+        v-for="{_self, component: _component, promise, options, slots, ...val} in displayModals"
 ...
-const tools = useModalController()
+const tools = useModalController()
+const displayModals = computed(() => tools.modals.value ?? [])
apps/docs/src/docs/demo/ModalConfirm.vue (1)

9-14: Docs demo: stringify event for nicer output?

When confirmResult is a BvTriggerableEvent, the page now prints [object Object]. For the docs you might want to JSON.stringify it or show a subset (e.ok, e.trigger) so readers aren’t confused.

Not blocking, just polish for the demo.

packages/bootstrap-vue-next/src/components/BToast/BToastOrchestrator.vue (1)

95-101: Minor: wording in duplicate-orchestrator warning

Consider s/“Or”/“or” and clarify component names for readability:

- 'BToastOrchestrator Or BApp is already installed, only one can be installed at a time'
+ 'BToastOrchestrator or BApp is already installed – only one instance should be active.'
packages/bootstrap-vue-next/src/plugins/modalController/index.ts (1)

5-14: Optional: add duplicate-install protection

For symmetry with toast/popover plugins, consider guarding against multiple installations by toggling _isOrchestratorInstalled and warning if already true.

packages/bootstrap-vue-next/src/components/BApp/bapp.spec.ts (1)

83-94: Synchronise with teleport mount

Teleport rendering happens on the next micro-task.
Add a await wrapper.vm.$nextTick() before the assertions to avoid a race where ConditionalTeleport hasn’t mounted yet in CI.

packages/bootstrap-vue-next/src/types/ComponentProps.ts (1)

77-78: teleportTo typing is too narrow

TeleportProps['to'] is string | RendererElement | null.
Users often pass a CSS selector function or HTMLElement | null. Consider widening to string | Element | null to avoid external RendererElement import bleed-through.

packages/bootstrap-vue-next/src/components/BPopover/BPopoverOrchestrator.vue (1)

38-44: Use a one-time warning util

console.warn will spam every orchestrator attempt after the first.
Wrap with a warnOnce utility or set a dev-only flag to keep logs clean.

packages/bootstrap-vue-next/src/plugins/popoverController/index.ts (1)

7-13: Consider exposing a destroy/reset API

_isOrchestratorInstalled is set but never cleared, making HMR or micro-frontend teardown impossible.
Providing a reset() that flips the ref and empties popovers would improve DX during dev-server hot reloads.

packages/bootstrap-vue-next/src/composables/shared.ts (1)

58-72: set() leaks reactive unwrap on large objects

toValue(val) is shallow; nested refs inside val stay reactive and will be duplicated into store, risking reactive cross-links.
A deep unwrap (e.g. toRaw or structuredClone) before splice would avoid accidental vue-reactivity sharing between orchestrator state and caller data.

packages/bootstrap-vue-next/src/components/BApp/BAppOrchestrator.vue (1)

137-137: Remove commented console.log statement.

Commented debugging code should be removed before committing.

-  // console.log(classes)
packages/bootstrap-vue-next/src/composables/usePopoverController/index.ts (3)

56-71: Extract duplicate component and slot assignment logic.

The logic for assigning component and slots with markRaw is repeated. Consider extracting this into helper functions.

+const setComponent = (
+  obj: any,
+  component: any,
+  defaultComponent: typeof BPopover | typeof BTooltip
+) => {
+  const comp = component || defaultComponent
+  if (isRef(obj)) {
+    obj.value.component = markRaw(comp)
+  } else if (typeof obj === 'object') {
+    obj.component = markRaw(comp)
+  }
+}
+
+const setSlots = (obj: any, slots: any) => {
+  if (!slots) return
+  if (isRef(obj)) {
+    obj.value.slots = markRaw(slots)
+  } else if (typeof obj === 'object') {
+    obj.slots = markRaw(slots)
+  }
+}

-    if (component) {
-      if (isRef(obj)) obj.value.component = markRaw(component)
-      else if (typeof obj === 'object') obj.component = markRaw(component)
-    } else {
-      if (tooltip) {
-        if (isRef(obj)) obj.value.component = markRaw(BTooltip)
-        else if (typeof obj === 'object') obj.component = markRaw(BTooltip)
-      } else {
-        if (isRef(obj)) obj.value.component = markRaw(BPopover)
-        else if (typeof obj === 'object') obj.component = markRaw(BPopover)
-      }
-    }
-    if (slots) {
-      if (isRef(obj)) obj.value.slots = markRaw(slots)
-      else if (typeof obj === 'object') obj.slots = markRaw(slots)
-    }
+    setComponent(obj, component, tooltip ? BTooltip : BPopover)
+    setSlots(obj, slots)

87-87: Remove commented code.

Commented code should be removed to maintain code cleanliness.

-        // if (!previous) return

42-144: Consider breaking down the large create function.

The create function is 100+ lines long with complex logic. Consider extracting some of the logic into smaller, focused functions for better maintainability.

Consider extracting:

  1. Props resolution and normalization logic
  2. Watcher setup logic
  3. Array manipulation logic

This would improve readability and testability.

packages/bootstrap-vue-next/src/composables/useModalController/index.ts (1)

108-108: Remove unnecessary semicolon prefix.

The semicolon prefix suggests a potential ASI issue. With proper code formatting, this shouldn't be necessary.

-            ;(modelValue as Ref<ModalOrchestratorMapValue['modelValue']>).value = val
+            (modelValue as Ref<ModalOrchestratorMapValue['modelValue']>).value = val
packages/bootstrap-vue-next/src/composables/useToastController/index.ts (1)

114-121: Simplify the append logic using nullish coalescing.

The nested ternary for appendToast can be simplified.

-          if (
-            resolvedProps.value?.appendToast !== undefined
-              ? resolvedProps.value.appendToast
-              : _isAppend.value
-          ) {
+          const shouldAppend = resolvedProps.value?.appendToast ?? _isAppend.value
+          if (shouldAppend) {
packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (1)

328-337: Duplicate option type declarations

ModalOrchestratorCreateOptions and the generic OrchestratorCreateOptions share identical structure.
Prefer a single exported alias to avoid drift:

export type OrchestratorCreateOptions = {
  keep?: boolean
  resolveOnHide?: boolean
  /** @deprecated */
  returnBoolean?: boolean
}

export type ModalOrchestratorCreateOptions = OrchestratorCreateOptions

Keeps typings DRY and maintenance-friendly.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 377491b and c64f48b.

📒 Files selected for processing (23)
  • apps/docs/src/docs/demo/ModalConfirm.vue (1 hunks)
  • apps/docs/src/docs/demo/ModalMessageBox.vue (1 hunks)
  • packages/bootstrap-vue-next/src/App.vue (1 hunks)
  • packages/bootstrap-vue-next/src/components/BApp/BApp.vue (1 hunks)
  • packages/bootstrap-vue-next/src/components/BApp/BAppOrchestrator.vue (1 hunks)
  • packages/bootstrap-vue-next/src/components/BApp/bapp.spec.ts (1 hunks)
  • packages/bootstrap-vue-next/src/components/BApp/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/components/BModal/BModalOrchestrator.vue (2 hunks)
  • packages/bootstrap-vue-next/src/components/BPopover/BPopoverOrchestrator.vue (2 hunks)
  • packages/bootstrap-vue-next/src/components/BToast/BToastOrchestrator.vue (4 hunks)
  • packages/bootstrap-vue-next/src/components/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/composables/shared.ts (1 hunks)
  • packages/bootstrap-vue-next/src/composables/useModalController/index.ts (4 hunks)
  • packages/bootstrap-vue-next/src/composables/usePopoverController/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/composables/useToastController/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/main.ts (0 hunks)
  • packages/bootstrap-vue-next/src/plugins/modalController/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/plugins/popoverController/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/plugins/toastController/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/types/BootstrapVueOptions.ts (2 hunks)
  • packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (7 hunks)
  • packages/bootstrap-vue-next/src/types/ComponentProps.ts (2 hunks)
  • packages/bootstrap-vue-next/src/utils/keys.ts (2 hunks)
💤 Files with no reviewable changes (1)
  • packages/bootstrap-vue-next/src/main.ts
🧰 Additional context used
🧠 Learnings (3)
packages/bootstrap-vue-next/src/composables/usePopoverController/index.ts (1)
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
packages/bootstrap-vue-next/src/components/BApp/BAppOrchestrator.vue (1)
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (1)
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
🧬 Code Graph Analysis (4)
packages/bootstrap-vue-next/src/types/BootstrapVueOptions.ts (2)
packages/bootstrap-vue-next/src/types/Props.ts (1)
  • ComponentProps (9-11)
packages/bootstrap-vue-next/src/types/ComponentProps.ts (1)
  • BAppProps (73-96)
packages/bootstrap-vue-next/src/composables/shared.ts (2)
packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (7)
  • ToastOrchestratorArrayValue (83-118)
  • ModalOrchestratorArrayValue (267-284)
  • PopoverOrchestratorArrayValue (214-232)
  • TooltipOrchestratorArrayValue (163-180)
  • ControllerKey (12-12)
  • PromiseWithComponent (14-16)
  • PromiseWithComponentInternal (17-26)
packages/bootstrap-vue-next/src/utils/classes.ts (1)
  • BvTriggerableEvent (68-90)
packages/bootstrap-vue-next/src/types/ComponentProps.ts (2)
packages/bootstrap-vue-next/src/types/BootstrapVueOptions.ts (1)
  • BvnComponentProps (305-307)
packages/bootstrap-vue-next/src/types/index.ts (1)
  • BvnComponentProps (39-39)
packages/bootstrap-vue-next/src/utils/keys.ts (1)
packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (2)
  • ModalOrchestratorArrayValue (267-284)
  • PopoverOrchestratorArrayValue (214-232)
🔇 Additional comments (10)
packages/bootstrap-vue-next/src/components/index.ts (1)

3-3: Export looks good – verify side-effects for tree-shaking.

Nothing blocking here, but remember that star-re-exports can accidentally keep side-effectful code in the bundle. BApp itself pulls in orchestrators ‑ make sure they are only instantiated when the component is rendered, not when it is merely imported, so that unused apps can still be tree-shaken.

packages/bootstrap-vue-next/src/App.vue (1)

2-8: Sample dev wrapper is fine – ensure only one BApp in the real app.

BApp already flips the _isOrchestratorInstalled flag; adding any standalone orchestrator in addition to this top-level wrapper will now log a warning. Just double-check the documentation / boilerplate so integrators don’t accidentally mount a second orchestrator in tests or storybook.

packages/bootstrap-vue-next/src/types/BootstrapVueOptions.ts (1)

20-21: BApp mapping looks good

Entries are alphabetically placed and the props mapping points to ComponentProps.BAppProps, so nothing further to do here.

Also applies to: 198-202

apps/docs/src/docs/demo/ModalMessageBox.vue (1)

9-15: Import & result-type update LGTM

The broader union correctly matches the new promise return type.

packages/bootstrap-vue-next/src/plugins/toastController/index.ts (1)

11-15: State provisioning looks correct

Reactive flags and array are exposed consistently with new composable logic.

packages/bootstrap-vue-next/src/components/BApp/bapp.spec.ts (1)

22-23: ```shell
#!/bin/bash

Locate BAppOrchestrator.vue and inspect its component definition

file=$(fd BAppOrchestrator.vue)
echo "Located file: $file"
echo "--- Checking for <script setup> ---"
grep -R "<script setup" "$file" || echo "No <script setup> tag found"
echo "--- Checking for explicit name option ---"
grep -R "name\s*:" "$file" || echo "No explicit name option found"


</details>
<details>
<summary>packages/bootstrap-vue-next/src/types/ComponentProps.ts (1)</summary>

`73-84`: **Prop naming inconsistency: `inherit` vs. docs**

The docs/PR description use `inhert`, while the interface introduces `inherit`.  
Please align the prop name across code, docs and demos to avoid runtime warnings (`extra prop` vs. `missing prop`).

</details>
<details>
<summary>packages/bootstrap-vue-next/src/components/BApp/BAppOrchestrator.vue (1)</summary>

`117-125`: **Add null check for toastController in the watcher.**

The watcher assumes `toastController` exists when setting `_isAppend.value`, but it could be undefined if the plugin is not provided.

```diff
watch(
  () => props.appendToast,
  (value) => {
-   if (toastController) {
+   if (toastController && value !== undefined) {
      toastController._isAppend.value = value
    }
  },
  {immediate: true}
)

Likely an incorrect or invalid review comment.

packages/bootstrap-vue-next/src/composables/usePopoverController/index.ts (1)

141-141: Document the purpose of the true parameter in onScopeDispose.

The second parameter true to onScopeDispose is unusual. Please add a comment explaining its purpose.

Vue 3 onScopeDispose second parameter true meaning
packages/bootstrap-vue-next/src/utils/keys.ts (1)

213-227: Clean architectural refactor of orchestrator state management.

The shift from Map-based to array-based state management and removal of methods from plugin interfaces creates a cleaner separation of concerns. The consistent pattern across toast, modal, and popover controllers improves maintainability.

Copy link

pkg-pr-new bot commented Jun 18, 2025

bsvn-vite-ts

npm i https://pkg.pr.new/bootstrap-vue-next/bootstrap-vue-next@2732
npm i https://pkg.pr.new/bootstrap-vue-next/bootstrap-vue-next/@bootstrap-vue-next/nuxt@2732

commit: 5b8d1c2

@xvaara
Copy link
Contributor Author

xvaara commented Jun 18, 2025

@dwgray you can use the pr.new packages now. I've never gotten the direct git+npm to work on this project.

I think the best solution to this is to effectively give people the tools to build their own "bapp" and document how to do it well

@VividLemon
So document the default provide?:

import { defaultsKey, type BvnComponentProps} from 'bootstrap-vue-next'
provide(defaultsKey, ref({BPopover: {bodyClass: 'primary'}}) as Ref<Partial<BvnComponentProps>>)

Or what do you mean by tools? Composable that creates the registries?

This was just a quick hack to see how it goes, of course we would create one place to keep the implementation. I even started to merge the registries to one, but didn't finish that yet.

@dwgray
Copy link
Member

dwgray commented Jun 18, 2025

@dwgray you can use the pr.new packages now. I've never gotten the direct git+npm to work on this project.

Thanks @xvaara! This looks great. I just rebuilt the "final" version of my test app which references just BLink and BAvatar and the BApp version is actually smaller.

BLink & BAvatar BSVN 0.30.3

✓ 137 modules transformed.
dist/index.html                   0.43 kB │ gzip:  0.28 kB
dist/assets/index-BatG3cbY.css  255.44 kB │ gzip: 35.16 kB
dist/assets/index-CQTmLpcJ.js   101.59 kB │ gzip: 36.74 kB
✓ built in 1.83s

BLink & BAvatar BSVN 0.30.3 BApp Branch

✓ 142 modules transformed.
dist/index.html                   0.43 kB │ gzip:  0.28 kB
dist/assets/index-BatG3cbY.css  255.44 kB │ gzip: 35.16 kB
dist/assets/index-afQ1bg1x.js    94.82 kB │ gzip: 34.96 kB
✓ built in 1.97s

I also checked that the code actually ran (I've been bitten more times than I care to mention by being excited about a performance improvement just to find that the code didn't actually work).

So I don't think this is contributes to the BApp vs. Plugin discussion. I do think it's probably worth keeping an eye on this as we move forward and I'm happpy to take point on that. For that project, I think it's worth tracking something more complext that currently uses the plugin/orchestrator model. Do you or @VividLemon have an opion on that? And if so if there is a best candidate? Maybe BPopover or BModal?

I may also look into tooling to be able to visualize tree shaking results - I think I saw a reference there, but if either of you has any experience with that, I'd be interested in a link.

I don't think I'm going to take the time to try to automate this (I have a significant amount of experience with automated performance testing, and it's generally been a nightmare), so I'm thinking in terms of periodic sniff testing to check that we haven't done something to totally break tree-shaking.

@dwgray
Copy link
Member

dwgray commented Jun 18, 2025

Or what do you mean by tools? Composable that creates the registries?

I don't know if this is what @VividLemon was thinking, but I read that as doing something like making it easy to create a project from scratch ala pnpm create bootstrap-vue-next or providing templates. That's what lead me down the ramble about scaffolding code. Based on the work that I recently did with the group of students, I think it might be worthwhile to do something like that in any case - I, at least, have been focused on supporting migrating users, but it is probably worth smoothing the path for new adopters as we get closer to a v1...

@VividLemon
Copy link
Member

Or what do you mean by tools? Composable that creates the registries?

Yes, simply this and a small demo on how to do it.

@VividLemon
Copy link
Member

I think there are better things to test than performance. Just keep the bundle size low and we should be ok

@bootstrap-vue-next bootstrap-vue-next deleted a comment from coderabbitai bot Jun 19, 2025
@xvaara
Copy link
Contributor Author

xvaara commented Jul 1, 2025

@coderabbitai full review

Copy link

coderabbitai bot commented Jul 1, 2025

✅ Actions performed

Full review triggered.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 13

🔭 Outside diff range comments (1)
packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (1)

290-305: Eliminate code duplication and fix comment formatting.

The OrchestratorCreateOptions type is identical to ModalOrchestratorCreateOptions. Also, the deprecated comment uses inconsistent formatting.

Apply this diff to eliminate duplication:

-export type ModalOrchestratorCreateOptions = {
-  keep?: boolean
-  resolveOnHide?: boolean
-  /*
-   * @deprecated
-   */
-  returnBoolean?: boolean
-}
 export type OrchestratorCreateOptions = {
   keep?: boolean
   resolveOnHide?: boolean
-  /*
+  /**
    * @deprecated
    */
   returnBoolean?: boolean
 }
+
+export type ModalOrchestratorCreateOptions = OrchestratorCreateOptions
🧹 Nitpick comments (15)
packages/bootstrap-vue-next/src/utils/getElement.ts (1)

3-13: Respect root when resolving by id

Nice SSR-safe guard!
However, the branch that handles a string selector still hard-codes document.getElementById(...), ignoring the root argument when it happens to be a Document (e.g. in unit tests with JSDOM or inside an <iframe>).

const idElement = document.getElementById(element)

Consider using the supplied root first and falling back to the global document only when root is not a Document:

-const idElement = document.getElementById(element)
+const doc = (root as Document | undefined) ?? SAFE_DOCUMENT
+const idElement = doc?.getElementById?.(element) ?? undefined

This keeps the new SSR safety while also making root fully honoured and avoids cross-context surprises.

packages/bootstrap-vue-next/src/plugins/createBootstrap/index.ts (1)

16-16: Consider simplifying boolean comparisons for better readability.

The current pattern pluginData.property ?? true === true works but could be simplified for better readability.

Consider this refactor:

-    if (pluginData.breadcrumb ?? true === true) {
+    if (pluginData.breadcrumb !== false) {
-    if (pluginData.modalManager ?? true === true) {
+    if (pluginData.modalManager !== false) {
-    if (pluginData.orchestrator ?? true === true) {
+    if (pluginData.orchestrator !== false) {
-    if (pluginData.showHide ?? true === true) {
+    if (pluginData.showHide !== false) {

This makes the intent clearer (enabled by default unless explicitly disabled) and resolves the static analysis warnings.

Also applies to: 19-19, 22-22, 25-25, 28-28

packages/bootstrap-vue-next/src/components/BModal/BModalOrchestrator.vue (1)

30-32: Drop console.warn or silence ESLint.

no-console lint rule is tripped here.
Either remove the debug message or wrap it:

/* eslint-disable-next-line no-console */
if (__DEV__) console.warn('BModalOrchestrator is deprecated, use BOrchestrator instead')
packages/bootstrap-vue-next/src/components/BApp/bapp.spec.ts (2)

22-23: Use component reference instead of name string in tests.

Relying on findComponent({name: 'BOrchestrator'}) breaks if name changes or is tree-shaken. Prefer:

import BOrchestrator from '../BOrchestrator.vue'
...
wrapper.findComponent(BOrchestrator)

15-17: Avoid generic div selector.

wrapper.find('div') will match the first <div> which may change with minor template tweaks.
Select with a test id or the slot content instead to keep the test stable.

packages/bootstrap-vue-next/src/components/BToast/BToastOrchestrator.vue (1)

33-35: Consider wrapping the deprecation warning in a check for SSR environment.

The deprecation warning is appropriate, but it should also check for server-side rendering to avoid console pollution during SSR.

-if (process.env.NODE_ENV === 'development') {
-  console.warn('BToastOrchestrator is deprecated, use BOrchestrator instead')
-}
+if (process.env.NODE_ENV === 'development' && typeof window !== 'undefined') {
+  console.warn('BToastOrchestrator is deprecated, use BOrchestrator instead')
+}
packages/bootstrap-vue-next/src/composables/useToast/index.ts (1)

103-103: Simplify the type casting for modelValue ref update.

The explicit type casting can be simplified as TypeScript should be able to infer the correct type.

-            ;(modelValue as Ref<ToastOrchestratorArrayValue['modelValue']>).value = val
+            modelValue.value = val
packages/bootstrap-vue-next/src/composables/usePopover/index.ts (1)

57-57: Use a more descriptive Symbol identifier

The generic Symbol name makes debugging harder. Include the component type for better identification.

-const _self = resolvedProps.value?.id || Symbol('Popover controller')
+const _self = resolvedProps.value?.id || Symbol(`${tooltip ? 'Tooltip' : 'Popover'} controller`)
packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue (3)

71-74: Use type-only imports for better tree-shaking.

Import types explicitly using the type keyword to ensure they are removed during compilation and don't affect bundle size.

-import type {BvTriggerableEvent} from '../../utils'
-import type {OrchestratorArrayValue} from '../../types/ComponentOrchestratorTypes'
+import type {BvTriggerableEvent} from '../../utils'
+import type {OrchestratorArrayValue} from '../../types/ComponentOrchestratorTypes'

Wait, these are already type imports. Let me suggest importing all types together:

-import {type ComponentPublicInstance, computed, inject, watch} from 'vue'
+import {computed, inject, watch} from 'vue'
+import type {ComponentPublicInstance} from 'vue'

125-125: Remove commented debugging code.

Clean up the commented console.log statement.

-  // console.log(classes)

137-143: Optimize filter chain for better performance.

Combine multiple filter operations into a single filter to avoid creating intermediate arrays.

 const items = computed(() =>
   orchestratorRegistry?.store.value
-    .filter((el) => !props.noPopovers || el.type !== 'popover')
-    .filter((el) => !props.noToasts || el.type !== 'toast')
-    .filter((el) => !props.noModals || el.type !== 'modal')
-    .filter(props.filter)
+    .filter((el) => {
+      if (props.noPopovers && el.type === 'popover') return false
+      if (props.noToasts && el.type === 'toast') return false
+      if (props.noModals && el.type === 'modal') return false
+      return props.filter(el)
+    })
 )
packages/bootstrap-vue-next/src/composables/useRoot.ts (2)

134-136: Remove commented code.

Clean up the commented delete statement.

     return {
       unregister() {
-        // delete values.value[id]
         values.value.delete(id)
       },

23-108: Consider refactoring for better separation of concerns.

The useRoot function currently handles setup for multiple independent features. Consider breaking it down into smaller, focused functions for better maintainability and testability.

Consider this approach:

  1. Create separate setup functions for each feature (orchestrator, showHide, modalManager, breadcrumb, rtl)
  2. Call these functions from useRoot based on the configuration
  3. This would make the code more modular and easier to test individually

Example structure:

const setupOrchestrator = (inherit: boolean) => { /* ... */ }
const setupShowHide = () => { /* ... */ }
const setupModalManager = () => { /* ... */ }
// etc.

export const useRoot = (
  noOrchestrator: BAppProps['noOrchestrator'] = false,
  inherit: BAppProps['inherit'] = true,
  rtl: BAppProps['rtl'] = false
) => {
  if (!noOrchestrator) setupOrchestrator(inherit)
  setupShowHide()
  setupModalManager()
  // etc.
}
apps/docs/src/docs/composables/useModal.md (2)

13-13: Fix grammar issues in documentation.

Several grammar corrections needed for clarity.

-You must have initialized `BModalOrchestrator` component once and only once (doing multiple may display multiple `Modals`). This is usually best placed at the App root.
+You must initialize the `BModalOrchestrator` component once and only once (initializing multiple instances may display duplicate modals). This is usually best placed at the App root.

102-102: Additional grammar corrections needed.

Fix these grammar issues for better readability.

Line 102:

-Using props can work for most situations, but it leaves some finer control to be desired. For instance, you can not add HTML to any slot value.
+Using props can work for most situations, but it leaves some finer control to be desired. For instance, you cannot add HTML to any slot value.

Line 151:

-using the option 'resolveOnHide' the second argument of the `create` method will resolve the promise at time of hiding the modal
+using the option 'resolveOnHide' the second argument of the `create` method will resolve the promise at the time of hiding the modal

Line 191:

-By default the modal is destroyed once it's closed. If you want to keep the modal use the option 'keep'
+By default the modal is destroyed once it's closed. If you want to keep the modal, use the option 'keep'

Also applies to: 151-151, 191-191

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 67be644 and 7a29874.

📒 Files selected for processing (47)
  • apps/docs/src/components/TableOfContentsNav.vue (1 hunks)
  • apps/docs/src/docs/components/modal.md (1 hunks)
  • apps/docs/src/docs/components/popover.md (2 hunks)
  • apps/docs/src/docs/components/toast.md (7 hunks)
  • apps/docs/src/docs/composables.md (1 hunks)
  • apps/docs/src/docs/composables/useModal.md (1 hunks)
  • apps/docs/src/docs/composables/useModalController.md (0 hunks)
  • apps/docs/src/docs/composables/usePopover.md (6 hunks)
  • apps/docs/src/docs/composables/useToast.md (8 hunks)
  • apps/docs/src/docs/demo/ModalConfirm.vue (1 hunks)
  • apps/docs/src/docs/demo/ModalMessageBox.vue (1 hunks)
  • apps/docs/src/docs/migration-guide.md (2 hunks)
  • apps/playground/src/components/Comps/TModal.vue (2 hunks)
  • apps/playground/src/components/Comps/TToast.vue (3 hunks)
  • packages/bootstrap-vue-next/src/App.vue (1 hunks)
  • packages/bootstrap-vue-next/src/components/BApp/BApp.vue (1 hunks)
  • packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue (1 hunks)
  • packages/bootstrap-vue-next/src/components/BApp/bapp.spec.ts (1 hunks)
  • packages/bootstrap-vue-next/src/components/BApp/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/components/BModal/BModalOrchestrator.vue (2 hunks)
  • packages/bootstrap-vue-next/src/components/BPopover/BPopoverOrchestrator.vue (1 hunks)
  • packages/bootstrap-vue-next/src/components/BToast/BToastOrchestrator.vue (2 hunks)
  • packages/bootstrap-vue-next/src/components/BToast/toast-orchestrator.spec.ts (1 hunks)
  • packages/bootstrap-vue-next/src/components/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/composables/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/composables/orchestratorShared.ts (1 hunks)
  • packages/bootstrap-vue-next/src/composables/useModal/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/composables/useModalController/index.ts (0 hunks)
  • packages/bootstrap-vue-next/src/composables/usePopover/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/composables/usePopoverController/index.ts (0 hunks)
  • packages/bootstrap-vue-next/src/composables/useProvideDefaults/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/composables/useRoot.ts (1 hunks)
  • packages/bootstrap-vue-next/src/composables/useToast/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/composables/useToastController/index.ts (0 hunks)
  • packages/bootstrap-vue-next/src/main.ts (0 hunks)
  • packages/bootstrap-vue-next/src/plugins/createBootstrap/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/plugins/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/plugins/modalController/index.ts (0 hunks)
  • packages/bootstrap-vue-next/src/plugins/orchestrator/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/plugins/popoverController/index.ts (0 hunks)
  • packages/bootstrap-vue-next/src/plugins/showHide/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/plugins/toastController/index.ts (0 hunks)
  • packages/bootstrap-vue-next/src/types/BootstrapVueOptions.ts (5 hunks)
  • packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (7 hunks)
  • packages/bootstrap-vue-next/src/types/ComponentProps.ts (2 hunks)
  • packages/bootstrap-vue-next/src/utils/getElement.ts (1 hunks)
  • packages/bootstrap-vue-next/src/utils/keys.ts (2 hunks)
💤 Files with no reviewable changes (8)
  • packages/bootstrap-vue-next/src/main.ts
  • packages/bootstrap-vue-next/src/composables/usePopoverController/index.ts
  • packages/bootstrap-vue-next/src/plugins/modalController/index.ts
  • packages/bootstrap-vue-next/src/composables/useModalController/index.ts
  • packages/bootstrap-vue-next/src/plugins/toastController/index.ts
  • apps/docs/src/docs/composables/useModalController.md
  • packages/bootstrap-vue-next/src/plugins/popoverController/index.ts
  • packages/bootstrap-vue-next/src/composables/useToastController/index.ts
🧰 Additional context used
🧠 Learnings (39)
📓 Common learnings
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
apps/docs/src/docs/components/modal.md (1)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
packages/bootstrap-vue-next/src/App.vue (10)
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: unstoppablecarl
PR: bootstrap-vue-next/bootstrap-vue-next#2671
File: packages/bootstrap-vue-next/src/components/BToast/_toast.scss:1-3
Timestamp: 2025-04-27T17:30:42.045Z
Learning: In global SCSS files for bootstrap-vue-next, `:deep()` combinator should not be used as it only works in Vue's scoped style blocks. Standard CSS/SCSS selectors should be used instead.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:384-404
Timestamp: 2025-05-28T07:57:19.915Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex and activeId watchers are intentionally designed with separation of concerns: activeIndex watcher handles activate-tab event emission and complex validation logic, while activeId watcher is kept simple for synchronization between activeId and activeIndex values only.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:425-430
Timestamp: 2025-05-28T07:32:45.658Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex synchronization within sortTabs() is necessary and correct. When sorting tabs by DOM position, indices change, so activeIndex must be updated immediately to maintain consistency with activeId. This is not an unwanted side effect but a required consequence of the sorting operation.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2679
File: apps/docs/.vitepress/theme/Layout.vue:0-0
Timestamp: 2025-05-01T23:40:56.146Z
Learning: In bootstrap-vue-next, the `useScrollspy` hook returns an object with a `current` property which is the ID string (or null) of the currently active item, not an object containing an ID.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2669
File: apps/docs/src/data/components/table.data.ts:334-336
Timestamp: 2025-04-24T20:35:48.629Z
Learning: The generic type parameter for table items should use the singular form `Item` rather than the plural `Items` to improve readability and follow TypeScript conventions. This change would primarily affect two files: `packages/bootstrap-vue-next/src/types/ComponentProps.ts` and `apps/docs/src/data/components/table.data.ts`.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:622-626
Timestamp: 2025-06-05T11:43:10.793Z
Learning: In migration guides, links to the old/previous version's documentation (like bootstrap-vue.org) are appropriate and helpful when explaining deprecated features, as they provide users with reference points for what they're migrating from.
packages/bootstrap-vue-next/src/components/BApp/index.ts (6)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:384-404
Timestamp: 2025-05-28T07:57:19.915Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex and activeId watchers are intentionally designed with separation of concerns: activeIndex watcher handles activate-tab event emission and complex validation logic, while activeId watcher is kept simple for synchronization between activeId and activeIndex values only.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:425-430
Timestamp: 2025-05-28T07:32:45.658Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex synchronization within sortTabs() is necessary and correct. When sorting tabs by DOM position, indices change, so activeIndex must be updated immediately to maintain consistency with activeId. This is not an unwanted side effect but a required consequence of the sorting operation.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2669
File: apps/docs/src/data/components/table.data.ts:334-336
Timestamp: 2025-04-24T20:35:48.629Z
Learning: The generic type parameter for table items should use the singular form `Item` rather than the plural `Items` to improve readability and follow TypeScript conventions. This change would primarily affect two files: `packages/bootstrap-vue-next/src/types/ComponentProps.ts` and `apps/docs/src/data/components/table.data.ts`.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:85-86
Timestamp: 2025-05-26T17:28:35.902Z
Learning: In the `useBLinkTagResolver` function in `packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts`, the `routerComponentName` parameter is required and typed as `MaybeRefOrGetter<string>`, ensuring it cannot be undefined.
packages/bootstrap-vue-next/src/components/BToast/toast-orchestrator.spec.ts (2)
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
apps/docs/src/components/TableOfContentsNav.vue (4)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2669
File: apps/docs/src/data/components/table.data.ts:334-336
Timestamp: 2025-04-24T20:35:48.629Z
Learning: The generic type parameter for table items should use the singular form `Item` rather than the plural `Items` to improve readability and follow TypeScript conventions. This change would primarily affect two files: `packages/bootstrap-vue-next/src/types/ComponentProps.ts` and `apps/docs/src/data/components/table.data.ts`.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
packages/bootstrap-vue-next/src/plugins/orchestrator/index.ts (1)
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
apps/docs/src/docs/components/popover.md (5)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:622-626
Timestamp: 2025-06-05T11:43:10.793Z
Learning: In migration guides, links to the old/previous version's documentation (like bootstrap-vue.org) are appropriate and helpful when explaining deprecated features, as they provide users with reference points for what they're migrating from.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
apps/docs/src/docs/composables/useToast.md (4)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
apps/docs/src/docs/composables/usePopover.md (8)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2669
File: apps/docs/src/data/components/table.data.ts:334-336
Timestamp: 2025-04-24T20:35:48.629Z
Learning: The generic type parameter for table items should use the singular form `Item` rather than the plural `Items` to improve readability and follow TypeScript conventions. This change would primarily affect two files: `packages/bootstrap-vue-next/src/types/ComponentProps.ts` and `apps/docs/src/data/components/table.data.ts`.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:622-626
Timestamp: 2025-06-05T11:43:10.793Z
Learning: In migration guides, links to the old/previous version's documentation (like bootstrap-vue.org) are appropriate and helpful when explaining deprecated features, as they provide users with reference points for what they're migrating from.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:384-404
Timestamp: 2025-05-28T07:57:19.915Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex and activeId watchers are intentionally designed with separation of concerns: activeIndex watcher handles activate-tab event emission and complex validation logic, while activeId watcher is kept simple for synchronization between activeId and activeIndex values only.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:85-86
Timestamp: 2025-05-26T17:28:35.902Z
Learning: In the `useBLinkTagResolver` function in `packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts`, the `routerComponentName` parameter is required and typed as `MaybeRefOrGetter<string>`, ensuring it cannot be undefined.
packages/bootstrap-vue-next/src/plugins/createBootstrap/index.ts (4)
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2669
File: apps/docs/src/data/components/table.data.ts:334-336
Timestamp: 2025-04-24T20:35:48.629Z
Learning: The generic type parameter for table items should use the singular form `Item` rather than the plural `Items` to improve readability and follow TypeScript conventions. This change would primarily affect two files: `packages/bootstrap-vue-next/src/types/ComponentProps.ts` and `apps/docs/src/data/components/table.data.ts`.
apps/docs/src/docs/migration-guide.md (7)
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:622-626
Timestamp: 2025-06-05T11:43:10.793Z
Learning: In migration guides, links to the old/previous version's documentation (like bootstrap-vue.org) are appropriate and helpful when explaining deprecated features, as they provide users with reference points for what they're migrating from.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2679
File: apps/docs/.vitepress/theme/Layout.vue:0-0
Timestamp: 2025-05-01T23:40:56.146Z
Learning: In bootstrap-vue-next, the `useScrollspy` hook returns an object with a `current` property which is the ID string (or null) of the currently active item, not an object containing an ID.
Learnt from: unstoppablecarl
PR: bootstrap-vue-next/bootstrap-vue-next#2671
File: packages/bootstrap-vue-next/src/components/BToast/_toast.scss:1-3
Timestamp: 2025-04-27T17:30:42.045Z
Learning: In global SCSS files for bootstrap-vue-next, `:deep()` combinator should not be used as it only works in Vue's scoped style blocks. Standard CSS/SCSS selectors should be used instead.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2669
File: apps/docs/src/data/components/table.data.ts:334-336
Timestamp: 2025-04-24T20:35:48.629Z
Learning: The generic type parameter for table items should use the singular form `Item` rather than the plural `Items` to improve readability and follow TypeScript conventions. This change would primarily affect two files: `packages/bootstrap-vue-next/src/types/ComponentProps.ts` and `apps/docs/src/data/components/table.data.ts`.
packages/bootstrap-vue-next/src/plugins/showHide/index.ts (4)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2679
File: apps/docs/.vitepress/theme/Layout.vue:0-0
Timestamp: 2025-05-01T23:40:56.146Z
Learning: In bootstrap-vue-next, the `useScrollspy` hook returns an object with a `current` property which is the ID string (or null) of the currently active item, not an object containing an ID.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
apps/docs/src/docs/demo/ModalConfirm.vue (4)
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2669
File: apps/docs/src/data/components/table.data.ts:334-336
Timestamp: 2025-04-24T20:35:48.629Z
Learning: The generic type parameter for table items should use the singular form `Item` rather than the plural `Items` to improve readability and follow TypeScript conventions. This change would primarily affect two files: `packages/bootstrap-vue-next/src/types/ComponentProps.ts` and `apps/docs/src/data/components/table.data.ts`.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
apps/playground/src/components/Comps/TModal.vue (8)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: unstoppablecarl
PR: bootstrap-vue-next/bootstrap-vue-next#2671
File: packages/bootstrap-vue-next/src/components/BToast/_toast.scss:1-3
Timestamp: 2025-04-27T17:30:42.045Z
Learning: In global SCSS files for bootstrap-vue-next, `:deep()` combinator should not be used as it only works in Vue's scoped style blocks. Standard CSS/SCSS selectors should be used instead.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2679
File: apps/docs/.vitepress/theme/Layout.vue:0-0
Timestamp: 2025-05-01T23:40:56.146Z
Learning: In bootstrap-vue-next, the `useScrollspy` hook returns an object with a `current` property which is the ID string (or null) of the currently active item, not an object containing an ID.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2669
File: apps/docs/src/data/components/table.data.ts:334-336
Timestamp: 2025-04-24T20:35:48.629Z
Learning: The generic type parameter for table items should use the singular form `Item` rather than the plural `Items` to improve readability and follow TypeScript conventions. This change would primarily affect two files: `packages/bootstrap-vue-next/src/types/ComponentProps.ts` and `apps/docs/src/data/components/table.data.ts`.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:384-404
Timestamp: 2025-05-28T07:57:19.915Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex and activeId watchers are intentionally designed with separation of concerns: activeIndex watcher handles activate-tab event emission and complex validation logic, while activeId watcher is kept simple for synchronization between activeId and activeIndex values only.
apps/playground/src/components/Comps/TToast.vue (6)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2672
File: packages/bootstrap-vue-next/src/components/BPopover/BPopover.vue:269-277
Timestamp: 2025-04-28T20:33:04.113Z
Learning: In Vue 3.3+, `toRef(() => props.strategy)` creates a reactive readonly ref. This getter-based syntax was introduced in Vue 3.3 as an ergonomic alternative to `computed()` and is the recommended approach for creating refs from props or other reactive sources.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2672
File: packages/bootstrap-vue-next/src/components/BPopover/BPopover.vue:269-277
Timestamp: 2025-04-28T20:33:04.113Z
Learning: In Vue 3.3 and later, `toRef(() => props.strategy)` creates a reactive readonly ref. The getter-based `toRef()` was introduced in Vue 3.3 as an ergonomic alternative to `computed()`.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:82-83
Timestamp: 2025-05-26T17:27:44.251Z
Learning: In Vue 3.3+, `toRef()` can accept any input type including raw values, existing refs, and getter functions (MaybeRefOrGetter). It will create a ref from the input or use the existing ref if one is passed. Using `toRef()` for simple property access is more performant than `computed()` because it avoids the caching overhead that computeds provide.
packages/bootstrap-vue-next/src/components/BToast/BToastOrchestrator.vue (7)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
Learnt from: unstoppablecarl
PR: bootstrap-vue-next/bootstrap-vue-next#2671
File: packages/bootstrap-vue-next/src/components/BToast/_toast.scss:1-3
Timestamp: 2025-04-27T17:30:42.045Z
Learning: In global SCSS files for bootstrap-vue-next, `:deep()` combinator should not be used as it only works in Vue's scoped style blocks. Standard CSS/SCSS selectors should be used instead.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:384-404
Timestamp: 2025-05-28T07:57:19.915Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex and activeId watchers are intentionally designed with separation of concerns: activeIndex watcher handles activate-tab event emission and complex validation logic, while activeId watcher is kept simple for synchronization between activeId and activeIndex values only.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:85-86
Timestamp: 2025-05-26T17:28:35.902Z
Learning: In the `useBLinkTagResolver` function in `packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts`, the `routerComponentName` parameter is required and typed as `MaybeRefOrGetter<string>`, ensuring it cannot be undefined.
packages/bootstrap-vue-next/src/components/index.ts (8)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:384-404
Timestamp: 2025-05-28T07:57:19.915Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex and activeId watchers are intentionally designed with separation of concerns: activeIndex watcher handles activate-tab event emission and complex validation logic, while activeId watcher is kept simple for synchronization between activeId and activeIndex values only.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:425-430
Timestamp: 2025-05-28T07:32:45.658Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex synchronization within sortTabs() is necessary and correct. When sorting tabs by DOM position, indices change, so activeIndex must be updated immediately to maintain consistency with activeId. This is not an unwanted side effect but a required consequence of the sorting operation.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:85-86
Timestamp: 2025-05-26T17:28:35.902Z
Learning: In the `useBLinkTagResolver` function in `packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts`, the `routerComponentName` parameter is required and typed as `MaybeRefOrGetter<string>`, ensuring it cannot be undefined.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2669
File: apps/docs/src/data/components/table.data.ts:334-336
Timestamp: 2025-04-24T20:35:48.629Z
Learning: The generic type parameter for table items should use the singular form `Item` rather than the plural `Items` to improve readability and follow TypeScript conventions. This change would primarily affect two files: `packages/bootstrap-vue-next/src/types/ComponentProps.ts` and `apps/docs/src/data/components/table.data.ts`.
apps/docs/src/docs/demo/ModalMessageBox.vue (4)
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2669
File: apps/docs/src/data/components/table.data.ts:334-336
Timestamp: 2025-04-24T20:35:48.629Z
Learning: The generic type parameter for table items should use the singular form `Item` rather than the plural `Items` to improve readability and follow TypeScript conventions. This change would primarily affect two files: `packages/bootstrap-vue-next/src/types/ComponentProps.ts` and `apps/docs/src/data/components/table.data.ts`.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
packages/bootstrap-vue-next/src/components/BModal/BModalOrchestrator.vue (7)
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:384-404
Timestamp: 2025-05-28T07:57:19.915Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex and activeId watchers are intentionally designed with separation of concerns: activeIndex watcher handles activate-tab event emission and complex validation logic, while activeId watcher is kept simple for synchronization between activeId and activeIndex values only.
Learnt from: unstoppablecarl
PR: bootstrap-vue-next/bootstrap-vue-next#2671
File: packages/bootstrap-vue-next/src/components/BToast/_toast.scss:1-3
Timestamp: 2025-04-27T17:30:42.045Z
Learning: In global SCSS files for bootstrap-vue-next, `:deep()` combinator should not be used as it only works in Vue's scoped style blocks. Standard CSS/SCSS selectors should be used instead.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:85-86
Timestamp: 2025-05-26T17:28:35.902Z
Learning: In the `useBLinkTagResolver` function in `packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts`, the `routerComponentName` parameter is required and typed as `MaybeRefOrGetter<string>`, ensuring it cannot be undefined.
packages/bootstrap-vue-next/src/composables/useProvideDefaults/index.ts (5)
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:85-86
Timestamp: 2025-05-26T17:28:35.902Z
Learning: In the `useBLinkTagResolver` function in `packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts`, the `routerComponentName` parameter is required and typed as `MaybeRefOrGetter<string>`, ensuring it cannot be undefined.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: unstoppablecarl
PR: bootstrap-vue-next/bootstrap-vue-next#2671
File: packages/bootstrap-vue-next/src/components/BToast/_toast.scss:1-3
Timestamp: 2025-04-27T17:30:42.045Z
Learning: In global SCSS files for bootstrap-vue-next, `:deep()` combinator should not be used as it only works in Vue's scoped style blocks. Standard CSS/SCSS selectors should be used instead.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
packages/bootstrap-vue-next/src/components/BPopover/BPopoverOrchestrator.vue (7)
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
Learnt from: unstoppablecarl
PR: bootstrap-vue-next/bootstrap-vue-next#2671
File: packages/bootstrap-vue-next/src/components/BToast/_toast.scss:1-3
Timestamp: 2025-04-27T17:30:42.045Z
Learning: In global SCSS files for bootstrap-vue-next, `:deep()` combinator should not be used as it only works in Vue's scoped style blocks. Standard CSS/SCSS selectors should be used instead.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2689
File: apps/docs/src/docs/components/demo/ProgressCustomLabels.vue:6-8
Timestamp: 2025-05-09T17:28:39.323Z
Learning: In Vue templates, when using Prettier for formatting, tags may be split across multiple lines with patterns like `<span\n>Content</span\n>` where closing angle brackets appear at the beginning of lines. This is valid syntax even though it looks unusual, and should be maintained when Prettier enforces it.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:85-86
Timestamp: 2025-05-26T17:28:35.902Z
Learning: In the `useBLinkTagResolver` function in `packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts`, the `routerComponentName` parameter is required and typed as `MaybeRefOrGetter<string>`, ensuring it cannot be undefined.
apps/docs/src/docs/components/toast.md (10)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2669
File: apps/docs/src/data/components/table.data.ts:334-336
Timestamp: 2025-04-24T20:35:48.629Z
Learning: The generic type parameter for table items should use the singular form `Item` rather than the plural `Items` to improve readability and follow TypeScript conventions. This change would primarily affect two files: `packages/bootstrap-vue-next/src/types/ComponentProps.ts` and `apps/docs/src/data/components/table.data.ts`.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:85-86
Timestamp: 2025-05-26T17:28:35.902Z
Learning: In the `useBLinkTagResolver` function in `packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts`, the `routerComponentName` parameter is required and typed as `MaybeRefOrGetter<string>`, ensuring it cannot be undefined.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:384-404
Timestamp: 2025-05-28T07:57:19.915Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex and activeId watchers are intentionally designed with separation of concerns: activeIndex watcher handles activate-tab event emission and complex validation logic, while activeId watcher is kept simple for synchronization between activeId and activeIndex values only.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2672
File: packages/bootstrap-vue-next/src/components/BPopover/BPopover.vue:269-277
Timestamp: 2025-04-28T20:33:04.113Z
Learning: In Vue 3.3+, `toRef(() => props.strategy)` creates a reactive readonly ref. This getter-based syntax was introduced in Vue 3.3 as an ergonomic alternative to `computed()` and is the recommended approach for creating refs from props or other reactive sources.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2672
File: packages/bootstrap-vue-next/src/components/BPopover/BPopover.vue:269-277
Timestamp: 2025-04-28T20:33:04.113Z
Learning: In Vue 3.3 and later, `toRef(() => props.strategy)` creates a reactive readonly ref. The getter-based `toRef()` was introduced in Vue 3.3 as an ergonomic alternative to `computed()`.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:82-83
Timestamp: 2025-05-26T17:27:44.251Z
Learning: In Vue 3.3+, `toRef()` can accept any input type including raw values, existing refs, and getter functions (MaybeRefOrGetter). It will create a ref from the input or use the existing ref if one is passed. Using `toRef()` for simple property access is more performant than `computed()` because it avoids the caching overhead that computeds provide.
packages/bootstrap-vue-next/src/components/BApp/BApp.vue (12)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:85-86
Timestamp: 2025-05-26T17:28:35.902Z
Learning: In the `useBLinkTagResolver` function in `packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts`, the `routerComponentName` parameter is required and typed as `MaybeRefOrGetter<string>`, ensuring it cannot be undefined.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:384-404
Timestamp: 2025-05-28T07:57:19.915Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex and activeId watchers are intentionally designed with separation of concerns: activeIndex watcher handles activate-tab event emission and complex validation logic, while activeId watcher is kept simple for synchronization between activeId and activeIndex values only.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:425-430
Timestamp: 2025-05-28T07:32:45.658Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex synchronization within sortTabs() is necessary and correct. When sorting tabs by DOM position, indices change, so activeIndex must be updated immediately to maintain consistency with activeId. This is not an unwanted side effect but a required consequence of the sorting operation.
Learnt from: unstoppablecarl
PR: bootstrap-vue-next/bootstrap-vue-next#2671
File: packages/bootstrap-vue-next/src/components/BToast/_toast.scss:1-3
Timestamp: 2025-04-27T17:30:42.045Z
Learning: In global SCSS files for bootstrap-vue-next, `:deep()` combinator should not be used as it only works in Vue's scoped style blocks. Standard CSS/SCSS selectors should be used instead.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:82-83
Timestamp: 2025-05-26T17:27:44.251Z
Learning: In Vue 3.3+, `toRef()` can accept any input type including raw values, existing refs, and getter functions (MaybeRefOrGetter). It will create a ref from the input or use the existing ref if one is passed. Using `toRef()` for simple property access is more performant than `computed()` because it avoids the caching overhead that computeds provide.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2672
File: packages/bootstrap-vue-next/src/components/BPopover/BPopover.vue:269-277
Timestamp: 2025-04-28T20:33:04.113Z
Learning: In Vue 3.3+, `toRef(() => props.strategy)` creates a reactive readonly ref. This getter-based syntax was introduced in Vue 3.3 as an ergonomic alternative to `computed()` and is the recommended approach for creating refs from props or other reactive sources.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2672
File: packages/bootstrap-vue-next/src/components/BPopover/BPopover.vue:269-277
Timestamp: 2025-04-28T20:33:04.113Z
Learning: In Vue 3.3 and later, `toRef(() => props.strategy)` creates a reactive readonly ref. The getter-based `toRef()` was introduced in Vue 3.3 as an ergonomic alternative to `computed()`.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2679
File: apps/docs/.vitepress/theme/Layout.vue:0-0
Timestamp: 2025-05-01T23:40:56.146Z
Learning: In bootstrap-vue-next, the `useScrollspy` hook returns an object with a `current` property which is the ID string (or null) of the currently active item, not an object containing an ID.
packages/bootstrap-vue-next/src/components/BApp/bapp.spec.ts (6)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:384-404
Timestamp: 2025-05-28T07:57:19.915Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex and activeId watchers are intentionally designed with separation of concerns: activeIndex watcher handles activate-tab event emission and complex validation logic, while activeId watcher is kept simple for synchronization between activeId and activeIndex values only.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:85-86
Timestamp: 2025-05-26T17:28:35.902Z
Learning: In the `useBLinkTagResolver` function in `packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts`, the `routerComponentName` parameter is required and typed as `MaybeRefOrGetter<string>`, ensuring it cannot be undefined.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:425-430
Timestamp: 2025-05-28T07:32:45.658Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex synchronization within sortTabs() is necessary and correct. When sorting tabs by DOM position, indices change, so activeIndex must be updated immediately to maintain consistency with activeId. This is not an unwanted side effect but a required consequence of the sorting operation.
packages/bootstrap-vue-next/src/composables/index.ts (5)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: unstoppablecarl
PR: bootstrap-vue-next/bootstrap-vue-next#2671
File: packages/bootstrap-vue-next/src/components/BToast/_toast.scss:1-3
Timestamp: 2025-04-27T17:30:42.045Z
Learning: In global SCSS files for bootstrap-vue-next, `:deep()` combinator should not be used as it only works in Vue's scoped style blocks. Standard CSS/SCSS selectors should be used instead.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2669
File: apps/docs/src/data/components/table.data.ts:334-336
Timestamp: 2025-04-24T20:35:48.629Z
Learning: The generic type parameter for table items should use the singular form `Item` rather than the plural `Items` to improve readability and follow TypeScript conventions. This change would primarily affect two files: `packages/bootstrap-vue-next/src/types/ComponentProps.ts` and `apps/docs/src/data/components/table.data.ts`.
packages/bootstrap-vue-next/src/plugins/index.ts (3)
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue (7)
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:384-404
Timestamp: 2025-05-28T07:57:19.915Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex and activeId watchers are intentionally designed with separation of concerns: activeIndex watcher handles activate-tab event emission and complex validation logic, while activeId watcher is kept simple for synchronization between activeId and activeIndex values only.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:85-86
Timestamp: 2025-05-26T17:28:35.902Z
Learning: In the `useBLinkTagResolver` function in `packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts`, the `routerComponentName` parameter is required and typed as `MaybeRefOrGetter<string>`, ensuring it cannot be undefined.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:425-430
Timestamp: 2025-05-28T07:32:45.658Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex synchronization within sortTabs() is necessary and correct. When sorting tabs by DOM position, indices change, so activeIndex must be updated immediately to maintain consistency with activeId. This is not an unwanted side effect but a required consequence of the sorting operation.
packages/bootstrap-vue-next/src/types/ComponentProps.ts (8)
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:85-86
Timestamp: 2025-05-26T17:28:35.902Z
Learning: In the `useBLinkTagResolver` function in `packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts`, the `routerComponentName` parameter is required and typed as `MaybeRefOrGetter<string>`, ensuring it cannot be undefined.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2669
File: apps/docs/src/data/components/table.data.ts:334-336
Timestamp: 2025-04-24T20:35:48.629Z
Learning: The generic type parameter for table items should use the singular form `Item` rather than the plural `Items` to improve readability and follow TypeScript conventions. This change would primarily affect two files: `packages/bootstrap-vue-next/src/types/ComponentProps.ts` and `apps/docs/src/data/components/table.data.ts`.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2672
File: packages/bootstrap-vue-next/src/components/BPopover/BPopover.vue:269-277
Timestamp: 2025-04-28T20:33:04.113Z
Learning: In Vue 3.3+, `toRef(() => props.strategy)` creates a reactive readonly ref. This getter-based syntax was introduced in Vue 3.3 as an ergonomic alternative to `computed()` and is the recommended approach for creating refs from props or other reactive sources.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:384-404
Timestamp: 2025-05-28T07:57:19.915Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex and activeId watchers are intentionally designed with separation of concerns: activeIndex watcher handles activate-tab event emission and complex validation logic, while activeId watcher is kept simple for synchronization between activeId and activeIndex values only.
packages/bootstrap-vue-next/src/composables/usePopover/index.ts (3)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
packages/bootstrap-vue-next/src/composables/useModal/index.ts (5)
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2679
File: apps/docs/.vitepress/theme/Layout.vue:0-0
Timestamp: 2025-05-01T23:40:56.146Z
Learning: In bootstrap-vue-next, the `useScrollspy` hook returns an object with a `current` property which is the ID string (or null) of the currently active item, not an object containing an ID.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:85-86
Timestamp: 2025-05-26T17:28:35.902Z
Learning: In the `useBLinkTagResolver` function in `packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts`, the `routerComponentName` parameter is required and typed as `MaybeRefOrGetter<string>`, ensuring it cannot be undefined.
apps/docs/src/docs/composables.md (3)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2669
File: apps/docs/src/data/components/table.data.ts:334-336
Timestamp: 2025-04-24T20:35:48.629Z
Learning: The generic type parameter for table items should use the singular form `Item` rather than the plural `Items` to improve readability and follow TypeScript conventions. This change would primarily affect two files: `packages/bootstrap-vue-next/src/types/ComponentProps.ts` and `apps/docs/src/data/components/table.data.ts`.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
packages/bootstrap-vue-next/src/composables/useToast/index.ts (3)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
packages/bootstrap-vue-next/src/composables/useRoot.ts (4)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:85-86
Timestamp: 2025-05-26T17:28:35.902Z
Learning: In the `useBLinkTagResolver` function in `packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts`, the `routerComponentName` parameter is required and typed as `MaybeRefOrGetter<string>`, ensuring it cannot be undefined.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
packages/bootstrap-vue-next/src/utils/keys.ts (5)
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:85-86
Timestamp: 2025-05-26T17:28:35.902Z
Learning: In the `useBLinkTagResolver` function in `packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts`, the `routerComponentName` parameter is required and typed as `MaybeRefOrGetter<string>`, ensuring it cannot be undefined.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2669
File: apps/docs/src/data/components/table.data.ts:334-336
Timestamp: 2025-04-24T20:35:48.629Z
Learning: The generic type parameter for table items should use the singular form `Item` rather than the plural `Items` to improve readability and follow TypeScript conventions. This change would primarily affect two files: `packages/bootstrap-vue-next/src/types/ComponentProps.ts` and `apps/docs/src/data/components/table.data.ts`.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
packages/bootstrap-vue-next/src/composables/orchestratorShared.ts (2)
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
packages/bootstrap-vue-next/src/types/BootstrapVueOptions.ts (9)
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2669
File: apps/docs/src/data/components/table.data.ts:334-336
Timestamp: 2025-04-24T20:35:48.629Z
Learning: The generic type parameter for table items should use the singular form `Item` rather than the plural `Items` to improve readability and follow TypeScript conventions. This change would primarily affect two files: `packages/bootstrap-vue-next/src/types/ComponentProps.ts` and `apps/docs/src/data/components/table.data.ts`.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:85-86
Timestamp: 2025-05-26T17:28:35.902Z
Learning: In the `useBLinkTagResolver` function in `packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts`, the `routerComponentName` parameter is required and typed as `MaybeRefOrGetter<string>`, ensuring it cannot be undefined.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:425-430
Timestamp: 2025-05-28T07:32:45.658Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex synchronization within sortTabs() is necessary and correct. When sorting tabs by DOM position, indices change, so activeIndex must be updated immediately to maintain consistency with activeId. This is not an unwanted side effect but a required consequence of the sorting operation.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:622-626
Timestamp: 2025-06-05T11:43:10.793Z
Learning: In migration guides, links to the old/previous version's documentation (like bootstrap-vue.org) are appropriate and helpful when explaining deprecated features, as they provide users with reference points for what they're migrating from.
Learnt from: unstoppablecarl
PR: bootstrap-vue-next/bootstrap-vue-next#2671
File: packages/bootstrap-vue-next/src/components/BToast/_toast.scss:1-3
Timestamp: 2025-04-27T17:30:42.045Z
Learning: In global SCSS files for bootstrap-vue-next, `:deep()` combinator should not be used as it only works in Vue's scoped style blocks. Standard CSS/SCSS selectors should be used instead.
apps/docs/src/docs/composables/useModal.md (5)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:384-404
Timestamp: 2025-05-28T07:57:19.915Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex and activeId watchers are intentionally designed with separation of concerns: activeIndex watcher handles activate-tab event emission and complex validation logic, while activeId watcher is kept simple for synchronization between activeId and activeIndex values only.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (4)
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2669
File: apps/docs/src/data/components/table.data.ts:334-336
Timestamp: 2025-04-24T20:35:48.629Z
Learning: The generic type parameter for table items should use the singular form `Item` rather than the plural `Items` to improve readability and follow TypeScript conventions. This change would primarily affect two files: `packages/bootstrap-vue-next/src/types/ComponentProps.ts` and `apps/docs/src/data/components/table.data.ts`.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
🧬 Code Graph Analysis (9)
packages/bootstrap-vue-next/src/plugins/orchestrator/index.ts (3)
packages/bootstrap-vue-next/src/plugins/index.ts (1)
  • orchestratorPlugin (6-6)
packages/bootstrap-vue-next/src/composables/orchestratorShared.ts (1)
  • _newOrchestratorRegistry (109-117)
packages/bootstrap-vue-next/src/utils/keys.ts (1)
  • orchestratorPluginKey (210-214)
packages/bootstrap-vue-next/src/plugins/showHide/index.ts (1)
packages/bootstrap-vue-next/src/composables/useRoot.ts (1)
  • _newShowHideRegistry (110-151)
packages/bootstrap-vue-next/src/composables/useProvideDefaults/index.ts (3)
packages/bootstrap-vue-next/src/types/ComponentProps.ts (1)
  • BAppProps (73-97)
packages/bootstrap-vue-next/src/utils/keys.ts (1)
  • defaultsKey (204-205)
packages/bootstrap-vue-next/src/types/BootstrapVueOptions.ts (1)
  • BvnComponentProps (312-314)
packages/bootstrap-vue-next/src/types/ComponentProps.ts (1)
packages/bootstrap-vue-next/src/types/BootstrapVueOptions.ts (1)
  • BvnComponentProps (312-314)
packages/bootstrap-vue-next/src/composables/useToast/index.ts (4)
packages/bootstrap-vue-next/src/composables/index.ts (2)
  • useToast (5-5)
  • useToastController (5-5)
packages/bootstrap-vue-next/src/utils/keys.ts (1)
  • orchestratorPluginKey (210-214)
packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (4)
  • OrchestratorCreateOptions (298-305)
  • PromiseWithComponent (14-16)
  • ToastOrchestratorParam (119-159)
  • ToastOrchestratorArrayValue (83-118)
packages/bootstrap-vue-next/src/composables/orchestratorShared.ts (2)
  • buildPromise (20-107)
  • show (37-42)
packages/bootstrap-vue-next/src/utils/keys.ts (1)
packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (1)
  • OrchestratorArrayValue (307-311)
packages/bootstrap-vue-next/src/composables/orchestratorShared.ts (3)
packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (4)
  • OrchestratorArrayValue (307-311)
  • ControllerKey (12-12)
  • PromiseWithComponent (14-16)
  • PromiseWithComponentInternal (17-26)
packages/bootstrap-vue-next/src/utils/classes.ts (1)
  • BvTriggerableEvent (68-90)
packages/bootstrap-vue-next/src/utils/keys.ts (1)
  • orchestratorPluginKey (210-214)
packages/bootstrap-vue-next/src/types/BootstrapVueOptions.ts (2)
packages/bootstrap-vue-next/src/types/Props.ts (1)
  • ComponentProps (9-11)
packages/bootstrap-vue-next/src/types/ComponentProps.ts (1)
  • BAppProps (73-97)
packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (4)
packages/bootstrap-vue-next/src/utils/classes.ts (1)
  • BvTriggerableEvent (68-90)
packages/bootstrap-vue-next/src/types/ComponentProps.ts (4)
  • BToastProps (1290-1315)
  • BTooltipProps (1353-1355)
  • BPopoverProps (1317-1351)
  • BModalProps (1363-1426)
packages/bootstrap-vue-next/src/types/ComponentSlots.ts (1)
  • BPopoverSlots (57-61)
packages/bootstrap-vue-next/src/types/ComponentEmits.ts (1)
  • BPopoverEmits (34-39)
🪛 markdownlint-cli2 (0.17.2)
apps/docs/src/docs/composables/useToast.md

1-1: First line in a file should be a top-level heading

(MD041, first-line-heading, first-line-h1)

apps/docs/src/docs/composables/usePopover.md

1-1: First line in a file should be a top-level heading

(MD041, first-line-heading, first-line-h1)

🪛 Biome (1.9.4)
packages/bootstrap-vue-next/src/plugins/createBootstrap/index.ts

[error] 16-16: Comparing to itself is potentially pointless.

(lint/suspicious/noSelfCompare)


[error] 19-19: Comparing to itself is potentially pointless.

(lint/suspicious/noSelfCompare)


[error] 22-22: Comparing to itself is potentially pointless.

(lint/suspicious/noSelfCompare)


[error] 25-25: Comparing to itself is potentially pointless.

(lint/suspicious/noSelfCompare)


[error] 28-28: Comparing to itself is potentially pointless.

(lint/suspicious/noSelfCompare)

🪛 GitHub Check: test-lint
packages/bootstrap-vue-next/src/components/BToast/BToastOrchestrator.vue

[warning] 34-34:
Unexpected console statement

packages/bootstrap-vue-next/src/components/BModal/BModalOrchestrator.vue

[warning] 31-31:
Unexpected console statement

packages/bootstrap-vue-next/src/components/BPopover/BPopoverOrchestrator.vue

[warning] 28-28:
Unexpected console statement

🪛 LanguageTool
apps/docs/src/docs/composables/useModal.md

[uncategorized] ~13-~13: This verb may not be in the correct tense. Consider changing the tense to fit the context better.
Context: ...ert /> ## BModalOrchestrator You must have initialized BModalOrchestrator component once and...

(AI_EN_LECTOR_REPLACEMENT_VERB_TENSE)


[uncategorized] ~13-~13: You might be missing the article “the” here.
Context: ...Orchestrator You must have initialized BModalOrchestrator component once and o...

(AI_EN_LECTOR_MISSING_DETERMINER_THE)


[style] ~102-~102: Unless you want to emphasize “not”, use “cannot” which is more common.
Context: ...ontrol to be desired. For instance, you can not add HTML to any slot value. This is whe...

(CAN_NOT_PREMIUM)


[misspelling] ~151-~151: Did you mean “at a time”, “at the time”, or “at times”?
Context: ...create` method will resolve the promise at time of hiding the modal, rather than waitin...

(AT_TIME2)


[style] ~183-~183: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...s function sets the props of the modal. This is useful for updating the modal after ...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[style] ~187-~187: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...d. - destroy: () => Promise<void> This function destroys the modal and cleans ...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[uncategorized] ~190-~190: Did you mean: “By default,”?
Context: ...ces associated with it. ### Lifecycle By default the modal is destroyed once it's closed...

(BY_DEFAULT_COMMA)


[uncategorized] ~191-~191: Possible missing comma found.
Context: ...ce it's closed. If you want to keep the modal use the option 'keep' in the second arg...

(AI_HYDRA_LEO_MISSING_COMMA)


[style] ~209-~209: As a shorter alternative for ‘able to’, consider using “can also”.
Context: ... create modals in a global context, you are also able to hide modals from anywhere in the app. T...

(BE_ABLE_TO)

🔇 Additional comments (47)
packages/bootstrap-vue-next/src/components/index.ts (1)

3-3: LGTM! Export follows established patterns.

The BApp export is correctly placed in alphabetical order and follows the established pattern of re-exporting from component directories.

packages/bootstrap-vue-next/src/components/BToast/toast-orchestrator.spec.ts (1)

20-20: LGTM! Test update aligns with orchestrator refactoring.

The test correctly checks for the orchestrator-container class, which aligns with the unified orchestrator architecture introduced in this PR.

packages/bootstrap-vue-next/src/App.vue (2)

2-8: LGTM! Demonstrates correct BApp usage as root wrapper.

The template correctly wraps the existing content with the new BApp component, demonstrating the intended usage pattern while preserving the existing structure.


14-14: LGTM! Import statement correctly updated.

The import statement properly includes BApp alongside the existing component imports.

apps/docs/src/docs/components/modal.md (1)

243-243: LGTM! Documentation reference correctly updated.

The reference to useModal composable documentation is correct and aligns with the new orchestrator-based API.

packages/bootstrap-vue-next/src/components/BApp/index.ts (1)

1-1: LGTM! Standard component re-export pattern.

The re-export follows the established pattern for component directories and enables clean imports of the BApp component.

apps/docs/src/docs/components/popover.md (2)

7-7: Documentation update aligns with composable refactoring.

The change from usePopoverController to usePopover correctly reflects the new orchestrator-based composable naming.


63-63: Consistent composable reference update.

The documentation correctly references the new usePopover composable for programmatic control.

packages/bootstrap-vue-next/src/plugins/orchestrator/index.ts (1)

1-11: Well-structured orchestrator plugin implementation.

The plugin correctly follows Vue 3 patterns by:

  • Using proper typing with Plugin interface
  • Creating a new registry instance via the factory function
  • Providing the registry through the dependency injection system

This implementation consolidates the previous separate controller plugins into a unified orchestrator approach.

apps/docs/src/components/TableOfContentsNav.vue (1)

151-152: Navigation updated to reflect new composable names.

The composables list correctly includes the new orchestrator-based composables usePopover and useToast, replacing the deprecated controller-based versions.

apps/docs/src/docs/migration-guide.md (4)

558-559: Migration guide correctly updated for useModal composable.

The text properly references the new useModal composable instead of the deprecated useModalController.


561-561: Consistent documentation link update.

The link correctly points to the new useModal composable documentation.


564-564: Method call examples updated correctly.

The examples now show useModal.show and useModal.confirm instead of the deprecated controller methods, maintaining the same functionality while using the new API.

Also applies to: 568-568


665-665: Popover composable reference updated appropriately.

The migration guide correctly directs users to usePopover instead of the deprecated usePopoverController.

apps/docs/src/docs/composables/useToast.md (3)

1-1: Header correctly updated for new composable name.

The ComposableHeader properly references the new useToast composable path and title.


5-5: Documentation description updated appropriately.

The description correctly references useToast for creating toasts on demand.


28-28: Consistent composable usage throughout examples.

All code examples and script imports have been systematically updated to use useToast instead of useToastController. The functionality and API remain unchanged, providing a smooth migration path.

Note: The markdownlint warning about missing h1 heading is a false positive since this file uses the ComposableHeader component which handles the heading structure.

Also applies to: 48-48, 77-77, 120-120, 174-174, 220-220, 252-252, 259-259

apps/playground/src/components/Comps/TModal.vue (1)

59-59: LGTM! Correct migration to new orchestrator API.

The migration from useModalController to useModal is implemented correctly:

  • Store filtering for modal type is appropriate since the orchestrator manages all overlay types
  • Consistent replacement of show() with create() across all methods
  • Proper destructuring of the new API {create, store}

Also applies to: 67-67, 87-87, 91-91, 97-97, 104-104, 107-107

apps/docs/src/docs/composables/usePopover.md (1)

1-1: LGTM! Consistent documentation update for composable rename.

The documentation correctly reflects the migration from usePopoverController to usePopover:

  • Header, descriptions, and code examples updated consistently
  • Good correction from "access" to "accepts" on line 25
  • All import statements and method references properly updated

Also applies to: 5-5, 25-25, 27-27, 48-48, 73-73, 105-105, 147-147, 153-153

packages/bootstrap-vue-next/src/plugins/index.ts (1)

6-6: LGTM! Correct export for unified orchestrator plugin.

The addition of orchestratorPlugin export aligns with the architectural shift from separate controller plugins to a unified orchestration approach.

packages/bootstrap-vue-next/src/plugins/createBootstrap/index.ts (1)

11-11: LGTM! Correct orchestrator plugin integration.

The conditional installation of orchestratorPlugin and showHidePlugin is implemented correctly and aligns with the new architecture.

Also applies to: 25-27, 28-30

apps/playground/src/components/Comps/TToast.vue (1)

11-11: LGTM! Correct migration to new orchestrator API.

The migration from useToastController to useToast is implemented correctly:

  • Store filtering for toast type is appropriate for the unified orchestrator
  • Consistent replacement of show() with create() across all methods
  • Proper destructuring of the new API {create, store}

Also applies to: 25-25, 28-28, 43-43, 50-50, 58-58, 61-61

packages/bootstrap-vue-next/src/components/BModal/BModalOrchestrator.vue (1)

24-28: Confirm install-flag lifecycle.

renderOrchestrator is gated on tools._isOrchestratorInstalled.value but the flag is never flipped to true here nor reset on unmount.
Please double-check that BOrchestrator (or useModal) toggles this ref correctly; otherwise multiple orchestrators may mount in dynamic setups.

apps/docs/src/docs/demo/ModalMessageBox.vue (1)

14-14: LGTM – correct union type.

apps/docs/src/docs/demo/ModalConfirm.vue (1)

12-13: LGTM – demo updated to new API.

packages/bootstrap-vue-next/src/components/BToast/BToastOrchestrator.vue (1)

27-31: Well-designed orchestrator installation check.

The conditional rendering based on _isOrchestratorInstalled prevents multiple orchestrators from being mounted, which is crucial for proper operation.

apps/docs/src/docs/components/toast.md (1)

13-14: Documentation updates are consistent with the new API.

All references to the old useToastController and its show method have been properly updated to use useToast and create. The prop changes from value to modelValue are also correctly reflected.

Also applies to: 140-142, 147-176, 198-214, 224-224, 237-237, 241-241

packages/bootstrap-vue-next/src/composables/index.ts (1)

3-9: Export structure supports smooth migration.

Exporting both the new composables and their deprecated aliases from the same modules provides backward compatibility while encouraging migration to the new API.

apps/docs/src/docs/composables.md (1)

27-42: Composables list accurately reflects the new API structure.

The updated names and descriptions properly communicate the shift from controller-based to orchestrator-based composables.

packages/bootstrap-vue-next/src/composables/useToast/index.ts (3)

26-47: Robust error handling for composable usage.

The composable properly validates that it's called within setup() and that the orchestrator is installed, providing clear error messages.


140-166: Well-implemented deprecation strategy.

The deprecated show() method and useToastController alias provide backward compatibility with clear deprecation warnings, facilitating a smooth migration path.


131-136: onScopeDispose’s second parameter is valid in Vue 3.5+

In Vue 3.5 and later, onScopeDispose accepts an optional boolean failSilently flag as its second argument. Passing true will silently ignore calls made outside of a setup context, which is the intended behavior here. No change is required.

(referenced retrieved learning from Vue 3.5+ API)

Likely an incorrect or invalid review comment.

packages/bootstrap-vue-next/src/types/ComponentProps.ts (3)

9-9: LGTM: TeleportProps import added correctly.

The import addition supports the new teleportTo property in BAppProps.


71-71: LGTM: BvnComponentProps import supports the new interface.

This import enables the defaults property to use the correct component props type.


73-97: Well-designed BAppProps interface with comprehensive configuration options.

The interface provides excellent flexibility for the BApp component:

  • defaults and mergeDefaults enable global component configuration
  • teleportTo supports flexible orchestrator placement
  • Boolean flags provide granular control over features
  • rtl property supports both simple boolean and detailed configuration

The typing is robust and leverages existing types appropriately.

packages/bootstrap-vue-next/src/components/BApp/BApp.vue (4)

1-6: Excellent template structure for a root wrapper component.

The template effectively:

  • Uses ConditionalTeleport for flexible orchestrator placement
  • Conditionally renders BOrchestrator based on the noOrchestrator flag
  • Properly forwards attributes to slot content with the wrapper pattern

This design provides clean separation and flexibility for users.


15-17: Correct use of inheritAttrs pattern.

Setting inheritAttrs: false combined with v-bind="$attrs" in the template is the proper pattern for wrapper components that need to control attribute forwarding.


19-27: Well-defined props with sensible defaults.

The props configuration provides comprehensive control:

  • inherit: true enables parent default inheritance by default
  • appendToast: false provides predictable toast behavior
  • noOrchestrator: false includes orchestrator by default
  • Other props have appropriate undefined/false defaults

The prop types align perfectly with the BAppProps interface.


29-30: Clean delegation to composables.

The component properly delegates functionality to specialized composables:

  • useProvideDefaults handles global default management
  • useRoot sets up root-level orchestration and RTL support

This separation of concerns makes the component maintainable and testable.

packages/bootstrap-vue-next/src/components/BPopover/BPopoverOrchestrator.vue (1)

27-29: Keep the deprecation warning for development builds

The console warning is appropriate for a deprecation notice in development mode. The static analysis warning can be safely ignored in this case.

packages/bootstrap-vue-next/src/utils/keys.ts (1)

17-17: LGTM! Clean consolidation of injection keys

The new orchestratorPluginKey properly consolidates the previously separate controller keys into a unified orchestrator pattern.

Also applies to: 210-214

packages/bootstrap-vue-next/src/composables/orchestratorShared.ts (1)

97-99: Add feature detection or polyfill for Symbol.asyncDispose

Symbol.asyncDispose is only supported in recent Chromium-based browsers (Chrome 127+, Edge 127+, Opera 113+), Node 18.18+, and Deno 1.37+. It is not available in Firefox or Safari (desktop or iOS) as of July 2025. To ensure broader compatibility, wrap or polyfill the symbol:

• File: packages/bootstrap-vue-next/src/composables/orchestratorShared.ts
Lines: around 97–99

Suggested change:

// at top of file
const asyncDisposeSym = Symbol.asyncDispose ?? Symbol('Symbol.asyncDispose')

export class OrchestratorShared {
  // …
  async [asyncDisposeSym]() {
    await this.destroy()
  }
}

This ensures that in environments without native Symbol.asyncDispose you still have a unique fallback symbol.

⛔ Skipped due to learnings
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/toastController/index.ts:203-208
Timestamp: 2025-04-22T20:13:41.342Z
Learning: In Vue 3.5+, the `onScopeDispose` function accepts two parameters: `function onScopeDispose(fn: () => void, failSilently?: boolean): void`. The second parameter `failSilently` controls whether to throw an error or silently ignore if the function is called outside of a component setup context.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/toastController/index.ts:203-208
Timestamp: 2025-04-22T20:13:41.342Z
Learning: In Vue 3.5+, the `onScopeDispose` function accepts two parameters: `function onScopeDispose(fn: () => void, failSilently?: boolean): void`. The second parameter `failSilently` controls whether to throw an error or silently ignore if the function is called outside of a component setup context.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/toastController/index.ts:203-208
Timestamp: 2025-04-22T20:13:41.342Z
Learning: In Vue 3.5+, the `onScopeDispose` function accepts two parameters: `function onScopeDispose(fn: () => void, failSilently?: boolean): void`. The second parameter `failSilently` controls whether to throw an error or silently ignore if the function is called outside of a component setup context.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
packages/bootstrap-vue-next/src/composables/useModal/index.ts (1)

121-121: Verify the return type of the create method.

The method returns promise.value instead of promise. Based on the method signature, this appears correct as it should return PromiseWithComponent not the ref wrapper, but please verify this aligns with the expected API.

packages/bootstrap-vue-next/src/types/BootstrapVueOptions.ts (1)

20-20: Type definitions correctly updated for the new architecture.

All type updates properly reflect the architectural changes:

  • Added BApp component mapping
  • Included new composables with backward-compatible aliases
  • Renamed modalController to orchestrator
  • Added showHide configuration option

Also applies to: 141-149, 164-164, 187-187, 206-206

packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (3)

14-26: LGTM! Well-designed generic interface for promise-based controllers.

The new PromiseWithComponent<T, P> interface provides a clean abstraction for the promise-based controller pattern, unifying the common behavior across modal, toast, popover, and tooltip controllers.


163-180: Good addition of tooltip orchestrator support.

The new TooltipOrchestratorArrayValue type follows the established pattern and aligns with the architecture where tooltips are managed through the popover controller.


104-104: Good API design with the _component renaming.

The consistent renaming of component to _component in array value types clearly indicates this is an internal property, while keeping the public-facing param types unchanged.

Also applies to: 169-169, 184-184, 221-221, 262-262

Comment on lines +30 to +34
useProvideDefaults(props.defaults, props.mergeDefaults)
useRoot(props.rtl)
if (!props.noOrchestrator) {
useOrchestratorRegistry(props.inherit)
}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@VividLemon @dwgray I'm not sure how much we want to separate the registries.

My reasoning for this three ways is:

  • defaults, you might want to override them in child components
  • Orchestator, you might want to have seperate registries on some branch (not sure about this)
  • useRoot (showHidestorage, modalmanager, breadcrumRegistry and rtlRegistry) are all global functionalities

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does my latest comment, if we force them to use the registries always, fix this issue at all?

Otherwise it's likely fine to keep those three items always bound together

useOrchestratorRegistry(props.inherit) props.inherit etc isn't reactive. I haven't looked at the source code or anything, but considering it's use_ (the naming for a composable) then it seems like it should have a reactive input?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@VividLemon I'm not sure anymore how the inherit stuff should go, we need to think about it a little more. I'm not really sure we need different registries with "inheritance" maybe we need a way to initilalise a new registry and pass that to a new orchestrator, which can be used in a branch of the app?

@dwgray what are your thoughts on the registries?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BOrchestrator has a test with a filter function, so you could show some in a different orchestrator... like

const filter = (i) => i.id.match(/^profile/) && i.type === 'toast'

to match profile toasts do a different orchestrator. (and you need to filter them out of the primary orchestrator).

Do we need more than this actually?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@xvaara I haven't used regestries before so I don't haveany strong opinions. I spent some time today trying to get my head wrapped around what you're doing here and wasn't fully successful.

I wonder if you could expand a little on the three points above from the perspective of use cases? Since you're using vue's provide/inject, for the defaults managed by useProvideDefaults, if some child component of BApp calls useProvideDefaults with different values, all its children will use the new defaults (or merged defaults) - that seems useful, but fairly corner case - like maybe the settings page of an app has different defaults for some of its components than the main App?

Is the same thing true of what you're doing with useOrchestratorRegistry? From my reading, the registry sets up the props for the different components that can be ochestrated (Popover, Modal, etc). I'm assuming these defaults override the defaults set using useProviderDefaults? But I get lost in where you would want to use one mechanism rather than the other.

I guess the other thing that you're doing with the filter is allowing different Orchestrators for the same type of orchestrated compnent based on some attribute of the component (in your example, that would be name & type match, but presumably you could have some arbitrary other field (like 'area') to filter on. But I'm struggly to see what that buys us.

@xvaara xvaara marked this pull request as ready for review July 4, 2025 08:10
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (4)
apps/docs/src/docs/migration-guide.md (1)

572-572: Fix grammatical issue.

Remove redundant "of" for better conciseness.

-The `create` accepts all of the properties that are defined on
+The `create` accepts all the properties that are defined on
apps/docs/src/docs/composables/usePopover.md (1)

13-13: Improve grammar and clarity.

Fix several grammatical issues for better readability.

-You must have initialized `BOrchestrator` component once and only once (doing multiple may display multiple `Popovers`). Also you need to provide the Orchestrator registy. use `BApp` component wrapping your app to initializes both of these for you.
+You must initialize the `BOrchestrator` component once and only once (using multiple instances may display multiple `Popovers`). Also, you need to provide the Orchestrator registry. Use the `BApp` component wrapping your app to initialize both of these for you.
apps/docs/src/docs/composables/useToast.md (1)

13-13: Fix grammatical issues for consistency.

Apply the same grammatical improvements as suggested for the popover documentation.

-You must have initialized `BOrchestrator` component once and only once (doing multiple may display multiple `Toasts`). Also you need to provide the Orchestrator registy. use `BApp` component wrapping your app to initializes both of these for you.
+You must initialize the `BOrchestrator` component once and only once (using multiple instances may display multiple `Toasts`). Also, you need to provide the Orchestrator registry. Use the `BApp` component wrapping your app to initialize both of these for you.
packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue (1)

120-120: Fix typo in variable name.

There's a typo in the variable name that should be corrected for consistency.

-  const postisionsActive = items.value?.reduce(
+  const positionsActive = items.value?.reduce(

And update the references on lines 131 and 140:

-  for (const position in positionClasses) {
-    if (postisionsActive?.[position]) {
+  for (const position in positionClasses) {
+    if (positionsActive?.[position]) {
-  if (postisionsActive?.['modal']) {
+  if (positionsActive?.['modal']) {
-  if (postisionsActive?.['popover']) {
+  if (positionsActive?.['popover']) {
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7a29874 and 5b8d1c2.

📒 Files selected for processing (17)
  • apps/docs/.vitepress/theme/Layout.vue (1 hunks)
  • apps/docs/.vitepress/theme/index.ts (0 hunks)
  • apps/docs/src/docs/components/modal.md (1 hunks)
  • apps/docs/src/docs/composables/useModal.md (1 hunks)
  • apps/docs/src/docs/composables/usePopover.md (5 hunks)
  • apps/docs/src/docs/composables/useToast.md (7 hunks)
  • apps/docs/src/docs/migration-guide.md (2 hunks)
  • packages/bootstrap-vue-next/src/components/BApp/BApp.vue (1 hunks)
  • packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue (1 hunks)
  • packages/bootstrap-vue-next/src/components/BApp/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/composables/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/composables/orchestratorShared.ts (1 hunks)
  • packages/bootstrap-vue-next/src/composables/useModal/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/composables/useProvideDefaults/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/composables/useRoot.ts (1 hunks)
  • packages/bootstrap-vue-next/src/types/BootstrapVueOptions.ts (7 hunks)
  • packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (6 hunks)
💤 Files with no reviewable changes (1)
  • apps/docs/.vitepress/theme/index.ts
✅ Files skipped from review due to trivial changes (2)
  • apps/docs/src/docs/components/modal.md
  • packages/bootstrap-vue-next/src/components/BApp/BApp.vue
🚧 Files skipped from review as they are similar to previous changes (4)
  • packages/bootstrap-vue-next/src/components/BApp/index.ts
  • packages/bootstrap-vue-next/src/composables/orchestratorShared.ts
  • packages/bootstrap-vue-next/src/composables/index.ts
  • packages/bootstrap-vue-next/src/types/BootstrapVueOptions.ts
🧰 Additional context used
🧠 Learnings (11)
📓 Common learnings
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
apps/docs/.vitepress/theme/Layout.vue (9)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:425-430
Timestamp: 2025-05-28T07:32:45.658Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex synchronization within sortTabs() is necessary and correct. When sorting tabs by DOM position, indices change, so activeIndex must be updated immediately to maintain consistency with activeId. This is not an unwanted side effect but a required consequence of the sorting operation.
Learnt from: unstoppablecarl
PR: bootstrap-vue-next/bootstrap-vue-next#2671
File: packages/bootstrap-vue-next/src/components/BToast/_toast.scss:1-3
Timestamp: 2025-04-27T17:30:42.045Z
Learning: In global SCSS files for bootstrap-vue-next, `:deep()` combinator should not be used as it only works in Vue's scoped style blocks. Standard CSS/SCSS selectors should be used instead.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:384-404
Timestamp: 2025-05-28T07:57:19.915Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex and activeId watchers are intentionally designed with separation of concerns: activeIndex watcher handles activate-tab event emission and complex validation logic, while activeId watcher is kept simple for synchronization between activeId and activeIndex values only.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:85-86
Timestamp: 2025-05-26T17:28:35.902Z
Learning: In the `useBLinkTagResolver` function in `packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts`, the `routerComponentName` parameter is required and typed as `MaybeRefOrGetter<string>`, ensuring it cannot be undefined.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2679
File: apps/docs/.vitepress/theme/Layout.vue:0-0
Timestamp: 2025-05-01T23:40:56.146Z
Learning: In bootstrap-vue-next, the `useScrollspy` hook returns an object with a `current` property which is the ID string (or null) of the currently active item, not an object containing an ID.
packages/bootstrap-vue-next/src/composables/useProvideDefaults/index.ts (5)
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:85-86
Timestamp: 2025-05-26T17:28:35.902Z
Learning: In the `useBLinkTagResolver` function in `packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts`, the `routerComponentName` parameter is required and typed as `MaybeRefOrGetter<string>`, ensuring it cannot be undefined.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: unstoppablecarl
PR: bootstrap-vue-next/bootstrap-vue-next#2671
File: packages/bootstrap-vue-next/src/components/BToast/_toast.scss:1-3
Timestamp: 2025-04-27T17:30:42.045Z
Learning: In global SCSS files for bootstrap-vue-next, `:deep()` combinator should not be used as it only works in Vue's scoped style blocks. Standard CSS/SCSS selectors should be used instead.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
packages/bootstrap-vue-next/src/composables/useModal/index.ts (9)
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2679
File: apps/docs/.vitepress/theme/Layout.vue:0-0
Timestamp: 2025-05-01T23:40:56.146Z
Learning: In bootstrap-vue-next, the `useScrollspy` hook returns an object with a `current` property which is the ID string (or null) of the currently active item, not an object containing an ID.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:85-86
Timestamp: 2025-05-26T17:28:35.902Z
Learning: In the `useBLinkTagResolver` function in `packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts`, the `routerComponentName` parameter is required and typed as `MaybeRefOrGetter<string>`, ensuring it cannot be undefined.
Learnt from: unstoppablecarl
PR: bootstrap-vue-next/bootstrap-vue-next#2671
File: packages/bootstrap-vue-next/src/components/BToast/_toast.scss:1-3
Timestamp: 2025-04-27T17:30:42.045Z
Learning: In global SCSS files for bootstrap-vue-next, `:deep()` combinator should not be used as it only works in Vue's scoped style blocks. Standard CSS/SCSS selectors should be used instead.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2669
File: apps/docs/src/data/components/table.data.ts:334-336
Timestamp: 2025-04-24T20:35:48.629Z
Learning: The generic type parameter for table items should use the singular form `Item` rather than the plural `Items` to improve readability and follow TypeScript conventions. This change would primarily affect two files: `packages/bootstrap-vue-next/src/types/ComponentProps.ts` and `apps/docs/src/data/components/table.data.ts`.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:384-404
Timestamp: 2025-05-28T07:57:19.915Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex and activeId watchers are intentionally designed with separation of concerns: activeIndex watcher handles activate-tab event emission and complex validation logic, while activeId watcher is kept simple for synchronization between activeId and activeIndex values only.
apps/docs/src/docs/composables/useModal.md (7)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2669
File: apps/docs/src/data/components/table.data.ts:334-336
Timestamp: 2025-04-24T20:35:48.629Z
Learning: The generic type parameter for table items should use the singular form `Item` rather than the plural `Items` to improve readability and follow TypeScript conventions. This change would primarily affect two files: `packages/bootstrap-vue-next/src/types/ComponentProps.ts` and `apps/docs/src/data/components/table.data.ts`.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:82-83
Timestamp: 2025-05-26T17:27:44.251Z
Learning: In Vue 3.3+, `toRef()` can accept any input type including raw values, existing refs, and getter functions (MaybeRefOrGetter). It will create a ref from the input or use the existing ref if one is passed. Using `toRef()` for simple property access is more performant than `computed()` because it avoids the caching overhead that computeds provide.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:384-404
Timestamp: 2025-05-28T07:57:19.915Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex and activeId watchers are intentionally designed with separation of concerns: activeIndex watcher handles activate-tab event emission and complex validation logic, while activeId watcher is kept simple for synchronization between activeId and activeIndex values only.
packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (4)
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2669
File: apps/docs/src/data/components/table.data.ts:334-336
Timestamp: 2025-04-24T20:35:48.629Z
Learning: The generic type parameter for table items should use the singular form `Item` rather than the plural `Items` to improve readability and follow TypeScript conventions. This change would primarily affect two files: `packages/bootstrap-vue-next/src/types/ComponentProps.ts` and `apps/docs/src/data/components/table.data.ts`.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
packages/bootstrap-vue-next/src/composables/useRoot.ts (5)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:85-86
Timestamp: 2025-05-26T17:28:35.902Z
Learning: In the `useBLinkTagResolver` function in `packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts`, the `routerComponentName` parameter is required and typed as `MaybeRefOrGetter<string>`, ensuring it cannot be undefined.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2669
File: apps/docs/src/data/components/table.data.ts:334-336
Timestamp: 2025-04-24T20:35:48.629Z
Learning: The generic type parameter for table items should use the singular form `Item` rather than the plural `Items` to improve readability and follow TypeScript conventions. This change would primarily affect two files: `packages/bootstrap-vue-next/src/types/ComponentProps.ts` and `apps/docs/src/data/components/table.data.ts`.
apps/docs/src/docs/composables/usePopover.md (7)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:622-626
Timestamp: 2025-06-05T11:43:10.793Z
Learning: In migration guides, links to the old/previous version's documentation (like bootstrap-vue.org) are appropriate and helpful when explaining deprecated features, as they provide users with reference points for what they're migrating from.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:384-404
Timestamp: 2025-05-28T07:57:19.915Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex and activeId watchers are intentionally designed with separation of concerns: activeIndex watcher handles activate-tab event emission and complex validation logic, while activeId watcher is kept simple for synchronization between activeId and activeIndex values only.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:85-86
Timestamp: 2025-05-26T17:28:35.902Z
Learning: In the `useBLinkTagResolver` function in `packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts`, the `routerComponentName` parameter is required and typed as `MaybeRefOrGetter<string>`, ensuring it cannot be undefined.
apps/docs/src/docs/composables/useToast.md (5)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2669
File: apps/docs/src/data/components/table.data.ts:334-336
Timestamp: 2025-04-24T20:35:48.629Z
Learning: The generic type parameter for table items should use the singular form `Item` rather than the plural `Items` to improve readability and follow TypeScript conventions. This change would primarily affect two files: `packages/bootstrap-vue-next/src/types/ComponentProps.ts` and `apps/docs/src/data/components/table.data.ts`.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
apps/docs/src/docs/migration-guide.md (6)
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:622-626
Timestamp: 2025-06-05T11:43:10.793Z
Learning: In migration guides, links to the old/previous version's documentation (like bootstrap-vue.org) are appropriate and helpful when explaining deprecated features, as they provide users with reference points for what they're migrating from.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: unstoppablecarl
PR: bootstrap-vue-next/bootstrap-vue-next#2671
File: packages/bootstrap-vue-next/src/components/BToast/_toast.scss:1-3
Timestamp: 2025-04-27T17:30:42.045Z
Learning: In global SCSS files for bootstrap-vue-next, `:deep()` combinator should not be used as it only works in Vue's scoped style blocks. Standard CSS/SCSS selectors should be used instead.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2679
File: apps/docs/.vitepress/theme/Layout.vue:0-0
Timestamp: 2025-05-01T23:40:56.146Z
Learning: In bootstrap-vue-next, the `useScrollspy` hook returns an object with a `current` property which is the ID string (or null) of the currently active item, not an object containing an ID.
packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue (7)
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:384-404
Timestamp: 2025-05-28T07:57:19.915Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex and activeId watchers are intentionally designed with separation of concerns: activeIndex watcher handles activate-tab event emission and complex validation logic, while activeId watcher is kept simple for synchronization between activeId and activeIndex values only.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:85-86
Timestamp: 2025-05-26T17:28:35.902Z
Learning: In the `useBLinkTagResolver` function in `packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts`, the `routerComponentName` parameter is required and typed as `MaybeRefOrGetter<string>`, ensuring it cannot be undefined.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:425-430
Timestamp: 2025-05-28T07:32:45.658Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex synchronization within sortTabs() is necessary and correct. When sorting tabs by DOM position, indices change, so activeIndex must be updated immediately to maintain consistency with activeId. This is not an unwanted side effect but a required consequence of the sorting operation.
🧬 Code Graph Analysis (1)
packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (2)
packages/bootstrap-vue-next/src/utils/classes.ts (1)
  • BvTriggerableEvent (68-90)
packages/bootstrap-vue-next/src/types/ComponentProps.ts (4)
  • BToastProps (1290-1315)
  • BTooltipProps (1353-1355)
  • BPopoverProps (1317-1351)
  • BModalProps (1363-1426)
🪛 LanguageTool
apps/docs/src/docs/composables/useModal.md

[uncategorized] ~13-~13: This verb may not be in the correct tense. Consider changing the tense to fit the context better.
Context: ...ginAlert /> ## BOrchestrator You must have initialized BOrchestrator component once and only...

(AI_EN_LECTOR_REPLACEMENT_VERB_TENSE)


[uncategorized] ~13-~13: You might be missing the article “the” here.
Context: ...Orchestrator You must have initialized BOrchestrator component once and only o...

(AI_EN_LECTOR_MISSING_DETERMINER_THE)


[uncategorized] ~13-~13: A comma may be missing after the conjunctive/linking adverb ‘Also’.
Context: ...ultiple may display multiple Modals). Also you need to provide the Orchestrator re...

(SENT_START_CONJUNCTIVE_LINKING_ADVERB_COMMA)


[uncategorized] ~13-~13: You might be missing the article “the” here.
Context: ...o provide the Orchestrator registy. use BApp component wrapping your app to ini...

(AI_EN_LECTOR_MISSING_DETERMINER_THE)


[style] ~99-~99: Unless you want to emphasize “not”, use “cannot” which is more common.
Context: ...ontrol to be desired. For instance, you can not add HTML to any slot value. This is whe...

(CAN_NOT_PREMIUM)


[misspelling] ~148-~148: Did you mean “at a time”, “at the time”, or “at times”?
Context: ...create` method will resolve the promise at time of hiding the modal, rather than waitin...

(AT_TIME2)


[style] ~180-~180: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...s function sets the props of the modal. This is useful for updating the modal after ...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[style] ~184-~184: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...d. - destroy: () => Promise<void> This function destroys the modal and cleans ...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[uncategorized] ~187-~187: Did you mean: “By default,”?
Context: ...ces associated with it. ### Lifecycle By default the modal is destroyed once it's closed...

(BY_DEFAULT_COMMA)


[uncategorized] ~188-~188: Possible missing comma found.
Context: ...ce it's closed. If you want to keep the modal use the option 'keep' in the second arg...

(AI_HYDRA_LEO_MISSING_COMMA)


[style] ~206-~206: As a shorter alternative for ‘able to’, consider using “can also”.
Context: ... create modals in a global context, you are also able to hide modals from anywhere in the app. T...

(BE_ABLE_TO)

apps/docs/src/docs/composables/usePopover.md

[uncategorized] ~13-~13: This verb may not be in the correct tense. Consider changing the tense to fit the context better.
Context: ...ginAlert /> ## BOrchestrator You must have initialized BOrchestrator component once and only...

(AI_EN_LECTOR_REPLACEMENT_VERB_TENSE)


[uncategorized] ~13-~13: You might be missing the article “the” here.
Context: ...Orchestrator You must have initialized BOrchestrator component once and only o...

(AI_EN_LECTOR_MISSING_DETERMINER_THE)


[uncategorized] ~13-~13: A comma may be missing after the conjunctive/linking adverb ‘Also’.
Context: ...tiple may display multiple Popovers). Also you need to provide the Orchestrator re...

(SENT_START_CONJUNCTIVE_LINKING_ADVERB_COMMA)


[uncategorized] ~13-~13: You might be missing the article “the” here.
Context: ...o provide the Orchestrator registy. use BApp component wrapping your app to ini...

(AI_EN_LECTOR_MISSING_DETERMINER_THE)

apps/docs/src/docs/composables/useToast.md

[uncategorized] ~13-~13: This verb may not be in the correct tense. Consider changing the tense to fit the context better.
Context: ...ginAlert /> ## BOrchestrator You must have initialized BOrchestrator component once and only...

(AI_EN_LECTOR_REPLACEMENT_VERB_TENSE)


[uncategorized] ~13-~13: You might be missing the article “the” here.
Context: ...Orchestrator You must have initialized BOrchestrator component once and only o...

(AI_EN_LECTOR_MISSING_DETERMINER_THE)


[uncategorized] ~13-~13: A comma may be missing after the conjunctive/linking adverb ‘Also’.
Context: ...ultiple may display multiple Toasts). Also you need to provide the Orchestrator re...

(SENT_START_CONJUNCTIVE_LINKING_ADVERB_COMMA)


[uncategorized] ~13-~13: You might be missing the article “the” here.
Context: ...o provide the Orchestrator registy. use BApp component wrapping your app to ini...

(AI_EN_LECTOR_MISSING_DETERMINER_THE)

apps/docs/src/docs/migration-guide.md

[style] ~572-~572: Consider removing “of” to be more concise
Context: .../ModalConfirm.vue The create accepts all of the properties that are defined on [BModal]...

(ALL_OF_THE)

🪛 markdownlint-cli2 (0.17.2)
apps/docs/src/docs/composables/useModal.md

153-153: Multiple consecutive blank lines
Expected: 1; Actual: 2

(MD012, no-multiple-blanks)

apps/docs/src/docs/composables/useToast.md

1-1: First line in a file should be a top-level heading

(MD041, first-line-heading, first-line-h1)

🪛 GitHub Check: test-lint
packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue

[warning] 104-104:
Unexpected console statement

🔇 Additional comments (20)
packages/bootstrap-vue-next/src/composables/useRoot.ts (2)

22-97: LGTM! Well-structured global state management.

The useRoot composable effectively implements global state management using Vue's provide/inject pattern. The conditional setup ensures services are only initialized once, and the reactive registry implementations are correctly structured.


99-140: Efficient show/hide registry implementation.

The _newShowHideRegistry function provides a clean API for managing show/hide state with proper cleanup and ID updating mechanisms. The readonly wrapper on values ensures data integrity.

apps/docs/src/docs/migration-guide.md (2)

558-574: Consistent migration guide updates.

The documentation correctly reflects the transition from useModalController to useModal and updates the API examples to use the new create method instead of show.


665-665: Consistent popover migration reference.

Correctly updates the deprecated $root events reference to point users to the new usePopover composable.

apps/docs/.vitepress/theme/Layout.vue (2)

3-154: Excellent adoption of the new BApp architecture.

The layout correctly wraps the entire application in the BApp component, which initializes the global orchestration context and replaces the need for individual orchestrator components.


159-159: Correct import update.

Properly adds BApp to the imports to support the new root component wrapper pattern.

apps/docs/src/docs/composables/usePopover.md (2)

1-29: Consistent documentation updates for the new orchestrator pattern.

The documentation correctly reflects the migration from usePopoverController to usePopover and the new BOrchestrator component usage.


145-151: Updated imports align with new composable names.

The import statements correctly reflect the transition to the new usePopover composable and maintain compatibility with the orchestrator pattern.

apps/docs/src/docs/composables/useToast.md (2)

1-30: Comprehensive documentation updates for toast orchestration.

The documentation successfully migrates all references from useToastController to useToast and correctly explains the new BOrchestrator usage pattern.


249-256: Import and usage examples align with new architecture.

The script setup correctly demonstrates the new useToast composable usage and import patterns, providing clear examples for developers migrating to the orchestrator approach.

packages/bootstrap-vue-next/src/composables/useProvideDefaults/index.ts (2)

6-37: LGTM! Default injection and merging logic is well implemented.

The composable correctly handles the provide/inject chain and the merging strategies. The past concern about early return breaking the chain has been resolved - the provide call always executes regardless of whether parent defaults exist.


48-83: Well-designed deep merge implementation with circular reference protection.

The deepMerge function properly handles circular references, preserves arrays, and maintains immutability by creating new objects. The isPlainObject helper provides accurate type checking.

packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue (2)

103-107: Error handling for missing registry is now properly implemented.

The console warning addresses the previous concern about silently continuing when the orchestrator registry is missing, helping developers identify configuration issues.


1-67: Well-structured orchestrator template with proper event handling.

The template effectively handles rendering of different UI element types with proper event lifecycle management and slot forwarding. The use of TransitionGroup and dynamic components is appropriate for this orchestration pattern.

packages/bootstrap-vue-next/src/composables/useModal/index.ts (3)

227-234: Component type checking correctly implemented.

The previous issue with fragile string-based component name comparison has been resolved. Now using direct type comparison with the imported BModal component, which is much more robust and won't break with minification.


29-122: Comprehensive modal orchestration implementation.

The create method provides a sophisticated promise-based API with proper reactive state management, lifecycle handling, and cleanup. The deep watching and modelValue synchronization logic is well thought out.


124-262: Well-designed modal control methods.

The show, hide, hideAll, get, and current methods provide comprehensive modal management capabilities with proper fallback handling between orchestrated and traditional modal components.

apps/docs/src/docs/composables/useModal.md (1)

1-303: Comprehensive and well-structured documentation.

The documentation effectively covers the new useModal API, including the BApp/BOrchestrator architecture, promise-based modal creation, reactivity, lifecycle management, and global modal control. The examples are clear and demonstrate practical usage patterns.

The previous issue with incorrect type references has been resolved.

packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (2)

14-26: Well-designed generic promise interface.

The unified PromiseWithComponent interface provides consistent method signatures across all orchestrator types. The previous issue with inconsistent hide method signatures has been resolved.


34-247: Comprehensive type definitions with proper discriminators.

The orchestrator array value types are well-structured with:

  • Proper type discriminators ('type': 'modal' | 'toast' | 'popover')
  • Consistent naming conventions (_self, _component)
  • Generic promise integration
  • Comprehensive slot and event handler typing

The OrchestratorArrayValue union type enables proper type discrimination at runtime.

@VividLemon
Copy link
Member

I apologize to make this point now, kind of changing my mind, but simply having a registry point that contains a few refs is nothing to be concerned about in terms of performance.

The major issue with the old size of the plugins was the scale of the business logic in them. If this logic is moved to composables, then by simply not using the composable, it is not included in the bundle (unlike the plugins).

So if the "registries" are just some .provide() of refs, then we could just be best off forcing it and making no concessions for their removal (beyond not using bapp).

Does anyone have any thoughts on this? I feel pretty bad upon thinking about this so late.

@xvaara
Copy link
Contributor Author

xvaara commented Jul 8, 2025

I apologize to make this point now, kind of changing my mind, but simply having a registry point that contains a few refs is nothing to be concerned about in terms of performance.

The major issue with the old size of the plugins was the scale of the business logic in them. If this logic is moved to composables, then by simply not using the composable, it is not included in the bundle (unlike the plugins).

So if the "registries" are just some .provide() of refs, then we could just be best off forcing it and making no concessions for their removal (beyond not using bapp).

Does anyone have any thoughts on this? I feel pretty bad upon thinking about this so late.

They are only a few provides, yes. All the logic is in the composables now anyways. So I also see no reason for the user the be able to "disable" them.

Do we want to continue supporting the plugin "way" of createBootstrap()? I don't know a way to use composables directly in them since you have to use the passed app prop for provide. In this PR i'm pulling in a function from the composable that I can just use in app.provide.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants