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 18 commits into
base: main
Choose a base branch
from
Open

draft of BApp #2732

wants to merge 18 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 BApp and BOrchestrator for app-level orchestration; new composables (useModal, useToast, usePopover, useRegistry, useProvideDefaults, useOrchestratorRegistry) with promise-based create APIs.
  • Refactor

    • Controllers consolidated into a registry/orchestrator model; orchestrators now drive toasts/modals/popovers and exports/keys standardized.
  • Bug Fixes

    • Safer behavior in non-DOM environments.
  • Documentation

    • Expanded setup, migration, and composable docs to favor BApp and the new APIs.
  • Tests

    • Added tests covering BApp.
  • Chores

    • Removed legacy plugin implementations and deprecated controller APIs.

Copy link

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

Copy link

coderabbitai bot commented Jun 6, 2025

Note

Currently processing new changes in this PR. This may take a few minutes, please wait...

📥 Commits

Reviewing files that changed from the base of the PR and between 71268e5 and 3c655f8.

📒 Files selected for processing (24)
  • apps/docs/.vitepress/theme/Layout.vue (1 hunks)
  • apps/docs/src/components/TableOfContentsNav.vue (2 hunks)
  • apps/docs/src/components/UsePluginAlert.vue (1 hunks)
  • apps/docs/src/docs.md (3 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/useModal.md (2 hunks)
  • apps/docs/src/docs/composables/usePopover.md (5 hunks)
  • apps/docs/src/docs/composables/useToast.md (7 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 (3 hunks)
  • apps/playground/src/components/Comps/TToast.vue (3 hunks)
  • packages/bootstrap-vue-next/CHANGELOG.md (1 hunks)
  • packages/bootstrap-vue-next/src/App.vue (1 hunks)
  • packages/bootstrap-vue-next/src/components/BFormGroup/BFormGroup.vue (2 hunks)
  • packages/bootstrap-vue-next/src/components/BNavbar/BNavbarToggle.vue (2 hunks)
  • packages/bootstrap-vue-next/src/types/BootstrapVueOptions.ts (6 hunks)
  • packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (6 hunks)
  • packages/bootstrap-vue-next/src/types/ComponentProps.ts (2 hunks)
  • packages/bootstrap-vue-next/src/utils/keys.ts (5 hunks)
  • packages/nuxt/CHANGELOG.md (1 hunks)
 ____________________________________________________________
< Go forth and channel your goroutines; I’ll guard the race. >
 ------------------------------------------------------------
  \
   \   (\__/)
       (•ㅅ•)
       /   づ

Walkthrough

Refactors orchestration and programmatic control for modals, toasts, and popovers: removes legacy controller plugins, introduces registry-based orchestrator components (BApp, BOrchestrator), provides new unified composables (useModal, useToast, usePopover) with promise-based create APIs, updates injection keys/types, and updates docs, tests, and examples.

Changes

Cohort / File(s) Change Summary
Core Orchestrator Components
packages/bootstrap-vue-next/src/components/BApp/BApp.vue, packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue, packages/bootstrap-vue-next/src/components/BApp/bapp.spec.ts, packages/bootstrap-vue-next/src/components/BApp/index.ts, packages/bootstrap-vue-next/src/components/index.ts
Added BApp and BOrchestrator, tests, and exports; root-level orchestrator, defaults provisioning, and public exports.
Unified Composables & Shared Orchestrator
packages/bootstrap-vue-next/src/composables/* (notably index.ts, useModal/index.ts, useToast/index.ts, usePopover/index.ts, orchestratorShared.ts, useProvideDefaults/index.ts, useRegistry.ts)
Rewrote/added composables to use a shared orchestrator registry; introduced promise-based create APIs, registry helpers, defaults provider, and orchestrator shared utilities.
Removed Legacy Controllers & Plugins
packages/.../useModalController/*, .../usePopoverController/*, .../useToastController/*, packages/bootstrap-vue-next/src/plugins/modalController/index.ts, .../popoverController/index.ts, .../toastController/index.ts, packages/bootstrap-vue-next/src/plugins/showHide/index.ts, packages/bootstrap-vue-next/src/plugins/bootstrap/index.ts, packages/bootstrap-vue-next/src/plugins/breadcrumb/index.ts
Deleted legacy controller composables and plugin implementations; replaced by registry/orchestrator approach.
Plugin System Refactor
packages/bootstrap-vue-next/src/plugins/createBootstrap/index.ts, packages/bootstrap-vue-next/src/plugins/index.ts, packages/bootstrap-vue-next/src/plugins/registry/index.ts, packages/bootstrap-vue-next/src/plugins/orchestrator/index.ts, packages/bootstrap-vue-next/src/plugins/rtl/index.ts
Replaced previous plugin set with registryPlugin and orchestratorPlugin; updated createBootstrap to conditionally install registries/orchestrator and provide defaults via new keys.
Type & Injection Key Updates
packages/bootstrap-vue-next/src/types/BootstrapVueOptions.ts, packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts, packages/bootstrap-vue-next/src/types/ComponentProps.ts, packages/bootstrap-vue-next/src/utils/keys.ts
Updated orchestrator types to generic shapes, added BApp props type, unified registry injection keys and remapped composable paths.
Component Internal Refactors & Key Refs
packages/bootstrap-vue-next/src/components/... (BModal/BPopover/BToast orchestrators), packages/bootstrap-vue-next/src/components/BFormGroup/BFormGroup.vue, packages/bootstrap-vue-next/src/components/BNavbar/BNavbarToggle.vue, packages/bootstrap-vue-next/src/composables/useFormInput.ts, packages/bootstrap-vue-next/src/composables/useBreadcrumb/index.ts, packages/bootstrap-vue-next/src/composables/useModalManager.ts, packages/bootstrap-vue-next/src/composables/useRtl.ts, packages/bootstrap-vue-next/src/composables/useShowHide.ts, packages/bootstrap-vue-next/src/composables/useToggle/index.ts, packages/bootstrap-vue-next/src/directives/BToggle/index.ts
Reworked components to consume registry/orchestrator keys, removed internal manual orchestrator rendering logic, added deprecation warnings, and updated injection key usages.
Orchestrator Renderer
packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue
New BOrchestrator component renders orchestrated items from registry store (toasts, modals, popovers) with lifecycle/event handling and positioning.
Docs, Examples & Playground
apps/docs/..., apps/playground/src/components/*, apps/docs/src/data/components/app.data.ts (many files)
Updated docs, migration guide, examples, demos, and playground to use BApp, useModal, useToast, usePopover, removed legacy orchestrator references and updated code samples and docs.
Utilities & Small Fixes
packages/bootstrap-vue-next/src/utils/getElement.ts, packages/bootstrap-vue-next/src/components/BToast/toast-orchestrator.spec.ts, apps/docs/src/docs/demo/ModalConfirm.vue, apps/docs/src/docs/demo/ModalMessageBox.vue
Made getElement SSR-safe, adjusted tests and demos to new composable APIs and small type tweaks.

Sequence Diagram(s)

sequenceDiagram
    participant App as BApp
    participant Registry as Orchestrator Registry
    participant Composable as useModal/useToast/usePopover
    participant Orchestrator as BOrchestrator
    participant Component as User Component

    App->>Registry: provide registry (store, flags)
    Component->>Composable: call create(params)
    Composable->>Registry: push/update orchestrator entry (returns PromiseWithComponent)
    Orchestrator->>Registry: watches store changes
    Orchestrator->>Component: renders dynamic component from store (props/slots)
    Component->>Composable: call control methods (show/hide/toggle/destroy)
    Composable->>Registry: update/remove entry
    Orchestrator->>Composable: resolve promise on hide/hidden events
Loading

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~90+ minutes

Possibly related issues

Possibly related PRs

Suggested reviewers

  • dwgray
  • VividLemon

Poem

"A rabbit hops with registry bright,
BApp at root, orchestrations alight.
Modals, toasts, popovers in a row,
Old controllers gone — new APIs grow.
Docs and demos dance — the bunny gives a wink. 🐇"

Tip

You can make CodeRabbit's review stricter and more nitpicky using the `assertive` profile, if that's what you prefer.

Change the reviews.profile setting in your project's settings in CodeRabbit to assertive to make CodeRabbit's nitpick more issues in your PRs.

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch bapp-composables-makeover

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.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • 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.
  • 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 the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbitai help to get the list of available commands.

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

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@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: b2f1728

@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.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I removed the inherit all together from orchestratorRegistry. Didn't wrap my head around how it would be very useful, only edge cases came to mind.

@dwgray they get the new defaults or the merged ones, depending on the options for that. useOrchestratorRegistry doesn't set any defaults, just initialises the registries that the composables use.

My idea for the filter was that you can have multible ochestrators wrapped in different defaults, so maybe filter out error toasts and center them and make them red. Not 100% sure on the idea.

@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.

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: 1

🔭 Outside diff range comments (2)
packages/bootstrap-vue-next/src/plugins/registry/index.ts (1)

63-65: Resolve TypeScript type issue instead of suppressing it.

The @ts-ignore comment suggests an underlying type issue that should be properly resolved.

The issue appears to be with the readonly typing. Consider this type-safe approach:

-      // eslint-disable-next-line @typescript-eslint/ban-ts-comment
-      // @ts-ignore
-      registry: readonly(registry) as Readonly<Ref<Map<number, ComponentInternalInstance>>>,
+      registry: readonly(registry),

If the type mismatch persists, please investigate the root cause rather than suppressing the error.

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

216-220: Update the injection key identifier in the function parameter.

The key was renamed from formGroupPluginKey to formGroupKey, but the string parameter still references the old name.

 export const formGroupKey: InjectionKey<
   (id: Ref<string>) => {
     state: Readonly<Ref<ValidationState | undefined>>
   }
-> = createBvnInjectionKey('formGroupPlugin')
+> = createBvnInjectionKey('formGroup')
♻️ Duplicate comments (1)
packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue (1)

104-107: Remove console statement for production builds.

Console statements should be avoided in production code. Consider using Vue's development-only warnings or a proper logging solution.

Replace the console statement with a development-only warning:

-  console.warn(
-    '[BOrchestrator] The orchestrator registry not found. Please use BApp, useOrchestratorRegistry or provide the plugin.'
-  )
+  if (import.meta.env.DEV) {
+    console.warn(
+      '[BOrchestrator] The orchestrator registry not found. Please use BApp, useOrchestratorRegistry or provide the plugin.'
+    )
+  }
🧹 Nitpick comments (4)
packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue (1)

119-153: Fix typo and improve style maintainability.

There's a typo in the variable name and the hardcoded style could be improved.

Apply these improvements:

 const ComputedPositionClasses = computed(() => {
-  const postisionsActive = items.value?.reduce(
+  const positionsActive = items.value?.reduce(
     (acc, item) => {
       if (item.position) {
         acc[item.position] = true
       }
       return acc
     },
     {} as Record<string, boolean>
   )
   const classes: Record<string, {class: string; style: string}> = {}
   for (const position in positionClasses) {
-    if (postisionsActive?.[position]) {
+    if (positionsActive?.[position]) {
       classes[position] = {
         class: `${
           positionClasses[position as keyof typeof positionClasses]
         } toast-container position-fixed p-3`,
-        style: 'width: calc(var(--bs-toast-max-width, 350px) + 2 * 1rem)',
+        style: 'width: calc(var(--bs-toast-max-width, 350px) + var(--bs-toast-padding-x, 1rem) * 2)',
       }
     }
   }
-  if (postisionsActive?.['modal']) {
+  if (positionsActive?.['modal']) {
     classes['modal'] = {
       class: '',
       style: '',
     }
   }
-  if (postisionsActive?.['popover']) {
+  if (positionsActive?.['popover']) {
     classes['popover'] = {
       class: '',
       style: '',
     }
   }
   return classes
 })
packages/bootstrap-vue-next/src/composables/useModal/index.ts (1)

41-122: Well-implemented orchestrator creation with proper lifecycle management.

The create method properly handles reactive props, modelValue synchronization, and cleanup. Consider extracting the modelValue synchronization logic (lines 91-102) into a helper function for better readability.

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

82-96: Flexible RTL configuration handling.

The implementation correctly handles both boolean and object forms of the rtl prop. Consider moving the default values (lines 84-85) to module-level constants for reusability.


99-140: Remove commented code.

The implementation is solid, but the commented line should be removed.

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

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

📥 Commits

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

📒 Files selected for processing (29)
  • 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/BFormGroup/BFormGroup.vue (2 hunks)
  • packages/bootstrap-vue-next/src/components/BNavbar/BNavbarToggle.vue (2 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/useBreadcrumb/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/composables/useFormInput.ts (2 hunks)
  • packages/bootstrap-vue-next/src/composables/useModal/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/composables/useModalManager.ts (2 hunks)
  • packages/bootstrap-vue-next/src/composables/usePopover/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/composables/useProvideDefaults/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/composables/useRegistry.ts (1 hunks)
  • packages/bootstrap-vue-next/src/composables/useRtl.ts (1 hunks)
  • packages/bootstrap-vue-next/src/composables/useShowHide.ts (2 hunks)
  • packages/bootstrap-vue-next/src/composables/useToast/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/composables/useToggle/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/directives/BToggle/index.ts (3 hunks)
  • packages/bootstrap-vue-next/src/plugins/bootstrap/index.ts (0 hunks)
  • packages/bootstrap-vue-next/src/plugins/breadcrumb/index.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/orchestrator/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/plugins/registry/index.ts (2 hunks)
  • packages/bootstrap-vue-next/src/plugins/rtl/index.ts (2 hunks)
  • packages/bootstrap-vue-next/src/plugins/showHide/index.ts (0 hunks)
  • packages/bootstrap-vue-next/src/types/BootstrapVueOptions.ts (6 hunks)
  • packages/bootstrap-vue-next/src/types/ComponentProps.ts (2 hunks)
  • packages/bootstrap-vue-next/src/utils/keys.ts (5 hunks)
💤 Files with no reviewable changes (3)
  • packages/bootstrap-vue-next/src/plugins/showHide/index.ts
  • packages/bootstrap-vue-next/src/plugins/bootstrap/index.ts
  • packages/bootstrap-vue-next/src/plugins/breadcrumb/index.ts
✅ Files skipped from review due to trivial changes (9)
  • packages/bootstrap-vue-next/src/components/BNavbar/BNavbarToggle.vue
  • packages/bootstrap-vue-next/src/composables/useBreadcrumb/index.ts
  • packages/bootstrap-vue-next/src/composables/useFormInput.ts
  • packages/bootstrap-vue-next/src/composables/useShowHide.ts
  • packages/bootstrap-vue-next/src/plugins/rtl/index.ts
  • packages/bootstrap-vue-next/src/directives/BToggle/index.ts
  • packages/bootstrap-vue-next/src/components/BFormGroup/BFormGroup.vue
  • packages/bootstrap-vue-next/src/composables/useRtl.ts
  • packages/bootstrap-vue-next/src/composables/useToggle/index.ts
🚧 Files skipped from review as they are similar to previous changes (9)
  • packages/bootstrap-vue-next/src/plugins/orchestrator/index.ts
  • packages/bootstrap-vue-next/src/composables/index.ts
  • packages/bootstrap-vue-next/src/types/ComponentProps.ts
  • packages/bootstrap-vue-next/src/composables/useToast/index.ts
  • packages/bootstrap-vue-next/src/components/BApp/BApp.vue
  • packages/bootstrap-vue-next/src/composables/useProvideDefaults/index.ts
  • packages/bootstrap-vue-next/src/composables/usePopover/index.ts
  • packages/bootstrap-vue-next/src/composables/orchestratorShared.ts
  • packages/bootstrap-vue-next/src/types/BootstrapVueOptions.ts
🧰 Additional context used
🧠 Learnings (13)
📓 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.
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#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: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: 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.
📚 Learning: in bootstrap-vue-next, `popoverorchestratorparam` includes an `id` field of type `controllerkey` thr...
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.

Applied to files:

  • packages/bootstrap-vue-next/src/plugins/index.ts
  • packages/bootstrap-vue-next/src/plugins/registry/index.ts
  • packages/bootstrap-vue-next/src/composables/useModal/index.ts
  • packages/bootstrap-vue-next/src/composables/useModalManager.ts
  • packages/bootstrap-vue-next/src/utils/keys.ts
  • packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue
  • packages/bootstrap-vue-next/src/plugins/createBootstrap/index.ts
📚 Learning: the generic type parameter for table items should use the singular form `item` rather than the plura...
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`.

Applied to files:

  • packages/bootstrap-vue-next/src/plugins/index.ts
  • packages/bootstrap-vue-next/src/plugins/registry/index.ts
  • packages/bootstrap-vue-next/src/composables/useModal/index.ts
  • packages/bootstrap-vue-next/src/composables/useModalManager.ts
  • packages/bootstrap-vue-next/src/utils/keys.ts
  • packages/bootstrap-vue-next/src/plugins/createBootstrap/index.ts
📚 Learning: the `` component in the bootstrap-vue-next documentation automatically renders t...
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.

Applied to files:

  • packages/bootstrap-vue-next/src/plugins/index.ts
  • packages/bootstrap-vue-next/src/composables/useModal/index.ts
  • packages/bootstrap-vue-next/src/composables/useRegistry.ts
  • packages/bootstrap-vue-next/src/utils/keys.ts
  • packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue
  • packages/bootstrap-vue-next/src/plugins/createBootstrap/index.ts
📚 Learning: in bootstrap-vue-next, the `usescrollspy` hook returns an object with a `current` property which is ...
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.

Applied to files:

  • packages/bootstrap-vue-next/src/plugins/registry/index.ts
  • packages/bootstrap-vue-next/src/composables/useModal/index.ts
  • packages/bootstrap-vue-next/src/plugins/createBootstrap/index.ts
📚 Learning: btooltip is a very thin wrapper around bpopover in bootstrap-vue-next. there is no separate `usetool...
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.

Applied to files:

  • packages/bootstrap-vue-next/src/composables/useModal/index.ts
  • packages/bootstrap-vue-next/src/composables/useModalManager.ts
  • packages/bootstrap-vue-next/src/composables/useRegistry.ts
  • packages/bootstrap-vue-next/src/utils/keys.ts
  • packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue
  • packages/bootstrap-vue-next/src/plugins/createBootstrap/index.ts
📚 Learning: in the `useblinktagresolver` function in `packages/bootstrap-vue-next/src/composables/useblinkhelper...
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.

Applied to files:

  • packages/bootstrap-vue-next/src/composables/useModal/index.ts
  • packages/bootstrap-vue-next/src/composables/useModalManager.ts
  • packages/bootstrap-vue-next/src/composables/useRegistry.ts
  • packages/bootstrap-vue-next/src/utils/keys.ts
  • packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue
  • packages/bootstrap-vue-next/src/plugins/createBootstrap/index.ts
📚 Learning: in global scss files for bootstrap-vue-next, `:deep()` combinator should not be used as it only work...
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.

Applied to files:

  • packages/bootstrap-vue-next/src/composables/useModal/index.ts
📚 Learning: in btabs component (packages/bootstrap-vue-next/src/components/btabs/btabs.vue), the complex initial...
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.

Applied to files:

  • packages/bootstrap-vue-next/src/composables/useModal/index.ts
  • packages/bootstrap-vue-next/src/composables/useRegistry.ts
  • packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue
  • packages/bootstrap-vue-next/src/plugins/createBootstrap/index.ts
📚 Learning: in btabs component (packages/bootstrap-vue-next/src/components/btabs/btabs.vue), the activeindex and...
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.

Applied to files:

  • packages/bootstrap-vue-next/src/composables/useModal/index.ts
  • packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue
📚 Learning: in vue 3.5+, the `onscopedispose` function accepts two parameters: `function onscopedispose(fn: () =...
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.

Applied to files:

  • packages/bootstrap-vue-next/src/composables/useModalManager.ts
📚 Learning: in btabs component (packages/bootstrap-vue-next/src/components/btabs/btabs.vue), the activeindex syn...
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.

Applied to files:

  • packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue
📚 Learning: in migration guides, links to the old/previous version's documentation (like bootstrap-vue.org) are ...
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.

Applied to files:

  • packages/bootstrap-vue-next/src/plugins/createBootstrap/index.ts
🧬 Code Graph Analysis (2)
packages/bootstrap-vue-next/src/composables/useRegistry.ts (2)
packages/bootstrap-vue-next/src/types/ComponentProps.ts (1)
  • BAppProps (73-96)
packages/bootstrap-vue-next/src/utils/keys.ts (7)
  • showHideRegistryKey (165-166)
  • modalManagerKey (193-202)
  • breadcrumbRegistryKey (188-191)
  • breadcrumbGlobalIndexKey (187-187)
  • rtlRegistryKey (182-185)
  • RegisterShowHideMapValue (148-157)
  • RegisterShowHideFnInput (137-146)
packages/bootstrap-vue-next/src/utils/keys.ts (2)
packages/bootstrap-vue-next/src/types/BootstrapVueOptions.ts (1)
  • BvnComponentProps (307-309)
packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (1)
  • OrchestratorArrayValue (243-247)
🪛 GitHub Check: test-lint
packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue

[warning] 104-104:
Unexpected console statement

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

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

(lint/suspicious/noSelfCompare)


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

(lint/suspicious/noSelfCompare)


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

(lint/suspicious/noSelfCompare)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build
🔇 Additional comments (10)
packages/bootstrap-vue-next/src/composables/useModalManager.ts (1)

40-44: Good fix for multi-modal scenarios!

The conditional cleanup logic correctly prevents premature removal of the modal-open class when multiple modals are open. This ensures the body class is only cleared when all modals are closed.

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

1-5: Clean plugin export consolidation.

The export changes correctly reflect the architectural shift from individual controller plugins to unified registry and orchestrator plugins.

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

28-29: Good addition for standardizing registry key creation.

The new createBvnRegistryInjectionKey function provides a clear naming convention that distinguishes registry keys from regular injection keys.


165-166: Consistent migration from plugin to registry pattern.

All key renames follow the same pattern and use the new createBvnRegistryInjectionKey function, maintaining consistency across the codebase.

Also applies to: 182-185, 188-191, 193-202, 204-205


210-214: Well-designed orchestrator registry consolidation.

The unified orchestratorRegistryKey effectively consolidates multiple orchestrator types into a single registry. Consider documenting why the boolean properties use underscore prefixes if they represent internal state.

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

29-36: Proper error handling for dependency injection.

The composable correctly validates that the orchestrator is provided and gives clear error messages.


265-269: Good deprecation strategy for backward compatibility.

The deprecated alias with clear JSDoc helps users migrate gradually.

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

23-27: Good singleton pattern for registry initialization.

The conditional creation ensures only one show/hide registry exists in the application.


29-68: Well-structured modal manager implementation.

The separation between stack (for ordering) and registry (for all modals) provides flexibility. Using component uid as the key ensures uniqueness.


70-80: Clean breadcrumb registry with sensible defaults.

The global breadcrumb key provides a good default while supporting custom keys for different breadcrumb contexts.

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 (1)
apps/docs/src/docs/components/app.md (1)

382-382: Remove debug console.log statement.

The console.log statement should be removed from the production documentation.

-console.log('BApp data', data)
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between e5c172f and 5204781.

📒 Files selected for processing (10)
  • apps/docs/src/components/TableOfContentsNav.vue (2 hunks)
  • apps/docs/src/components/UsePluginAlert.vue (1 hunks)
  • apps/docs/src/data/components/app.data.ts (1 hunks)
  • apps/docs/src/docs.md (3 hunks)
  • apps/docs/src/docs/components.md (1 hunks)
  • apps/docs/src/docs/components/app.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)
  • packages/bootstrap-vue-next/src/plugins/createBootstrap/index.ts (1 hunks)
✅ Files skipped from review due to trivial changes (2)
  • apps/docs/src/docs/components.md
  • apps/docs/src/components/UsePluginAlert.vue
🚧 Files skipped from review as they are similar to previous changes (3)
  • apps/docs/src/docs/composables/usePopover.md
  • packages/bootstrap-vue-next/src/plugins/createBootstrap/index.ts
  • apps/docs/src/components/TableOfContentsNav.vue
🧰 Additional context used
🧠 Learnings (12)
📓 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.
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#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: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: 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.
📚 Learning: in the `useblinktagresolver` function in `packages/bootstrap-vue-next/src/composables/useblinkhelper...
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.

Applied to files:

  • apps/docs/src/data/components/app.data.ts
  • apps/docs/src/docs.md
  • apps/docs/src/docs/components/app.md
📚 Learning: in bootstrap-vue-next, `popoverorchestratorparam` includes an `id` field of type `controllerkey` thr...
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.

Applied to files:

  • apps/docs/src/data/components/app.data.ts
  • apps/docs/src/docs.md
  • apps/docs/src/docs/components/app.md
  • apps/docs/src/docs/composables/useToast.md
📚 Learning: in btabs component (packages/bootstrap-vue-next/src/components/btabs/btabs.vue), the complex initial...
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.

Applied to files:

  • apps/docs/src/data/components/app.data.ts
  • apps/docs/src/docs.md
  • apps/docs/src/docs/components/app.md
  • apps/docs/src/docs/composables/useModal.md
  • apps/docs/src/docs/composables/useToast.md
📚 Learning: the `` component in the bootstrap-vue-next documentation automatically renders t...
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.

Applied to files:

  • apps/docs/src/data/components/app.data.ts
  • apps/docs/src/docs.md
  • apps/docs/src/docs/components/app.md
  • apps/docs/src/docs/composables/useModal.md
  • apps/docs/src/docs/composables/useToast.md
📚 Learning: in migration guides, links to the old/previous version's documentation (like bootstrap-vue.org) are ...
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.

Applied to files:

  • apps/docs/src/docs.md
  • apps/docs/src/docs/components/app.md
📚 Learning: the generic type parameter for table items should use the singular form `item` rather than the plura...
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`.

Applied to files:

  • apps/docs/src/docs.md
  • apps/docs/src/docs/components/app.md
  • apps/docs/src/docs/composables/useModal.md
📚 Learning: in btabs component (packages/bootstrap-vue-next/src/components/btabs/btabs.vue), the activeindex and...
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.

Applied to files:

  • apps/docs/src/docs.md
  • apps/docs/src/docs/components/app.md
📚 Learning: btooltip is a very thin wrapper around bpopover in bootstrap-vue-next. there is no separate `usetool...
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.

Applied to files:

  • apps/docs/src/docs.md
  • apps/docs/src/docs/components/app.md
  • apps/docs/src/docs/composables/useModal.md
  • apps/docs/src/docs/composables/useToast.md
📚 Learning: in global scss files for bootstrap-vue-next, `:deep()` combinator should not be used as it only work...
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.

Applied to files:

  • apps/docs/src/docs.md
  • apps/docs/src/docs/components/app.md
📚 Learning: in btabs component (packages/bootstrap-vue-next/src/components/btabs/btabs.vue), the activeindex syn...
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.

Applied to files:

  • apps/docs/src/docs/components/app.md
📚 Learning: in vue 3.3+, `toref()` can accept any input type including raw values, existing refs, and getter fun...
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.

Applied to files:

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

[grammar] ~142-~142: Ensure spelling is correct
Context: ... </HighlightCard> And you must put BOrchestrator in your app: <HighlightCard> vue <!...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)


[style] ~477-~477: ‘pick and choose’ might be wordy. Consider a shorter alternative.
Context: ...orchestratorPlugin, etc.), so you can pick and choose what is needed. The createBootstrap ...

(EN_WORDINESS_PREMIUM_PICK_AND_CHOOSE)

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

[style] ~105-~105: 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)


[style] ~186-~186: 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] ~190-~190: 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)


[grammar] ~195-~195: Ensure spelling is correct
Context: ...gument of the create method. Modal is destoyed when the current scope is exited. Or yo...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)


[style] ~212-~212: 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)

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

159-159: 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)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build
🔇 Additional comments (13)
apps/docs/src/data/components/app.data.ts (1)

1-58: LGTM! Well-structured component documentation data.

The component reference data is well-organized with comprehensive prop definitions, appropriate type annotations, and clear descriptions. The structure follows the expected pattern for bootstrap-vue-next component documentation.

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

9-36: Clear setup instructions following the new architecture.

The setup section effectively guides users toward the recommended BApp approach while maintaining backward compatibility information. The distinction between recommended and legacy approaches is well-structured.


37-254: Comprehensive examples demonstrating the new useToast API.

The code examples thoroughly cover basic usage, reactivity, advanced scenarios, and programmatic control. All examples consistently use the new useToast composable and create method, properly reflecting the architectural changes.


255-332: Script implementation matches documentation examples.

The implementation correctly uses the new useToast API and all function examples are consistent with the documentation. The imports and usage patterns align with the new architecture.

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

81-169: Comprehensive setup guidance promoting the new BApp approach.

The setup section effectively presents both approaches with clear recommendations. The BApp advantages are well-articulated and the migration guidance provides proper direction to users. The code examples are complete and accurate.


473-481: Clear explanation of tree-shaking benefits for both approaches.

The updated tree-shaking section effectively addresses bundle size concerns and explains the benefits of each approach. The technical details about bundle sizes and orchestrator functionality are helpful for users making decisions.

apps/docs/src/docs/components/app.md (4)

1-40: Clear overview and basic usage for the BApp component.

The overview effectively communicates BApp's role as the new root component and its key benefits. The basic usage example is straightforward and demonstrates the recommended setup pattern.


41-145: Comprehensive configuration examples for defaults management.

The configuration section effectively demonstrates global defaults setting, merging strategies, and custom merge functions. The examples progress logically and include appropriate TypeScript annotations.


146-204: Practical orchestrator configuration examples.

The orchestrator configuration section covers key customization scenarios with clear examples. The teleporting and disabling options are well-documented with practical use cases.


233-378: Comprehensive migration guidance and composables integration.

The migration examples provide clear before/after comparisons, and the composables integration demonstrates seamless workflow with BApp. The backward compatibility section offers practical migration steps.

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

9-67: Consistent setup guidance and clear modal creation examples.

The setup section follows the established pattern of recommending BApp while supporting legacy plugin setup. The modal creation examples effectively demonstrate the new create method and promise-based API.


103-209: Comprehensive advanced features and lifecycle management.

The advanced creation section effectively demonstrates component and slots usage, while the lifecycle management covers important patterns including manual destruction and TypeScript's await using syntax.


210-309: Practical global hiding examples with consistent implementation.

The global hiding section demonstrates practical nested modal scenarios, and the script implementation correctly uses the new useModal API throughout. All examples are consistent and demonstrate proper usage patterns.

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

♻️ Duplicate comments (1)
packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue (1)

97-107: Error handling has been improved but console.warn violates linting rules.

The warning message is helpful for developers, but the linting rule suggests avoiding console statements in production code.

The past review comment suggested adding error handling, which has been implemented. However, the static analysis tool flags the console.warn statement. Consider using a proper logging system or development-only warning:

-} else {
-  console.warn(
-    '[BOrchestrator] The orchestrator registry not found. Please use BApp, useOrchestratorRegistry or provide the plugin.'
-  )
-}
+} else if (process.env.NODE_ENV !== 'production') {
+  console.warn(
+    '[BOrchestrator] The orchestrator registry not found. Please use BApp, useOrchestratorRegistry or provide the plugin.'
+  )
+}
🧹 Nitpick comments (2)
packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue (2)

1-67: Template structure is well-organized but has some areas for improvement.

The template correctly uses Vue 3 composition patterns with proper key bindings and event handling. However, there are a few concerns:

  1. The nested v-for with destructuring creates complex template logic that could be refactored
  2. The eslint-disable comment suggests the template might be doing too much
  3. Event handlers are inline and quite complex

Consider extracting the complex item filtering and event handling to computed properties or methods:

<template>
  <div class="orchestrator-container" v-bind="$attrs">
    <div
      v-for="(value, key) in ComputedPositionClasses"
      :key="key"
      :class="value.class"
      :style="value.style"
    >
      <TransitionGroup name="b-list">
-        <!-- eslint-disable vue/no-unused-vars -->
-        <span
-          v-for="{
-            _self,
-            type,
-            position,
-            slots,
-            promise,
-            options,
-            _component,
-            ...val
-          } in items?.filter((el) => el.position === key) || []"
-          :key="_self"
-        >
+        <span
+          v-for="item in getItemsForPosition(key)"
+          :key="item._self"
+        >
           <component
-            :is="_component"
-            v-bind="val"
-            :ref="(ref: ComponentPublicInstance) => (promise.value.ref = ref)"
+            :is="item._component"
+            v-bind="item.props"
+            :ref="(ref: ComponentPublicInstance) => (item.promise.value.ref = ref)"
             initial-animation
             :teleport-disabled="true"
-            @hide="
-              (e: BvTriggerableEvent) => {
-                setEventOk(e)
-                val.onHide?.(e)
-                if (e.defaultPrevented) {
-                  return
-                }
-                promise.stop?.()
-                if (options?.resolveOnHide) {
-                  promise.resolve(e)
-                }
-              }
-            "
-            @hidden="
-              (e: BvTriggerableEvent) => {
-                setEventOk(e)
-                val.onHidden?.(e)
-                if (e.defaultPrevented) {
-                  return
-                }
-                if (!options?.resolveOnHide) {
-                  promise.resolve(e)
-                }
-                if (!options?.keep) {
-                  promise.value.destroy?.()
-                }
-              }
-            "
+            @hide="(e) => handleHideEvent(e, item)"
+            @hidden="(e) => handleHiddenEvent(e, item)"
           >
-            <template v-for="(comp, slot) in slots" #[slot]="scope" :key="slot">
+            <template v-for="(comp, slot) in item.slots" #[slot]="scope" :key="slot">
               <component :is="comp" v-bind="scope" />
             </template>
           </component>
         </span>
       </TransitionGroup>
     </div>
   </div>
 </template>

119-154: Position classes computation has performance considerations.

The computed property rebuilds the entire classes object on every change. Consider optimizing for large numbers of items.

The current implementation creates a new classes object on every computation. For better performance with many items, consider memoizing position classes:

const ComputedPositionClasses = computed(() => {
-  const positionsActive = items.value?.reduce(
-    (acc, item) => {
-      if (item.position) {
-        acc[item.position] = true
-      }
-      return acc
-    },
-    {} as Record<string, boolean>
-  )
+  const positionsActive = new Set(
+    items.value?.map(item => item.position).filter(Boolean) || []
+  )
  const classes: Record<string, {class: string; style: string}> = {}
  for (const position in positionClasses) {
-    if (positionsActive?.[position]) {
+    if (positionsActive.has(position)) {
      classes[position] = {
        class: `${
          positionClasses[position as keyof typeof positionClasses]
        } toast-container position-fixed p-3`,
        style:
          'width: calc(var(--bs-toast-max-width, 350px) + var(--bs-toast-padding-x, 1rem) * 2)',
      }
    }
  }
-  if (positionsActive?.['modal']) {
+  if (positionsActive.has('modal')) {
    classes['modal'] = {
      class: '',
      style: '',
    }
  }
-  if (positionsActive?.['popover']) {
+  if (positionsActive.has('popover')) {
    classes['popover'] = {
      class: '',
      style: '',
    }
  }
  return classes
})
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 4ee1acb and 625c549.

📒 Files selected for processing (4)
  • apps/docs/src/docs/components/app.md (1 hunks)
  • packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue (1 hunks)
  • packages/bootstrap-vue-next/src/composables/useRegistry.ts (1 hunks)
  • packages/bootstrap-vue-next/src/plugins/registry/index.ts (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
  • packages/bootstrap-vue-next/src/plugins/registry/index.ts
  • packages/bootstrap-vue-next/src/composables/useRegistry.ts
  • apps/docs/src/docs/components/app.md
🧰 Additional context used
🧠 Learnings (8)
📓 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.
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#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: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#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.
📚 Learning: in bootstrap-vue-next, `popoverorchestratorparam` includes an `id` field of type `controllerkey` thr...
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.

Applied to files:

  • packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue
📚 Learning: the `` component in the bootstrap-vue-next documentation automatically renders t...
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.

Applied to files:

  • packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue
📚 Learning: btooltip is a very thin wrapper around bpopover in bootstrap-vue-next. there is no separate `usetool...
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.

Applied to files:

  • packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue
📚 Learning: in btabs component (packages/bootstrap-vue-next/src/components/btabs/btabs.vue), the complex initial...
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.

Applied to files:

  • packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue
📚 Learning: in btabs component (packages/bootstrap-vue-next/src/components/btabs/btabs.vue), the activeindex and...
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.

Applied to files:

  • packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue
📚 Learning: in the `useblinktagresolver` function in `packages/bootstrap-vue-next/src/composables/useblinkhelper...
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.

Applied to files:

  • packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue
📚 Learning: in btabs component (packages/bootstrap-vue-next/src/components/btabs/btabs.vue), the activeindex syn...
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.

Applied to files:

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

[warning] 104-104:
Unexpected console statement

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build
🔇 Additional comments (4)
packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue (4)

76-78: Simple utility function looks correct.

The setEventOk function properly maps trigger types to boolean values and handles the null case correctly.


80-95: Props definition follows Vue 3 best practices.

The props are well-typed with appropriate defaults. The filter function prop provides good extensibility.


109-117: Watch implementation is correct and efficient.

The watcher properly handles the appendToast prop synchronization with immediate execution and proper null checks.


156-162: Items filtering is efficient and well-structured.

The computed property correctly chains filters and handles the undefined case gracefully. The filter order is logical (type filtering first, then custom filter).

@dwgray
Copy link
Member

dwgray commented Aug 9, 2025

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

Yep - I just want to be able to notice if we do something that pulls in all of BSVN (or a large part of it) for doing something like consuming BButton.

Copy link
Member

@dwgray dwgray left a comment

Choose a reason for hiding this comment

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

The only substantive comments I have are on how to structure the getting started guide and the migration guide. I did pull your code and play with it a bit and it appears to be working as advertised (and is indeed easier to use than the plugin approach) - if I have time I'll try consuming this in my app, but don't block on that. I did not fully get my head wrapped around the implementation, so I think it would be worthwhile for @VividLemon to comment.

class="py-2"
active-class="active fw-bold"
>{{ link.label }}</BNavItem
<BApp>
Copy link
Member

Choose a reason for hiding this comment

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

I'll merge #2802 once this goes in.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Well it seams @VividLemon already merged that in.

},
} satisfies Record<keyof BvnComponentProps['BApp'], PropertyReference>,
},
emits: [],
Copy link
Member

Choose a reason for hiding this comment

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

This will conflict with #2806

@dwgray
Copy link
Member

dwgray commented Aug 11, 2025

@xvaara I only had a few minutes to play with this today, but I did make a little progress.

My initial intention was to run this in "compatibility mode" - e.g. just pull in this PR via setting "bootstrap-vue-next": "https://pkg.pr.new/bootstrap-vue-next/bootstrap-vue-next@2732", and see what happens.

The good news is that my app runs fine - it's pretty straightforward I don't explicitly use plugins, but I do use a few toasts, modals, etc. and they all seem to work.

The bad news:
I have a test that explicitly uses plugins (for historical reasons, I don't really need this, but it was nice to have in this case because it failed, and if we're assuming backwards compatibility with plugins, I don't think it should fail):

import { mount } from "@vue/test-utils";
import { describe, expect, test } from "vitest";
import { MenuContext } from "@/models/MenuContext";
import MainMenu from "../MainMenu.vue";
import { mockResizObserver } from "@/helpers/TestHelpers";
import { modalControllerPlugin, modalManagerPlugin, toastPlugin } from "bootstrap-vue-next";

describe("MainMenu.vue", () => {
  test("Renders MainMenu for an anonymous user", () => {
    mockResizObserver();
    const context = new MenuContext();
    const wrapper = mount(MainMenu, {
      props: { context },
      global: { plugins: [modalControllerPlugin, modalManagerPlugin, toastPlugin] },
    });
    expect(wrapper.html()).toMatchSnapshot();
  });
});

Generated errors that BSVN doesn't export these plugins. So is this is an issue with the code, or am I misunderstanding your intent> (which may mean that we need to clarify the documentation).

I'm not blocked on this, if I have a few cycles tomorrow, I'll try doing the actual conversion to BApp and see what happens. This isn't a particularly great test case since I'm not a deep user of some of these features, but it may turn over some additional low hanging fruit.

@xvaara
Copy link
Contributor Author

xvaara commented Aug 11, 2025

The bad news: I have a test that explicitly uses plugins (for historical reasons, I don't really need this, but it was nice to have in this case because it failed, and if we're assuming backwards compatibility with plugins, I don't think it should fail):

import { mount } from "@vue/test-utils";
import { describe, expect, test } from "vitest";
import { MenuContext } from "@/models/MenuContext";
import MainMenu from "../MainMenu.vue";
import { mockResizObserver } from "@/helpers/TestHelpers";
import { modalControllerPlugin, modalManagerPlugin, toastPlugin } from "bootstrap-vue-next";

describe("MainMenu.vue", () => {
  test("Renders MainMenu for an anonymous user", () => {
    mockResizObserver();
    const context = new MenuContext();
    const wrapper = mount(MainMenu, {
      props: { context },
      global: { plugins: [modalControllerPlugin, modalManagerPlugin, toastPlugin] },
    });
    expect(wrapper.html()).toMatchSnapshot();
  });
});

Generated errors that BSVN doesn't export these plugins. So is this is an issue with the code, or am I misunderstanding your intent> (which may mean that we need to clarify the documentation).

I'm not blocked on this, if I have a few cycles tomorrow, I'll try doing the actual conversion to BApp and see what happens. This isn't a particularly great test case since I'm not a deep user of some of these features, but it may turn over some additional low hanging fruit.

There is no plugin for toast or modals anymore, it's true we'd need to document that.

export {createBootstrap} from './createBootstrap'
export {registryPlugin} from './registry'
export {rtlPlugin} from './rtl'
export {orchestratorPlugin} from './orchestrator'

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: 1

🔭 Outside diff range comments (1)
apps/docs/src/docs.md (1)

128-140: Missing import of App in plugin example

createApp(App) is used without importing App. Add the import.

 // main.js/ts
 import {createApp} from 'vue'
 import {createBootstrap} from 'bootstrap-vue-next'
+import App from './App.vue'
 
 // Add the necessary CSS
 import 'bootstrap/dist/css/bootstrap.css'
 import 'bootstrap-vue-next/dist/bootstrap-vue-next.css'
 
 const app = createApp(App)
 app.use(createBootstrap()) // Important
 app.mount('#app')
🧹 Nitpick comments (4)
apps/docs/src/docs.md (4)

83-91: Branding/casing consistency: use “BootstrapVueNext”

Use the project’s canonical name for consistency.

-Bootstrap-vue-next offers two ways to configure your application. The new **BApp component approach** is recommended for new projects, while the plugin approach is still supported for backward compatibility.
+BootstrapVueNext offers two ways to configure your application. The new **BApp component approach** is recommended for new projects, while the plugin approach is still supported for backward compatibility.

112-115: Optional: use minified CSS in production examples

Slightly reduces bytes and aligns with Nuxt example using bootstrap.min.css.

-import 'bootstrap/dist/css/bootstrap.css'
-import 'bootstrap-vue-next/dist/bootstrap-vue-next.css'
+import 'bootstrap/dist/css/bootstrap.min.css'
+import 'bootstrap-vue-next/dist/bootstrap-vue-next.min.css'

144-159: Clarify orchestrator guidance and wording

  • Improve phrasing; clarify only one orchestrator should be mounted app-wide and placed near the root.
-And you must put BOrchestrator in your app:
+You must also include a single BOrchestrator near the root of your app:

Would you like to add a short note here: “Only one BApp or BOrchestrator should be active at a time” to prevent duplicate orchestration?


469-469: Confirm/soften gzipped size claim (~20kb)

Bundle sizes drift; either verify the current size or soften the claim to avoid stale numbers.

Option A — verify and keep:

  • Confirm with your existing Vite size check and update the number if it changed.

Option B — soften wording:

-The `createBootstrap` plugin is approximately ~20kb gzipped, with orchestrator functionality accounting for the majority. Use individual plugin imports if you want the tiniest possible bundle size.
+The `createBootstrap` plugin is small (on the order of a few tens of KB gzipped), with orchestrator functionality accounting for most of it. Use individual plugin imports for the smallest possible bundle.
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 625c549 and b2f1728.

📒 Files selected for processing (1)
  • apps/docs/src/docs.md (3 hunks)
🧰 Additional context used
🧠 Learnings (3)
📓 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.
📚 Learning: 2025-05-28T07:01:55.095Z
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.

Applied to files:

  • apps/docs/src/docs.md
📚 Learning: 2025-05-23T23:58:07.165Z
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.

Applied to files:

  • apps/docs/src/docs.md
🧬 Code Graph Analysis (1)
apps/docs/src/docs.md (4)
apps/docs/.vitepress/theme/index.ts (1)
  • enhanceApp (14-35)
packages/nuxt/src/runtime/createBootstrap.ts (1)
  • nuxtApp (4-35)
packages/bootstrap-vue-next/src/plugins/createBootstrap/index.ts (1)
  • install (17-38)
packages/bootstrap-vue-next/src/types/BootstrapVueOptions.ts (1)
  • BootstrapVueOptions (151-194)
🪛 LanguageTool
apps/docs/src/docs.md

[style] ~467-~467: ‘pick and choose’ might be wordy. Consider a shorter alternative.
Context: ...orchestratorPlugin, etc.), so you can pick and choose what is needed. The createBootstrap ...

(EN_WORDINESS_PREMIUM_PICK_AND_CHOOSE)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build
🔇 Additional comments (2)
apps/docs/src/docs.md (2)

93-106: BApp setup example looks good

Example correctly shows local registration via script setup import and no plugin usage. LGTM.

Also applies to: 108-121


465-468: Docs plugin names are accurate; optional wording tweak
The plugins listed in the docs (registryPlugin, orchestratorPlugin, etc.) exactly match the actual exports (registryPlugin, orchestratorPlugin, rtlPlugin). No changes are required to the plugin names.

Optional: improve clarity in apps/docs/src/docs.md (lines 465–468)

-… so you can pick and choose what is needed.
+… so you can select only what you need.

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 (5)
apps/docs/src/docs.md (5)

83-83: Use consistent project naming (BootstrapVueNext vs package name)

Prefer “BootstrapVueNext” (project/brand) here, or explicitly refer to the npm package as “bootstrap-vue-next” when needed. Current casing/hyphenation is inconsistent with the rest of the page.

Apply this minimal copy edit:

- Bootstrap-vue-next offers two ways to configure your application. The new **BApp component approach** is recommended for new projects, while the plugin approach is still supported for backward compatibility.
+ BootstrapVueNext offers two ways to configure your application. The new **BApp component approach** is recommended for new projects, while the plugin approach is still supported for backward compatibility.

93-105: Consider adding a short “advanced props” example for BApp

A brief follow-up snippet showing BApp props (e.g., defaults/mergeDefaults, teleportTo, rtl, disabling orchestrators) would help users discover key capabilities without jumping to the component page.

For example, right after the basic snippet, include:

<!-- Advanced (optional) -->
<BApp
  :defaults="{BButton: {variant: 'primary'}}"
  mergeDefaults="deep"
  :teleport-to="document.body"
  :noToasts="false"
  :noModals="false"
  :noPopovers="true"
  :rtl="{rtlInitial: true, localeInitial: 'ar'}"
/>

144-144: Tighten grammar for imperative instruction

Rephrase for clarity and tone.

-And you must put BOrchestrator in your app:
+You must include <BOrchestrator /> in your app:

122-159: Add a Note: ensure only one orchestrator (or one BApp) is active

The orchestrator should be a singleton. With the plugin approach, call out that only one should exist in the app (and not alongside BApp) to avoid duplicate global controllers.

Proposed note, immediately below the snippet:

<NoteAlert>
Use either a single <BApp> or a single <BOrchestrator /> at a time. Do not mount both simultaneously, and do not create multiple orchestrators.
</NoteAlert>

465-466: Avoid absolute claims about tree-shaking

Tree-shaking depends on bundler config and usage patterns. Slightly soften the language.

-When using the **BApp component approach**, you automatically get optimal tree-shaking as only the components and composables you actually use are included in your bundle.
+When using the **BApp component approach**, you typically get optimal tree-shaking because only the components and composables you use are included in your bundle.
📜 Review details

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

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between b2f1728 and 71268e5.

📒 Files selected for processing (1)
  • apps/docs/src/docs.md (3 hunks)
🧰 Additional context used
🧠 Learnings (3)
📓 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.
📚 Learning: 2025-05-28T07:01:55.095Z
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.

Applied to files:

  • apps/docs/src/docs.md
📚 Learning: 2025-05-23T23:58:07.165Z
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.

Applied to files:

  • apps/docs/src/docs.md
🪛 LanguageTool
apps/docs/src/docs.md

[grammar] ~144-~144: Ensure spelling is correct
Context: ... </HighlightCard> And you must put BOrchestrator in your app: <HighlightCard> vue <!...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)


[style] ~467-~467: ‘pick and choose’ might be wordy. Consider a shorter alternative.
Context: ...orchestratorPlugin, etc.), so you can pick and choose what is needed. The createBootstrap ...

(EN_WORDINESS_PREMIUM_PICK_AND_CHOOSE)

🔇 Additional comments (3)
apps/docs/src/docs.md (3)

89-89: Correct docs link path to BApp docs — looks good

Thanks for fixing the link to point to /docs/components/app. This matches the actual file/route.


469-469: Back up the gzipped size claim (~20kb) or add a caveat

Bundle size varies by build tooling, versions, and options. Either include a measured reference (with date/tooling), or qualify the statement more strongly.

Suggested copy if not providing measurements:

-The `createBootstrap` plugin is approximately ~20kb gzipped, with orchestrator functionality accounting for the majority. Use individual plugin imports if you want the tiniest possible bundle size.
+The `createBootstrap` plugin is typically on the order of tens of kilobytes gzipped (exact size varies by tooling and versions), with orchestrator functionality accounting for much of it. Use individual plugin imports to minimize bundle size.

If you have recent measurements (e.g., Vite + Rollup, Node x.y, OS), please add them parenthetically for transparency.


467-468: Confirm plugin exports; apply wording tweak

  • The plugin exports registryPlugin, orchestratorPlugin, and rtlPlugin are correctly defined and re-exported in packages/bootstrap-vue-next/src/plugins/index.ts.
  • Minor wording update applied as suggested.
-When using the **plugin approach**, `createBootstrap` is a utility that provides everything required for the library to work. However, some plugins may not be needed and can be individually imported. All plugins are appended with `Plugin` (`registryPlugin`, `orchestratorPlugin`, etc.), so you can pick and choose what is needed.
+When using the **plugin approach**, `createBootstrap` is a utility that provides everything required for the library to work. However, some plugins may not be needed and can be individually imported. All plugins are suffixed with `Plugin` (e.g., `registryPlugin`, `orchestratorPlugin`), so you can select only what you need.

…keover

* upstream/main: (21 commits)
  feat(b-form-rating): add `icon-clear` slot (#2809)
  docs: fix dead links, enable rule (#2808)
  chore: release main (#2801)
  docs: Fix navbar collapse behavior (#2802)
  docs: fix code tabs on getting started and icons pages (#2805)
  docs: fix missing data and use a stronger schema to catch missing errors (#2806)
  feat(BPopover): add explicit props for focus and hover triggers (#2795)
  fix(BNavbar): changed autoClose to noAutoClose and fix the documention mistake about it.
  fix: ssr in scrollspy
  docs: clean up css selector
  docs: fix on-this-page when examples use header tags
  docs(migration): add component aliases guidelines (#2771)
  chore: upgrade dependencies and address all lint warnings (#2785)
  chore: release main (#2769)
  fix(BDropdown): prevent hydration warning in nuxt production mode (#2768)
  docs(BTabs): Updates based on v-model changes (#2760)
  docs(table): fix missing anchor in `BTableLite` and `BTableSimple` links (#2759)
  docs(BFormRating): Parity pass (#2749)
  docs: fix typo in breadcrumb documentation (#2756)
  docs: Fix empty-text and empty-filtered-text description as they require show-empty to be set (#2755)
  ...
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