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

draft of BApp #2732

wants to merge 24 commits into from

Conversation

xvaara
Copy link
Contributor

@xvaara xvaara commented Jun 6, 2025

BEGIN_COMMIT_OVERRIDE
feat!: new BApp component as the recommended way to configure bootstrap-vue-next applications, replacing the plugin-based approach.
feat!: Merged the Orchestrator components into one.
feat!: renamed the controller composables to useToast, useModal, and usePopover
feat!: combined the old plugins to match the new BApp and composables.
feat!: the old useModal was removed since useToggle does all what it did.

Release-As: 0.40.0
END_COMMIT_OVERRIDE

Summary by CodeRabbit

  • New Features

    • Added BApp (app root) and BOrchestrator for centralized overlays; new composables useModal, useToast, usePopover with create()-based APIs and unified stores.
  • Refactor

    • Consolidated legacy controller/plugins into a registry/orchestrator model; simplified orchestrator rendering and APIs.
  • Documentation

    • Added BApp/BOrchestrator docs, updated setup, migration guides, composable and component docs, demos, and examples.
  • Tests

    • Added tests covering BApp.
  • Chores

    • Minor changelog and docs formatting cleanup.

Copy link

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

Copy link

coderabbitai bot commented Jun 6, 2025

Walkthrough

Replaces legacy controller plugins with a registry/orchestrator system: adds BApp/BOrchestrator, new registry-backed composables (useModal/useToast/usePopover) with promise-based create/store APIs, migrates injection keys/types/exports, removes old plugins, and updates docs, demos, tests, and types accordingly.

Changes

Cohort / File(s) Summary
New App & 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/index.ts, packages/bootstrap-vue-next/src/components/BApp/bapp.spec.ts, packages/bootstrap-vue-next/src/components/index.ts
Adds BApp and BOrchestrator components, exports, and tests; BApp provides registries/defaults and conditionally mounts orchestrator.
Composable overhaul & shared utilities
packages/bootstrap-vue-next/src/composables/useModal/index.ts, .../useToast/index.ts, .../usePopover/index.ts, .../orchestratorShared.ts, .../useProvideDefaults/index.ts, .../useRegistry.ts, .../index.ts
Rewrites modal/toast/popover APIs to registry-driven composables exposing create/store/promise controllers; adds buildPromise, orchestrator registry helpers, provideDefaults and registry management; consolidates exports and deprecated aliases.
Plugins refactor / orchestrator plugin
packages/bootstrap-vue-next/src/plugins/createBootstrap/index.ts, .../index.ts, .../orchestrator/index.ts, .../registry/index.ts, .../rtl/index.ts
Replaces many controller plugins with registryPlugin and orchestratorPlugin, simplifies createBootstrap to conditionally install those and provide defaults.
Remove legacy controller plugins
packages/bootstrap-vue-next/src/plugins/modalController/index.ts, .../popoverController/index.ts, .../toastController/index.ts, .../bootstrap/index.ts, .../breadcrumb/index.ts, .../showHide/index.ts
Deletes or strips legacy plugin implementations and their programmatic APIs; removes old provide/inject plugin keys.
Injection keys & registry keys
packages/bootstrap-vue-next/src/utils/keys.ts
Replaces plugin-based injection keys with registry-style keys; adds orchestratorRegistryKey and renames/updates many keys (breadcrumb/rtl/modalManager/showHide/defaults/formGroup).
Orchestrator component simplifications & deprecations
packages/bootstrap-vue-next/src/components/BModal/BModalOrchestrator.vue, .../BPopover/BPopoverOrchestrator.vue, .../BToast/BToastOrchestrator.vue
Simplifies orchestrator components to conditionally render BOrchestrator, removes manual instance loops, switches to new composables, adds deprecation warnings.
Types & props unification
packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts, .../BootstrapVueOptions.ts, .../ComponentProps.ts
Introduces generic PromiseWithComponent and OrchestratorArrayValue union, unifies orchestrator option types, adds BApp/BOrchestrator props/types and composable path mappings.
App/main & demo changes
packages/bootstrap-vue-next/src/App.vue, packages/bootstrap-vue-next/src/main.ts
App demo simplified to use BApp; removal of createBootstrap usage from main.ts.
Docs, theme & site updates
apps/docs/.vitepress/theme/Layout.vue, apps/docs/.vitepress/theme/index.ts, apps/docs/src/docs.md, many docs under apps/docs/src/docs/**
Wraps docs in BApp, removes direct orchestrator components from layout, adds BApp setup docs, migration guide, and updates docs/examples from use*Controller → useModal/useToast/usePopover and create-based invocation.
Docs data & navigation
apps/docs/src/data/components/app.data.ts, apps/docs/src/data/components/orchestrator.data.ts, apps/docs/src/components/TableOfContentsNav.vue, apps/docs/src/docs/components/app.md, apps/docs/src/docs/components.md
Adds docs metadata for BApp/BOrchestrator and updates component/composable navigation lists.
Playground & demo migration
apps/playground/src/components/Comps/TModal.vue, .../TToast.vue, packages/nuxt/playground/app.vue, apps/docs/src/docs/demo/ModalConfirm.vue, apps/docs/src/docs/demo/ModalMessageBox.vue
Updates demos/playground/nuxt examples to use new composables (create/store), adjust template bindings and types/initial values.
Key consumers & small refactors
packages/bootstrap-vue-next/src/components/BFormGroup/BFormGroup.vue, .../BNavbar/BNavbarToggle.vue, .../directives/BToggle/index.ts, .../composables/useBreadcrumb/index.ts, .../useFormInput.ts, .../useModalManager.ts, .../useRtl.ts, .../useShowHide.ts, .../useToggle/index.ts
Switches imports/injection keys to registry variants, small modal manager cleanup (conditional body class removal), and minor import renames.
Tests & changelogs
packages/bootstrap-vue-next/src/components/BToast/toast-orchestrator.spec.ts, packages/bootstrap-vue-next/CHANGELOG.md, packages/nuxt/CHANGELOG.md
Adjusted test assertions for orchestrator class; formatting-only changelog edits.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor U as User
  participant App as App Root
  participant BApp as BApp
  participant Reg as Orchestrator Registry
  participant Orch as BOrchestrator
  participant Comp as Page Component
  participant UseModal as useModal()
  participant Store as Orchestrator Store

  U->>App: load app
  App->>BApp: render root slot
  BApp->>Reg: provide orchestrator & registries
  BApp->>Orch: optionally mount orchestrator (teleport)

  U->>Comp: trigger "open modal"
  Comp->>UseModal: const { create } = useModal()
  UseModal->>Store: create({ props, slots }) -> add entry
  Orch->>Store: renders modal entry from store
  U->>Orch: interact (ok/cancel)
  Orch->>Store: resolve promise with BvTriggerableEvent
  Store-->>Comp: Promise resolves (ok/trigger)
  Orch->>Store: cleanup/destroy (depending on options)
Loading

Estimated code review effort

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

Possibly related issues

Possibly related PRs

Suggested reviewers

  • dwgray
  • VividLemon

Poem

I’m a rabbit in the code-bush glade,
I build a registry where widgets parade.
BApp hums softly; create() calls bloom,
Modals and toasts find a tidy room.
Hooray — orchestration hopped into the app! 🐇✨

Tip

🔌 Remote MCP (Model Context Protocol) integration is now available!

Pro plan users can now connect to remote MCP servers from the Integrations page. Connect with popular remote MCPs such as Notion and Linear to add more context to your reviews and chats.

✨ 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: 3037973

@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

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (10)
packages/bootstrap-vue-next/CHANGELOG.md (5)

160-161: Fix typo: “corrent” → “correct” (twice)

- - **BTabs:** corrent classes on ssr ([2b37c18](https://github.com/bootstrap-vue-next/bootstrap-vue-next/commit/2b37c18dbe64ac430943361e0a67d86206a7e21e))
- - **BTabs:** corrent classes on ssr ([#2664](https://github.com/bootstrap-vue-next/bootstrap-vue-next/issues/2664)) ([2b37c18](https://github.com/bootstrap-vue-next/bootstrap-vue-next/commit/2b37c18dbe64ac430943361e0a67d86206a7e21e))
+ - **BTabs:** correct classes on SSR ([2b37c18](https://github.com/bootstrap-vue-next/bootstrap-vue-next/commit/2b37c18dbe64ac430943361e0a67d86206a7e21e))
+ - **BTabs:** correct classes on SSR ([#2664](https://github.com/bootstrap-vue-next/bootstrap-vue-next/issues/2664)) ([2b37c18](https://github.com/bootstrap-vue-next/bootstrap-vue-next/commit/2b37c18dbe64ac430943361e0a67d86206a7e21e))

132-137: Fix typo: “versitile” → “versatile” (multiple occurrences)

These appear in BModal/BOffcanvas notes.

- - **BOffcanvas:** remove nofocus prop and add more versitile focus prop
- - **BModal:** remove autofocus and autofocusButton props and add more versitile focus prop
+ - **BOffcanvas:** remove nofocus prop and add more versatile focus prop
+ - **BModal:** remove autofocus and autofocusButton props and add more versatile focus prop

242-247: Fix component name typo: “BDdropdown” → “BDropdown” (two spots)

- - **BDdropdown:** Replace click event on split button with split-click
+ - **BDropdown:** Replace click event on split button with split-click
...
- - **BDdropdown:** Replace click event on split button with split-click ([a9b59c8](https://github.com/bootstrap-vue-next/bootstrap-vue-next/commit/a9b59c8ee53b755b3b9644a4dff90ea4728b77521))
+ - **BDropdown:** Replace click event on split button with split-click ([a9b59c8](https://github.com/bootstrap-vue-next/bootstrap-vue-next/commit/a9b59c8ee53b755b3b9644a4dff90ea4728b77521))

589-591: Fix typo: “failback” → “fallback”

- - **BAvatar:** failback on image load error ([#2281](https://github.com/bootstrap-vue-next/bootstrap-vue-next/issues/2281)) ([a51327f](https://github.com/bootstrap-vue-next/bootstrap-vue-next/commit/a51327f2721aa373329258ff8e551f57c123b394))
+ - **BAvatar:** fallback on image load error ([#2281](https://github.com/bootstrap-vue-next/bootstrap-vue-next/issues/2281)) ([a51327f](https://github.com/bootstrap-vue-next/bootstrap-vue-next/commit/a51327f2721aa373329258ff8e551f57c123b394))

804-805: Fix typo: “Fixe” → “Fix”

- - **BLink:** Fixe stretch/stretched property issue ([fed1e13](https://github.com/bootstrap-vue-next/bootstrap-vue-next/commit/fed1e13b40d7b8289883061cbffbce12c4318d87))
+ - **BLink:** Fix stretch/stretched property issue ([fed1e13](https://github.com/bootstrap-vue-next/bootstrap-vue-next/commit/fed1e13b40d7b8289883061cbffbce12c4318d87))
packages/bootstrap-vue-next/src/types/BootstrapVueOptions.ts (2)

162-181: Make RTL config keys optional to match docs and BAppProps

The rtl object currently requires rtlInitial and localeInitial, but the PR docs and BAppProps show both as optional with defaults. Also, requiring localeInitial but allowing undefined is awkward.

Suggested type adjustment:

 export interface BootstrapVueOptions {
@@
   rtl?:
     | boolean
     | {
-        /**
-         * @default false
-         */
-        rtlInitial: boolean
-        /**
-         * @default undefined
-         */
-        localeInitial: string | undefined
+        /**
+         * @default false
+         */
+        rtlInitial?: boolean
+        /**
+         * @default undefined
+         */
+        localeInitial?: string
       }

120-121: Ensure BPopoverOrchestrator has proper props typing

Verification confirms that BPopoverOrchestrator is still exported (packages/bootstrap-vue-next/src/components/BPopover/index.ts), its .vue file exists, and the props type BPopoverOrchestratorProps is defined (packages/bootstrap-vue-next/src/types/ComponentProps.ts). The only remaining issue is that in BootstrapVueOptions.ts it’s incorrectly typed as never.

Please update the mapping in packages/bootstrap-vue-next/src/types/BootstrapVueOptions.ts (around lines 302–304):

-  BPopoverOrchestrator: never
+  BPopoverOrchestrator: ComponentProps.BPopoverOrchestratorProps
packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (1)

70-110: Restore id?: ControllerKey on orchestrator params for stable programmatic control

Previous API and docs indicate ability to address instances via an id. The new Param types dropped id. Reintroducing optional id preserves programmatic control and aligns with learned behavior.

 export type ToastOrchestratorParam = Omit<BToastProps, 'modelValue'> & {
+  'id'?: ControllerKey
@@
 }
@@
 export type TooltipOrchestratorParam = Omit<BTooltipProps, 'body' | 'title' | 'modelValue'> & {
+  'id'?: ControllerKey
@@
 }
@@
 export type PopoverOrchestratorParam = Omit<BPopoverProps, 'body' | 'title' | 'modelValue'> & {
+  'id'?: ControllerKey
@@
 }
@@
 export type ModalOrchestratorParam = Omit<BModalProps, 'body' | 'title' | 'modelValue'> & {
+  'id'?: ControllerKey
@@
 }

Also applies to: 133-149, 170-186, 206-225

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

60-61: Correct API description: it’s create(...), not a show method, that can return a promise when configured.

The text mentions a “show method returns a promise,” which doesn’t match the examples. For toasts, create(...) can resolve a promise when resolveOnHide is set; otherwise you operate the returned controller (e.g., destroy()).

-The `show` method returns a `promise` that is resolved then the toast closes. You can give toast a unique id. Since `Toasts` are fluid and can move around a lot, returning the index at a given point in time is not ideal for as its position may be changed in the array. So, for use with the `remove` method, you need to give a unique identifier
+`create(...)` can return a promise when you pass `{ resolveOnHide: true }` in the second argument. Otherwise, it returns a controller you can use to manage the toast (e.g., `destroy()`).
+Give each toast a unique `id` if you need to reference it later. Because toasts are fluid and can reorder, relying on array indices is unreliable; prefer a stable `id` for operations like `remove`.

183-185: Fix misleading comment: create does not return a symbol.

Docs above use the returned controller (e.g., destroy()). Update the comment to reflect the actual return type.

-  // `create` returns a symbol
+  // `create` returns a controller object with control methods (e.g., destroy())
♻️ Duplicate comments (2)
apps/docs/src/docs.md (1)

60-60: BApp docs link path looks correct now (matches route).

The link now points to /docs/components/app, which aligns with the file/components routes. Good catch and fix.

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

122-129: Copy/paste type fix looks resolved.

The earlier incorrect OrchestratedToast type usage in modal docs is no longer present. Thanks for fixing.

🧹 Nitpick comments (32)
packages/nuxt/CHANGELOG.md (1)

1-1: Suppress markdownlint MD024 for repeated section headers in this changelog

The repeated “### Miscellaneous Chores” and “### Dependencies” headers per release trigger MD024 (no-duplicate-heading). This is a common false positive for changelogs. Add a per-file disable to avoid noisy lint failures.

Apply this diff near the top of the file:

 # Changelog
+
+<!-- markdownlint-disable MD024 -->

Optionally re-enable at EOF:

+<!-- markdownlint-enable MD024 -->

Also applies to: 19-19, 23-23, 33-33, 37-37, 47-47, 51-51, 61-61, 65-65, 75-75, 79-79, 93-93

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

3-5: Improve accessibility and clarity: code-format plugin name and use descriptive link text

  • Wrap createBootstrap in code formatting for consistency.
  • Replace “here” with descriptive link text for better a11y and scannability.

Apply this diff:

-    If not using <code>&lt;BApp&gt;</code>, you must have initialized the createBootstrap plugin for
+    If not using <code>&lt;BApp&gt;</code>, you must have initialized the <code>createBootstrap</code> plugin for
@@
-    <BLink :to="withBase('/docs#plugin-approach-legacy')">here</BLink>
+    <BLink :to="withBase('/docs#plugin-approach-legacy')">the legacy plugin approach</BLink>
apps/playground/src/components/Comps/TToast.vue (4)

11-11: Debug output is hard to read; consider pretty-printing or summarizing

Directly rendering the filtered array will show “[object Object]”. For quick dev introspection, pretty-print or show a count.

Apply one of the following diffs:

Option A (pretty-print JSON):

-        {{ store.filter((el) => el.type === 'toast') }}
+        <pre class="text-monospace">{{ JSON.stringify(store.filter((el) => el.type === 'toast'), null, 2) }}</pre>

Option B (show a simple count):

-        {{ store.filter((el) => el.type === 'toast') }}
+        {{ store.filter((el) => el.type === 'toast').length }} toasts in store

39-44: Minor: “modelValue” likely suffices without “active”

If the new create API opens the toast based on modelValue alone, “active: true” is redundant.

If redundant, simplify:

-    create({
-      modelValue: true,
-      active: true,
-      title: 'foobar',
-    })
+    create({
+      modelValue: true,
+      title: 'foobar',
+    })

57-64: Guard parseInt and avoid recomputation inside computed

Slight robustness/readability improvement: normalize the digit once and default safely to 0.

-    create(
-      computed(() => ({
-        ...firstRef.value,
-        variant: (Number.parseInt(firstRef.value.body?.charAt(2) ?? '0') % 2 === 0
-          ? 'danger'
-          : 'info') as ColorVariant,
-      }))
-    )
+    create(
+      computed(() => {
+        const digit = Number.parseInt(firstRef.value.body?.charAt(2) ?? '0', 10) || 0
+        return {
+          ...firstRef.value,
+          variant: (digit % 2 === 0 ? 'danger' : 'info') as ColorVariant,
+        }
+      })
+    )

68-71: Update comment to reflect the new API

The pseudocode still references show(); update to create() to prevent confusion for readers.

-  //   show({
+  //   create({
   //     component: import('./MyToastComponent.vue'),
   //   })
packages/bootstrap-vue-next/CHANGELOG.md (3)

1-3: Silence MD024 (duplicate headings) for changelog structure

markdownlint flags repeated "### Features"/"### Bug Fixes" headings (MD024), which are intentional in a versioned changelog. Disable MD024 at the top of this file to keep CI green without changing the content structure.

Apply this patch near the top:

-# Changelog
+# Changelog
+
+<!-- markdownlint-disable MD024 no-duplicate-heading -->
+<!-- Reason: CHANGELOG intentionally repeats 'Features'/'Bug Fixes' per release section -->

And (optional) re-enable at EOF:

+<!-- markdownlint-enable MD024 no-duplicate-heading -->

30-31: Deduplicate identical entry in 0.30.2/Features

Same commit (018daa5) is listed twice; keep one (ideally the PR-linked one) to reduce noise.

 - **BDropdown:** allow setting icon prop on nested BButton ([018daa5](https://github.com/bootstrap-vue-next/bootstrap-vue-next/commit/018daa52bb85373f48092ed8a4a46901692645ff))
-- **BDropdown:** allow setting icon prop on nested BButton ([#2746](https://github.com/bootstrap-vue-next/bootstrap-vue-next/issues/2746)) ([018daa5](https://github.com/bootstrap-vue-next/bootstrap-vue-next/commit/018daa52bb85373f48092ed8a4a46901692645ff))
+ - **BDropdown:** allow setting icon prop on nested BButton ([#2746](https://github.com/bootstrap-vue-next/bootstrap-vue-next/issues/2746)) ([018daa5](https://github.com/bootstrap-vue-next/bootstrap-vue-next/commit/018daa52bb85373f48092ed8a4a46901692645ff))

If you prefer commit+PR context, remove the first line and keep the second.


98-99: Optional: tighten language in performance note

Minor wording polish; feel free to skip if you want to keep commit messages verbatim.

- - use getter functions over computed in some cases ([34d2a8f](https://github.com/bootstrap-vue-next/bootstrap-vue-next/commit/34d2a8f850dd965100ccbbcd8c00f05baceb6caa))
+ - prefer getter functions over computed in some cases ([34d2a8f](https://github.com/bootstrap-vue-next/bootstrap-vue-next/commit/34d2a8f850dd965100ccbbcd8c00f05baceb6caa))
packages/bootstrap-vue-next/src/types/BootstrapVueOptions.ts (1)

200-201: Props typing: BApp/BOrchestrator mapped to BAppProps—confirm intended API

Mapping BOrchestrator to BAppProps is likely intentional given orchestration config is shared. If the intent is to restrict BOrchestrator’s public props (e.g., omit defaults/mergeDefaults), consider a narrower type alias to avoid future accidental exposure.

Example:

export type BOrchestratorPublicProps = Pick<ComponentProps.BAppProps, 'appendToast' | 'rtl' | 'teleportTo' | 'noOrchestrator'>

Also applies to: 238-239

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

114-121: Consider unifying options typing and resolve payloads

  • Tooltip resolve currently restricts to BvTriggerableEvent, while others accept BvTriggerableEvent | boolean | null. For consistency with PromiseWithComponent’s union, widen Tooltip’s resolve payload.
  • Modal uses ModalOrchestratorCreateOptions while others use OrchestratorCreateOptions. If no behavioral difference, prefer the unified type to reduce duplication.
-    resolve: (value: BvTriggerableEvent) => void
+    resolve: (value: BvTriggerableEvent | boolean | null) => void
-  'options': ModalOrchestratorCreateOptions
+  'options': OrchestratorCreateOptions

If Modal’s options must remain distinct for public API compatibility, consider documenting the difference inline to avoid confusion.

Also applies to: 150-169, 187-205


52-63: Rename comment to reflect actual intent

Minor: The comment “Convert it to be the same name as useModal.” reads like an internal note. Either remove it or clarify the public-facing rationale (e.g., “Mirror modelValue naming used across orchestrators”).

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

136-157: Unify hide signature between RegisterShowHideFnInput and RegisterShowHideMapValue

RegisterShowHideFnInput.hide accepts only (trigger?: string), but RegisterShowHideMapValue.hide accepts (trigger?: string, noTraverse?: boolean). If the extra parameter is needed downstream, the input signature should match to prevent unsafe callsites.

Suggested change:

 export type RegisterShowHideFnInput = {
@@
-  hide: (trigger?: string) => Promise<boolean | string>
+  hide: (trigger?: string, noTraverse?: boolean) => Promise<boolean | string>
apps/docs/src/docs/components/popover.md (2)

7-8: Docs correctly updated to reference usePopover

Switching to usePopover aligns with the new unified API. If an alias usePopoverController still exists for backwards compatibility, consider a short deprecation note to aid migration.


78-79: Grammar: “Alternately” → “Alternatively”

Minor wording improvement.

-[usePopover](/docs/composables/usePopover). Alternately, you can set the `manual` prop
+[usePopover](/docs/composables/usePopover). Alternatively, you can set the `manual` prop
apps/docs/src/docs/demo/ModalMessageBox.vue (1)

18-22: Consider formatting the result for readability when it may be an event object

create can return a BvTriggerableEvent; rendering that directly will display “[object Object]”. Consider mapping the union to a user-friendly string for the demo.

Example outside the selected lines:

<script setup lang="ts">
import {computed} from 'vue'

const displayResult = computed(() =>
  typeof okResult.value === 'boolean'
    ? String(okResult.value)
    : okResult.value?.type ?? 'prevented'
)
</script>

And in template (outside the selected lines), replace:

<div>Result: {{ okResult }}</div>

with:

<div>Result: {{ displayResult }}</div>
apps/docs/src/docs/demo/ModalConfirm.vue (1)

18-23: Mirror the “result” display improvement to avoid “[object Object]”

As with the message box, returning a BvTriggerableEvent will render poorly in the demo. Consider a small mapping for display purposes.

Example outside the selected lines:

import {computed} from 'vue'

const displayConfirm = computed(() =>
  typeof confirmResult.value === 'boolean'
    ? (confirmResult.value ? 'confirmed' : 'canceled')
    : confirmResult.value?.type ?? 'prevented'
)

And in template (outside the selected lines), replace:

<div>Result: {{ confirmResult ?? 'null' }}</div>

with:

<div>Result: {{ displayConfirm }}</div>
apps/docs/src/docs/migration-guide.md (2)

617-621: Grammar and clarity improvements around useModal section

Tighten phrasing and grammar.

Apply this diff:

-In holding with the Vue3 first philosophy, BootstrapVueNext provides a composable called [`useModal`](/docs/composables/useModal) that
-fills the same needs (and more).
-
-Please read the [`useModal`](/docs/composables/useModal) documentation and then come back here for examples of replacements
-for `msgBoxOk` and `msgBoxConfirm`.
+In keeping with a Vue 3–first philosophy, BootstrapVueNext provides a composable called [`useModal`](/docs/composables/useModal) that fills the same needs (and more).
+
+Please read the [`useModal`](/docs/composables/useModal) documentation, then return here for examples replacing
+`msgBoxOk` and `msgBoxConfirm`.

631-633: Concise phrasing for the create API description

Minor wording improvement.

Apply this diff:

-The `create` accepts all of the properties that are defined on
-[BModal](/docs/components/modal#component-reference).
+The `create` method accepts all properties defined on
+[BModal](/docs/components/modal#component-reference).
apps/docs/.vitepress/theme/Layout.vue (1)

65-83: Address TODO: make theme dropdown spacing configurable

Noted TODO about adjusting padding in the theme dropdown. Exposing a prop like menuClass or buttonContentClass on BNavItemDropdown would solve this without ad-hoc CSS.

If you want, I can draft a small PR to add a menuClass/buttonContentClass prop to BNavItemDropdown and update docs.

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

357-357: Tighten wording (“pick and choose”).

Minor style improvement for concision.

-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.
+However, some plugins may not be needed and can be individually imported. All plugins are appended with `Plugin` (`registryPlugin`, `orchestratorPlugin`, etc.), so you can select only what you need.

359-360: Clarify bundle-size statement or mark as approximate.

Since bundle sizes can drift, consider marking this as approximate or linking to a periodic benchmark page.

Would you like a small script that builds the docs sandbox and reports gzipped sizes for createBootstrap to keep this number fresh across releases?


283-284: Fix “effect” → “affect”.

Typo in the tree-shaking note.

-This is mainly for the purpose of naming conflicts with other imports. It should not effect tree-shaking
+This is mainly for the purpose of naming conflicts with other imports. It should not affect tree-shaking

365-366: Fix typo (“doeing” → “doing”).

Small typo in the exposed methods note.

-In order to correctly type exposed methods, you need to explicitly import them from BootstrapVueNext. When doeing this,
+In order to correctly type exposed methods, you need to explicitly import them from BootstrapVueNext. When doing this,
apps/docs/src/docs/composables/useToast.md (2)

141-141: Typo: “psuedocode” → “pseudocode”.

-  // Demonstration psuedocode, you can also import a component and use it
+  // Demonstration pseudocode, you can also import a component and use it

51-54: Unify import path for useToast.

Use a single canonical import path throughout the page to avoid confusion. Suggest the top-level export for simplicity.

-import {useToast} from 'bootstrap-vue-next/composables/useToast'
+import {useToast} from 'bootstrap-vue-next'

Also applies to: 255-256

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

138-142: Avoid variable shadowing (popover function vs. popover variable).

Using the same name for the function and returned controller is confusing. Rename the variable in both examples.

-const popover = popover({title: 'Hello World!'})
-popover.show()
+const ctrl = popover({title: 'Hello World!'})
+ctrl.show()
 // do something
-popover.destroy()
+ctrl.destroy()
-await using popover = popover({title: 'Hello World!'})
+await using ctrl = popover({title: 'Hello World!'})

Also applies to: 147-148

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

105-107: “can not” → “cannot”, and clarify slot guidance.

-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. This is where the `component` property comes into play. Using the `component` property, you can input the component to render. This can either be an imported SFC or an inline render function
+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 using props alone. This is where the `component` property comes into play. Using the `component` property, you can input the component to render. This can either be an imported SFC or an inline render function.

139-139: Typo: “psuedocode” → “pseudocode”.

-  // Demonstration psuedocode, you can import a component and use it
+  // Demonstration pseudocode, you can import a component and use it

194-196: Fix grammar and spelling in lifecycle notes.

-By default the modal is destroyed once it's closed. If you want to keep the modal use the option 'keep' in the second argument of the `create` method.
-Modal is destoyed when the current scope is exited. Or you can destroy it manually by calling the `destroy` method.
+By default, the modal is destroyed once it's closed. If you want to keep the modal, use the `keep` option in the second argument of the `create` method.
+The modal is destroyed when the current scope is exited. You can also destroy it manually by calling the `destroy` method.

212-213: Align orchestrator wording with BApp/BOrchestrator and tighten phrasing.

-In addition to being able to create modals in a global context, you are also able to hide modals from anywhere in the app. This specific feature does not require that `BModalOrchestrator` exists
+In addition to creating modals in a global context, you can also hide modals from anywhere in the app. This feature does not require an orchestrator component to be present.

216-216: Remove trailing whitespace.

Static analysis flagged trailing whitespace on this line.

- 
+
📜 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 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)
🚧 Files skipped from review as they are similar to previous changes (6)
  • packages/bootstrap-vue-next/src/components/BNavbar/BNavbarToggle.vue
  • apps/docs/src/docs/components/modal.md
  • packages/bootstrap-vue-next/src/components/BFormGroup/BFormGroup.vue
  • packages/bootstrap-vue-next/src/types/ComponentProps.ts
  • apps/docs/src/components/TableOfContentsNav.vue
  • apps/playground/src/components/Comps/TModal.vue
🧰 Additional context used
🧠 Learnings (4)
📚 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
  • apps/docs/src/components/UsePluginAlert.vue
📚 Learning: 2025-04-28T22:48:46.738Z
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/types/BootstrapVueOptions.ts
  • apps/docs/src/docs/composables/usePopover.md
  • packages/bootstrap-vue-next/src/utils/keys.ts
  • packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts
  • apps/docs/src/docs/components/popover.md
📚 Learning: 2025-06-26T19:46:19.333Z
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/composables/usePopover.md
  • apps/docs/src/docs/migration-guide.md
  • apps/docs/src/docs/composables/useToast.md
  • apps/playground/src/components/Comps/TToast.vue
  • packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts
  • apps/docs/src/docs/components/popover.md
  • apps/docs/src/docs/components/toast.md
📚 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/.vitepress/theme/Layout.vue
  • packages/bootstrap-vue-next/CHANGELOG.md
🧬 Code Graph Analysis (3)
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/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)
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 (1289-1314)
  • BTooltipProps (1354-1356)
  • BPopoverProps (1316-1352)
  • BModalProps (1366-1429)
🪛 LanguageTool
apps/docs/src/docs.md

[style] ~357-~357: ‘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/migration-guide.md

[grammar] ~617-~617: There might be a mistake here.
Context: ...Modal`](/docs/composables/useModal) that fills the same needs (and more). Please...

(QB_NEW_EN)


[grammar] ~620-~620: There might be a mistake here.
Context: ...e back here for examples of replacements for msgBoxOk and msgBoxConfirm. Exa...

(QB_NEW_EN)


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


[grammar] ~631-~631: There might be a mistake here.
Context: ...ll of the properties that are defined on [BModal](/docs/components/modal#componen...

(QB_NEW_EN)

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)


[grammar] ~154-~154: There might be a mistake here.
Context: ...create` method will resolve the promise at time of hiding the modal, rather than w...

(QB_NEW_EN)


[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] ~194-~194: There might be a mistake here.
Context: ... second argument of the create method. Modal is destoyed when the current scope...

(QB_NEW_EN)


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

apps/docs/src/docs/components/popover.md

[grammar] ~78-~78: There might be a mistake here.
Context: ...ternately, you can set the manual prop and use the [v-model](#programmatic-co...

(QB_NEW_EN)

apps/docs/src/docs/components/toast.md

[grammar] ~13-~13: Ensure spelling is correct
Context: ...asts` are generated in a global context programatically, like showing a success message after s...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

🪛 markdownlint-cli2 (0.17.2)
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)

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

216-216: Trailing spaces
Expected: 0 or 2; Actual: 1

(MD009, no-trailing-spaces)

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)

packages/bootstrap-vue-next/CHANGELOG.md

16-16: Multiple headings with the same content

(MD024, no-duplicate-heading)


22-22: Multiple headings with the same content

(MD024, no-duplicate-heading)


28-28: Multiple headings with the same content

(MD024, no-duplicate-heading)


33-33: Multiple headings with the same content

(MD024, no-duplicate-heading)


45-45: Multiple headings with the same content

(MD024, no-duplicate-heading)


60-60: Multiple headings with the same content

(MD024, no-duplicate-heading)


67-67: Multiple headings with the same content

(MD024, no-duplicate-heading)


80-80: Multiple headings with the same content

(MD024, no-duplicate-heading)


89-89: Multiple headings with the same content

(MD024, no-duplicate-heading)

packages/nuxt/CHANGELOG.md

19-19: Multiple headings with the same content

(MD024, no-duplicate-heading)


23-23: Multiple headings with the same content

(MD024, no-duplicate-heading)


33-33: Multiple headings with the same content

(MD024, no-duplicate-heading)


37-37: Multiple headings with the same content

(MD024, no-duplicate-heading)


47-47: Multiple headings with the same content

(MD024, no-duplicate-heading)


51-51: Multiple headings with the same content

(MD024, no-duplicate-heading)


61-61: Multiple headings with the same content

(MD024, no-duplicate-heading)


65-65: Multiple headings with the same content

(MD024, no-duplicate-heading)


75-75: Multiple headings with the same content

(MD024, no-duplicate-heading)


79-79: Multiple headings with the same content

(MD024, no-duplicate-heading)


93-93: Multiple headings with the same content

(MD024, no-duplicate-heading)

🔇 Additional comments (12)
packages/nuxt/CHANGELOG.md (1)

7-7: Formatting normalization LGTM

List marker normalization and indentation look consistent and non-destructive. No content or semantics changed. Good cleanup.

Also applies to: 11-15, 21-21, 25-29, 35-35, 39-43, 49-49, 53-57, 63-63, 67-71, 77-77, 81-85, 91-91, 95-99

apps/docs/src/components/UsePluginAlert.vue (2)

3-5: Aligns with BApp-first guidance—LGTM

Messaging correctly reflects that plugin init is only required when not using BApp and points to the legacy plugin approach.


5-5: Anchor “plugin-approach-legacy” Exists in Documentation

The slug “plugin-approach-legacy” correctly matches the heading in apps/docs/src/docs.md (line 93):

### Plugin Approach (Legacy)

No broken-link risk—no changes needed.

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

22-25: Migration to the new useToast API looks correct

Import path and destructuring to {create, store} align with the new API. Good change.


54-55: Passing a ref object to create is supported and matches the new API

Good use of a reactive ref to drive a toast’s props.

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

20-21: BApp/BOrchestrator path mappings look correct

BApp and BOrchestrator entries in componentsWithExternalPath are sensible and align with the new architecture.

Also applies to: 93-94


138-152: Composable path remapping LGTM

Consolidating controller aliases (useModalController/useToastController/usePopoverController) to their base composable paths is consistent and reduces surface area.

Also applies to: 153-155

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

14-26: Verify AsyncDisposable Availability

I searched the codebase and found no local declaration of AsyncDisposable, nor any TS config in packages/bootstrap-vue-next that opts into a lib providing it. Without either a lib entry or a global type, this interface extension will cause compile errors.

• No interface AsyncDisposable or type AsyncDisposable found anywhere.
• Only tsconfig files are under templates/vite (libs: ES2020, DOM, DOM.Iterable) and apps/docs/tsconfig.app.json (libs: ESNext, DOM, DOM.Iterable), neither of which apply to the library build.
• No tsconfig.json in packages/bootstrap-vue-next declares esnext.asyncdispose or similar.

Two safe options:

  • Remove the extends:
    -export interface PromiseWithComponentInternal<T, P> extends AsyncDisposable {
    +export interface PromiseWithComponentInternal<T, P> {
  • Or add a minimal global declaration (e.g. in global.d.ts or a shared types file):
    interface AsyncDisposable {
      [Symbol.asyncDispose](): void | Promise<void>
    }

Please confirm which approach you’ll take and ensure your build TS config includes the necessary lib if you keep the extends.

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

165-167: Registry-based keys consolidation looks good

Migrating to createBvnRegistryInjectionKey for show/hide, RTL, breadcrumb, modal manager, defaults, and orchestrator aligns with BApp’s registry architecture.

Also applies to: 182-186, 188-192, 193-203, 205-206, 210-215

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

9-15: Migration to useModal looks correct and typed appropriately

Imports and typing align with the new API. Using a type-only import for BvTriggerableEvent and destructuring create from useModal is spot on.

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

9-15: Good migration: useModal + expanded typing

Switching to useModal with a create call and widening confirmResult to include BvTriggerableEvent matches the new orchestration pattern.

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

125-132: Confirm return-type terminology and behavior.

You describe a promise that resolves to a BvTriggerableEvent with methods (show, hide, etc.). Ensure this matches the actual return shape (controller with a promise vs. promise that yields a controller). If the controller is returned immediately and also “thenable,” clarify that in wording to reduce confusion.

Do you want me to align this section’s phrasing with the actual usePopover() implementation after checking the type definitions?

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

♻️ Duplicate comments (1)
apps/docs/src/data/components/app.data.ts (1)

1-52: Heads-up: possible conflict with #2806

Echoing the prior note: this file may conflict with #2806. Please ensure the docs data registry stays consistent post-merge.

🧹 Nitpick comments (8)
packages/nuxt/playground/app.vue (2)

6-8: Consider migrating playground to BApp for parity with the recommended setup

To mirror the new recommended integration path, consider wrapping the playground with BApp and dropping explicit BToastOrchestrator/BModalOrchestrator here. Also ensure you don’t end up with two active orchestrator providers (PR notes: only one BApp/orchestrator should be active at a time).


168-168: Remove unused useModal() call

useModal() is invoked but its return value isn’t used. Drop it to reduce noise unless you plan to programmatically control modals here.

Apply:

- useModal()
apps/docs/src/data/components/app.data.ts (6)

9-13: Tighten the defaults type and clarify wording

The leading object | is redundant and overly broad. Recommend documenting the actual accepted shapes.

Apply this diff:

-        defaults: {
-          type: 'object |  Partial<BvnComponentProps> | Ref<Partial<BvnComponentProps>>',
-          default: undefined,
-          description: 'Default props for components. Can be an object or a ref.',
-        },
+        defaults: {
+          type: 'Partial<BvnComponentProps> | Ref<Partial<BvnComponentProps>>',
+          default: undefined,
+          description: 'Default props for components. Can be a plain object or a Ref.',
+        },

15-19: Align mergeDefaults signature with types and clarify behavior

  • Use parameter names that match the public type (oldDefaults, newDefaults) to avoid confusion.
  • Clarify that false implies replace semantics and that the built-in boolean merge is shallow.

Apply this diff:

-        mergeDefaults: {
-          type: 'boolean | ((defaults: Partial<BvnComponentProps>, newDefaults: Partial<BvnComponentProps>) => Partial<BvnComponentProps>)',
-          default: true,
-          description:
-            'If `true`, merges defaults with existing defaults. If a function, it will be called with the current defaults and the new defaults',
-        },
+        mergeDefaults: {
+          type:
+            'boolean | ((oldDefaults: Partial<BvnComponentProps>, newDefaults: Partial<BvnComponentProps>) => Partial<BvnComponentProps>)',
+          default: true,
+          description:
+            'If `true`, performs a shallow merge with existing defaults (if `false`, replaces them). If a function, it receives (oldDefaults, newDefaults) and must return the merged defaults.',
+        },

20-25: Avoid “plugin” wording for noOrchestrator

Within BApp, this toggles rendering the orchestration layer, not a plugin. Suggest clearer phrasing.

Apply this diff:

         noOrchestrator: {
           type: 'boolean',
           default: false,
           description:
-            'If `true`, disables the orchestrator plugin. This is useful if you want to use the app without the orchestrator functionality',
+            'If `true`, disables the orchestration layer (Modal/Toast/Popover controllers) inside BApp.',
         },

37-42: Optional: clarify rtl boolean semantics

Minor clarity: note that true enables RTL, false disables it; the object form sets initial values.

Apply this diff:

         rtl: {
           type: 'boolean | { rtlInitial?: boolean; localeInitial?: string }',
           default: false,
           description:
-            'If an object, it can specify initial RTL state and locale. If `false`, disables RTL mode.',
+            'If `true`, enables RTL. If an object, you can set initial RTL state and locale. If `false`, disables RTL.',
         },

46-49: Add a helpful description for the default slot

This slot is how users render their app content; calling it out improves discoverability.

Apply this diff:

         default: {
-          description: '',
+          description: 'App content. Attributes on <BApp> are forwarded to this slot.',
         },

31-36: Update teleportTo type to match Vue Teleport’s to prop

The official TeleportProps['to'] is typed as string | RendererElement | null | undefined (where RendererElement is an Element in the browser). Our docs currently narrow this to HTMLElement and omit undefined.

• File: apps/docs/src/data/components/app.data.ts
– Line 32: change the type field

         teleportTo: {
-          type: 'string | HTMLElement | null',
+          type: 'string | Element | null | undefined',
           default: null,
           description:
             'Specifies the element to which the toasts, modals and popovers should be teleported. This is useful if you want to move them to a different part of the DOM.',
         },
📜 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 3c655f8 and d491f39.

📒 Files selected for processing (2)
  • apps/docs/src/data/components/app.data.ts (1 hunks)
  • packages/nuxt/playground/app.vue (1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (1)
apps/docs/src/data/components/app.data.ts (2)
apps/docs/src/types/index.ts (2)
  • ComponentReference (59-74)
  • PropRecord (17-17)
packages/bootstrap-vue-next/src/types/ComponentProps.ts (1)
  • BAppProps (73-96)
⏰ 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 (3)
packages/nuxt/playground/app.vue (1)

169-169: LGTM: migrated to useToast()

Switch to the new composable looks correct. With BToastOrchestrator present in the template, toast.show(...) should work as expected.

apps/docs/src/data/components/app.data.ts (2)

1-2: Imports and typing look correct

Using BAppProps from the package and local ComponentReference/PropRecord aligns with the docs data system.


43-43: Great use of satisfies to keep docs in sync with props

This guards against drift between documented props and the actual BAppProps surface.

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
apps/docs/src/docs/composables/useToast.md (2)

60-71: Fix API references: “show” → “create”, and clarify promise semantics.

The composable exposes create, not show. Also clarify when a promise is returned.

-The `show` method returns a `promise` that is resolved then the toast closes. You can give toast a unique id. Since `Toasts` are fluid and can move around a lot, returning the index at a given point in time is not ideal for as its position may be changed in the array. So, for use with the `remove` method, you need to give a unique identifier
+The `create` function returns a controller you can use to manage the toast. If you pass `{resolveOnHide: true}` as the second argument, it also returns a promise that resolves when the toast closes. You can give a toast a unique `id`. Since toasts are fluid and can move around, returning an array index is not ideal (it can change). For use with `remove`, provide a stable unique identifier.
@@
-### Show Options
+### Create options
@@
-The `show` method accepts an object with the following values `props` and `component`
+The `create` function accepts an object with the following keys: `props` and `component`.

176-190: Fix comment and prop name: controller type and modelValue.

  • create returns a controller (not just a symbol) exposing destroy.
  • Use modelValue for visibility to match Vue 3 conventions and the other examples in this page.
-  // `create` returns a symbol
+  // `create` returns a controller with methods like `destroy()`
   toast = create({
     title: 'Showing',
-    value: true,
+    modelValue: true,
     variant: 'success',
     position: 'bottom-center',
   })
apps/docs/src/docs/components/toast.md (1)

34-36: Broken example: v-model key doesn’t match ref name

Template uses v-model="active" but script defines isActive. This will confuse readers and won’t work.

-const isActive = ref(false)
+const active = ref(false)
🧹 Nitpick comments (21)
apps/docs/src/docs/components/popover.md (1)

7-7: Complete the sentence (“usePopover composable”).

Add the missing noun to avoid a dangling reference.

-directive. Popovers can also be created and programmatically controlled via the `usePopover`
+directive. Popovers can also be created and programmatically controlled via the `usePopover` composable.
apps/docs/.vitepress/theme/Layout.vue (1)

355-359: Fix console warning to log computed value.

You’re logging the computed ref object instead of its value.

-    console.warn('Unexpected header structure:', headers, 'Root items:', root)
+    console.warn('Unexpected header structure:', headers.value, 'Root items:', root)
apps/docs/src/docs.md (4)

54-61: Consistency and wording nits (“BootstrapVueNext”, “set up”).

Minor copyedits for brand consistency and verb form.

-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.
@@
-The modern way to setup bootstrap-vue-next using the `BApp` component:
+The modern way to set up BootstrapVueNext using the `BApp` component:

93-131: Clarify orchestrator note (tone).

Small wording tweak to read more like an instruction and less like a requirement.

-And you must put BOrchestrator in your app:
+Add BOrchestrator at your app root:

353-360: Avoid duplicate “Tree-shaking” headings (MD024).

Rename the subsection to avoid repeating the same heading text.

-### Tree-shaking
+### JavaScript tree-shaking

365-366: Tighten phrasing (“In order to” → “To”).

Concise and clearer.

-In order to correctly type exposed methods, you need to explicitly import them from BootstrapVueNext. When doing this,
+To correctly type exposed methods, explicitly import them from BootstrapVueNext. When doing this,
apps/docs/src/docs/migration-guide.md (2)

617-621: Polish phrasing and align with naming.

Improve clarity and align with “Vue 3–first” wording.

-In holding with the Vue3 first philosophy, BootstrapVueNext provides a composable called [`useModal`](/docs/composables/useModal) that
-fills the same needs (and more).
+In keeping with the Vue 3–first philosophy, BootstrapVueNext provides a composable called [`useModal`](/docs/composables/useModal) that
+covers the same use cases (and more).
@@
-Please read the [`useModal`](/docs/composables/useModal) documentation and then come back here for examples of replacements
+Please read the [`useModal`](/docs/composables/useModal) documentation and then return here for examples of replacements

633-635: Clarify subject (“create method” and concision).

Name the method and remove unnecessary words.

-The `create` accepts all of the properties that are defined on
+The `create` method accepts all properties defined on
 [BModal](/docs/components/modal#component-reference).
apps/docs/src/docs/composables/useToast.md (3)

66-67: Typo: “effects” → “affects”; singular possessive.

Minor correctness fixes.

-The props property corresponds to mostly that of the `BToast` components props. The props object, in addition to the props declared on `BToast`, includes `position`. The `position` value effects its position, its type is [Container Position](/docs/types#containerposition)
+The `props` object mostly corresponds to `BToast`’s props. In addition to the props declared on `BToast`, it includes `position`. The `position` value affects placement; its type is [ContainerPosition](/docs/types#containerposition).

68-71: Section title and text: “Show” → “Create”.

Align terminology with API.

-### Reactivity Within Show
+### Reactivity within create
@@
-`show` props property can accept a `MaybeRefOrGetter`, meaning that you can make properties reactive
+The `props` property can accept a `MaybeRefOrGetter`, allowing reactive values.

109-113: Typo: “reactvity” → “reactivity”.

Minor spelling fix.

-Using props can work for most situations, but it leaves some finer control to be desired. For instance, you can add HTML to any `slot` value. This can either be an imported SFC or an inline render function. For reactvity, you must use a getter function.
+Using props can work for most situations, but it leaves some finer control to be desired. For instance, you can add HTML to any `slot` value. This can either be an imported SFC or an inline render function. For reactivity, you must use a getter function.
packages/bootstrap-vue-next/src/composables/useModal/index.ts (5)

29-37: Improve error message to reflect BApp-based setup (and not “plugin”).

The error still references “the plugin,” which conflicts with the new BApp-first pattern. Clarify the guidance to point users to BApp/BOrchestrator.

-  if (!controller) {
-    throw Error(
-      'useModal() was called outside of the setup() function! or the plugin is not provided.'
-    )
-  }
+  if (!controller) {
+    throw Error(
+      'useModal() must be called within setup(), and BApp (orchestrator) must be installed/provided.'
+    )
+  }

45-49: Outdated component name in error message (“BModalOrchestrator”)

The message references BModalOrchestrator, but orchestrators were merged in this PR. Point to BOrchestrator (mounted by BApp).

-      throw new Error(
-        'The BModalOrchestrator component must be mounted to use the modal controller'
-      )
+      throw new Error(
+        'BOrchestrator must be mounted (automatically via <BApp>) to use the modal controller'
+      )

51-53: Verify “id” presence in ModalOrchestratorCreateParam

You rely on obj.id to seed the controller key, but ModalOrchestratorParam (in the provided types file) doesn’t show an id field. If id is only inherited in some orchestrator types (per previous learnings for Popover), ensure ModalOrchestratorParam explicitly includes it, or switch to a consistent field (e.g., _self) for all orchestrators.

If id is not guaranteed on Modals, consider supporting both id and _self when resolving the controller key:

-    const _self = resolvedProps.value?.id || Symbol('Modals controller')
+    const _self =
+      (resolvedProps.value as any)?.id ??
+      (resolvedProps.value as any)?._self ??
+      Symbol('Modals controller')

115-121: Remove extraneous onScopeDispose argument

onScopeDispose only takes a single cleanup function; the trailing true is ignored and adds noise.

-    onScopeDispose(() => {
+    onScopeDispose(() => {
       const modal = store.value.find((el) => el._self === _self)
       if (modal) {
         modal.promise.value.destroy?.()
       }
-    }, true)
+    })

129-152: Avoid duplicated stack scan paths in show(id)

You already search the stack via stackModal; the fallback forEach replicates that work and can be removed to simplify the function without changing behavior.

       const modal = store.value.find((el) => el._self === id)
       if (modal) {
         modal.modelValue = true
         modal['onUpdate:modelValue']?.(true)
-      } else {
-        stack?.value.forEach((modal) => {
-          if (modal.exposed?.id === id) {
-            modal.exposed?.show()
-          }
-        })
-      }
+      }
apps/docs/src/docs/composables/usePopover.md (3)

1-1: Markdownlint MD041: optional top-level heading

The docs start with a component tag (ComposableHeader). If markdownlint runs on raw MD, add an H1 or suppress MD041 for this file.

Options:

  • Add an H1 at the top:
+# usePopover
 <ComposableHeader path="usePopover/index.ts" title="usePopover" />
  • Or disable MD041 for this file:
<!-- markdownlint-disable MD041 -->

62-66: Grammar: “methods accepts” → “methods accept”

Minor grammar fix.

-The methods accepts reactive properties using `MaybeRef`, allowing dynamic updates to the popover content.
+The methods accept reactive properties using `MaybeRef`, allowing dynamic updates to the popover content.

111-118: Simplify h() usage in slots example

For an HTML element, passing a “slots object” as the third argument is atypical. Prefer a simple text child to avoid confusion.

-      h('div', null, {default: () => `Custom content - Visible: ${scope.visible}`}),
+      h('div', null, `Custom content - Visible: ${scope.visible}`),
packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (2)

206-217: Confirm presence/need of options?: OrchestratorCreateOptions on ModalOrchestratorParam

ModalOrchestratorParam includes an options?: OrchestratorCreateOptions field while the array value separately stores options. If options on Param is only used transiently, we might omit it from the public Param to reduce confusion and only accept it as the second argument of create(..., options). If both are intended, document precedence (Param.options vs create(..., options)).


226-234: Options union and deprecated returnBoolean: document deprecation timeline

OrchestratorCreateOptions includes a deprecated returnBoolean. Consider marking the removal target version in comments/docs to help downstream consumers plan.

📜 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 d491f39 and 55e3aba.

📒 Files selected for processing (13)
  • apps/docs/.vitepress/theme/Layout.vue (1 hunks)
  • apps/docs/src/data/components/app.data.ts (1 hunks)
  • apps/docs/src/docs.md (4 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 (8 hunks)
  • apps/docs/src/docs/migration-guide.md (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/composables/useModal/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (7 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
  • apps/docs/src/data/components/app.data.ts
  • packages/bootstrap-vue-next/src/App.vue
  • apps/playground/src/components/Comps/TToast.vue
🧰 Additional context used
🧠 Learnings (5)
📚 Learning: 2025-06-26T19:46:19.333Z
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/composables/usePopover.md
  • apps/docs/src/docs/migration-guide.md
  • apps/docs/src/docs/components/toast.md
  • packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts
  • apps/docs/src/docs/components/popover.md
  • apps/docs/src/docs/composables/useToast.md
📚 Learning: 2025-04-28T22:48:46.738Z
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/docs/composables/usePopover.md
  • packages/bootstrap-vue-next/src/composables/useModal/index.ts
  • packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts
  • apps/docs/src/docs/components/popover.md
📚 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/.vitepress/theme/Layout.vue
📚 Learning: 2025-06-05T11:43:10.793Z
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/migration-guide.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
🪛 markdownlint-cli2 (0.17.2)
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)

apps/docs/src/docs.md

353-353: Multiple headings with the same content

(MD024, no-duplicate-heading)

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)

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

[grammar] ~617-~617: There might be a mistake here.
Context: ...Modal`](/docs/composables/useModal) that fills the same needs (and more). Please...

(QB_NEW_EN)


[grammar] ~620-~620: There might be a mistake here.
Context: ...e back here for examples of replacements for msgBoxOk and msgBoxConfirm. Exa...

(QB_NEW_EN)


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


[grammar] ~633-~633: There might be a mistake here.
Context: ...ll of the properties that are defined on [BModal](/docs/components/modal#componen...

(QB_NEW_EN)

apps/docs/src/docs.md

[style] ~364-~364: Consider a more concise word here.
Context: ... ### Exposed methods and tree-shaking In order to correctly type exposed methods, you nee...

(IN_ORDER_TO_PREMIUM)


[grammar] ~365-~365: There might be a mistake here.
Context: ... from BootstrapVueNext. When doing this, import the component (not just the type)...

(QB_NEW_EN)

apps/docs/src/docs/components/popover.md

[grammar] ~78-~78: There might be a mistake here.
Context: ...rnatively, you can set the manual prop and use the [v-model](#programmatic-co...

(QB_NEW_EN)

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

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

🔇 Additional comments (13)
apps/docs/src/docs/components/popover.md (1)

77-81: LGTM on the rename to usePopover.

The rename and link target look correct, and “Alternatively,” is grammatically correct here.

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

3-171: Good move: wrap docs in BApp and remove explicit orchestrators.

This aligns with BApp’s default orchestrator behavior and avoids duplication/lifecycle coupling in the navbar. Nothing further to change here.

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

623-631: Orchestrator note looks good.

The note correctly reflects that BApp includes orchestrators by default and uses BOrchestrator for non-BApp setups.

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

223-245: Promise example is consistent and looks good.

Using {resolveOnHide: true} and chaining .then() is clear and consistent with the clarified semantics.


251-263: Import path consistency and composable usage LGTM.

Top-level import for examples and explicit path import for page script are both valid; destructuring {create, remove, toasts} is correct.

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

225-235: Robust BModal detection: good fix

Switching from comparing string names to comparing the actual component type (component.parent.type === BModal) resolves the minification fragility. Nice.

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

138-143: rAF timing and interval guidance: looks correct now

The updated explanation accurately reflects requestAnimationFrame cadence and the interval tuning. Thanks for tightening this up.


198-224: BLink integration example parity: includes modelValue

The example and snippet both include modelValue: true now, keeping behavior consistent. Good.


231-231: Corrected “modals” → “toasts”

Wording matches the page’s subject now.

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

120-147: Good: removed incorrect “OrchestratedToast” type and aligned advanced example

The example now uses a plain ref for firstRef and demonstrates slot rendering with scope. Looks consistent with the API.


153-159: Type name and resolveOnHide phrasing: corrected

“BvTriggerableEvent” spelling and the resolveOnHide explanation are now accurate and consistent with other docs.

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

14-26: Unified PromiseWithComponent<T, P> type: sane surface

Consolidating the per-component promise types into a generic with show/hide/toggle/set/get/destroy improves ergonomics and reduces duplication. The hide signature is consistently (trigger?: string), which matches your usage.


235-240: Nice: discriminated union OrchestratorArrayValue

The 'type' discriminators across orchestrated entries will make narrowing reliable and DX-friendly.

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

54-61: Nice fix: example now actually opens the modal

Appending .show() to create(...) ensures the example works as written.


153-159: Clarify “promise” vs “thenable controller” and fix phrasing

The returned value acts like a promise and exposes methods; call it a thenable controller to avoid confusion. Also fix the awkward “resolves … to a” phrasing.

-The `create` method returns a promise that resolves after the modal has been hidden to a `BvTriggerableEvent` object.  
-Using the `resolveOnHide` option (in the second argument), the promise resolves at the time the modal begins hiding, rather than after it is fully hidden.
+The `create` method returns a thenable controller that resolves to a `BvTriggerableEvent` after the modal is hidden.
+With the `resolveOnHide` option (second argument), the promise resolves when hiding begins instead of after it is fully hidden.
🧹 Nitpick comments (8)
apps/docs/src/docs/composables/useModal.md (8)

9-36: Clarify legacy plugin status and link to migration guide

Label the plugin approach as deprecated and add a link to the migration guide from plugins to BApp to reduce confusion for upgraders.

-### Plugin Setup (Legacy)
+### Plugin Setup (Legacy, deprecated)
 
-Alternatively, you can use the traditional plugin approach.
+Alternatively, you can use the traditional plugin approach.
+For new apps, prefer BApp. If you’re migrating from plugins, see the migration guide.

70-71: Tighten phrasing for MaybeRef

Minor wording tweak for clarity.

-`create` props property can accept a `MaybeRef`, meaning that you can make properties reactive
+The `create` props parameter can be a `MaybeRef`, so you can make properties reactive.

130-146: Fix async import pseudocode so it compiles

The example uses await inside a non-async function. Either mark the function async or switch to then(). Also add .show() so it’s consistent with other examples.

-const showMeAdvancedExample = () => {
+const showMeAdvancedExample = async () => {
   create({
     slots: {
       default: (scope) =>
         h('div', null, {default: () => `custom ${firstRef.value.body} - ${scope.visible}`}),
     },
   }).show()
 
   // Demonstration pseudocode, you can import a component and use it
-  // const importedComponent = () => {
-  //   create({
-  //     component: (await import('./TestModal.vue')).default,
-  //   })
-  // }
+  // const importedComponent = async () => {
+  //   const C = (await import('./TestModal.vue')).default
+  //   create({component: C}).show()
+  // }
 }

162-169: Grammar fix and clearer behavior for ok/cancel/null resolution

Subject–verb agreement and tighten the null case explanation.

 - `ok: boolean`
 
-  Clicking the `ok` button resolve this to `true`, `cancel` to `false` and any other closable action `null` (clicking the backdrop, or some other custom closing action. More accurately, when the `hide` function does not pass in the trigger parameter of `ok` or `cancel`)
+  Clicking the `OK` button resolves to `true`, `Cancel` resolves to `false`, and any other dismiss action resolves to `null` (e.g., clicking the backdrop or a custom close). More precisely: when `hide()` is called without the trigger `ok` or `cancel`, it resolves to `null`.

170-191: Disambiguate where methods live and address style lints (“This function …”)

These methods are exposed on the returned controller; avoid repeating “This function …” per style hints.

-The promise also contains functions to control the modal:
+The returned controller also exposes these methods:
 
 - `show: () => void`
 
-  This function shows the modal.
+  Shows the modal.
 
 - `hide: (trigger?: string) => void`
 
-  This function hides the modal. If a trigger is passed, it will be passed to the `trigger` property of the resolved promise
+  Hides the modal. If `trigger` is provided, it becomes the `trigger` value in the resolved result.
 
 - `toggle: () => void`
 
-  This function toggles the visibility of the modal.
+  Toggles the modal’s visibility.
 
 - `set: (props: Partial<ModalOrchestratorParam>) => void`
 
-  This function sets the props of the modal. This is useful for updating the modal after it has been created.
+  Updates the modal’s props at runtime.
 
 - `destroy: () => Promise<void>`
 
-  This function destroys the modal and cleans up any resources associated with it.
+  Destroys the modal and cleans up any associated resources.

204-208: Use TypeScript fence and note TS requirement for await using

The feature is TypeScript-specific (5.2+ using declarations); mark the fence accordingly and call it out.

-We also support the typescript feature `await using` to automatically destroy the modal when the scope is exited.
+We also support the TypeScript `await using` feature (TypeScript 5.2+ “using declarations”) to automatically destroy the modal when the scope is exited.
 
-```js
+```ts
 await using modal = create({title: 'Hello World!'})

---

`216-216`: **Trim trailing whitespace (markdownlint MD009)**

Remove the stray space-only line.


```diff
- 
+

263-265: Remove unused import “computed”

It isn’t used in this page script.

-import {ref, computed, h, onMounted, nextTick} from 'vue'
+import {ref, h, onMounted, nextTick} from 'vue'
📜 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 55e3aba and 83534cc.

📒 Files selected for processing (1)
  • apps/docs/src/docs/composables/useModal.md (2 hunks)
🧰 Additional context used
🪛 LanguageTool
apps/docs/src/docs/composables/useModal.md

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

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

216-216: Trailing spaces
Expected: 0 or 2; Actual: 1

(MD009, no-trailing-spaces)

⏰ 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

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
apps/docs/src/docs/components/popover.md (1)

45-48: Fix incorrect placement values: use *-start/*-end instead of *-left/*-right.

Floating UI uses top-start/top-end (not top-left/top-right). Current text mixes both styles and will mislead users.

Apply this diff to correct the list:

-Twelve static options are available for the `placement` prop: `top`, `top-left`, `top-right`,
-`bottom`, `bottom-start`, `bottom-end`, `left`, `left-start`, `left-end`, `right`, `right-start`, `right-end` from
+Twelve static options are available for the `placement` prop: `top`, `top-start`, `top-end`,
+`bottom`, `bottom-start`, `bottom-end`, `left`, `left-start`, `left-end`, `right`, `right-start`, `right-end` from
apps/docs/src/docs/composables/useToast.md (2)

157-159: Inconsistent API: does create() return a Promise, a symbol, or a controller with destroy()?

This page states that create returns a Promise (Line 60), then says “create returns a symbol” (Line 186), and then calls toast.destroy() (Line 196). These are contradictory. Please document a single, accurate return shape.

  • If the API returns a controller, document that and remove “returns a symbol”.
  • If it returns a Promise, don’t assign it to toast and don’t call destroy() on it.
  • If it returns both (e.g., controller with a whenHidden Promise), document that clearly.

Assuming the controller-with-destroy shape (and that BToast uses modelValue), apply:

-Hiding a `Toast` programmatically is very simple. `create` return an object that has functions to control the toast, including `destroy`
+Hiding a `Toast` programmatically is simple. `create` returns a controller with functions to control the toast, including `destroy`.

And in the snippet:

-  // `create` returns a symbol
   toast = create({
     title: 'Showing',
-    value: true,
+    modelValue: true,
     variant: 'success',
     position: 'bottom-center',
   })

Also applies to: 181-191


300-306: Fix render-function slot example (same h() issue as above)

Use children directly for native elements.

   create({
     body: firstRef.value.body,
     position: 'bottom-center',
-    slots: {default: () => h('div', null, {default: () => `custom! ${firstRef.value.body}`})},
+    slots: {default: () => h('div', null, `custom! ${firstRef.value.body}`)},
   })
🧹 Nitpick comments (14)
apps/docs/src/docs/migration-guide.md (6)

617-619: Tighten phrasing (“Vue 3-first”) and remove extra space

Minor copy edit for clarity and consistency with Vue 3 terminology. Also removes the double space flagged by the linter.

-In keeping with the Vue3 first philosophy, BootstrapVueNext provides a composable called [`useModal`](/docs/composables/useModal) that
-fills the same use cases (and more).
+In keeping with a Vue 3-first philosophy, BootstrapVueNext provides the [`useModal`](/docs/composables/useModal) composable that
+covers the same use cases (and more).

620-621: Streamline sentence and fix spacing

Reads a bit smoother; also addresses the linter’s spacing warning.

-Please read the [`useModal`](/docs/composables/useModal) documentation and then return here for examples of replacements
-for `msgBoxOk` and `msgBoxConfirm`.
+Please read the [`useModal`](/docs/composables/useModal) documentation, then return here for examples replacing
+`msgBoxOk` and `msgBoxConfirm`.

623-625: Use unified “orchestrator” term

Since orchestrators are merged into one (<BOrchestrator />), drop “modal” to avoid implying a separate modal-only orchestrator.

-Example using `useModal.create` to replace `msgBoxOk`:
-Note: If you use `<BApp>`, the modal orchestrator is included by default. If you’re not using `BApp`, include `<BOrchestrator />` at your app root.
+Example using `useModal.create` to replace `msgBoxOk`:
+Note: If you use `<BApp>`, the orchestrator is included by default. If you’re not using `BApp`, include `<BOrchestrator />` at your app root.

628-630: Keep terminology consistent with merged orchestrator

Mirror the wording change above for the confirm example.

-Example using `useModal.create` to replace `msgBoxConfirm`:
-Note: If you use `<BApp>`, the modal orchestrator is included by default. If you’re not using `BApp`, include `<BOrchestrator />` at your app root.
+Example using `useModal.create` to replace `msgBoxConfirm`:
+Note: If you use `<BApp>`, the orchestrator is included by default. If you’re not using `BApp`, include `<BOrchestrator />` at your app root.

633-635: Align terminology (“props” vs “properties”)

Everywhere else the guide uses “prop(s)”. Minor consistency tweak; also clears the linter warning at this line.

-The `create` method accepts all properties defined on
+The `create` method accepts all props defined on
 [BModal](/docs/components/modal#component-reference).

726-726: Clarify that usePopover also covers tooltips

Matches current API: there is no separate tooltip controller; usePopover programmatically controls both popovers and tooltips.

-`$root` events are deprecated. See [usePopover](/docs/composables/usePopover) as an alternative.
+`$root` events are deprecated. Use [usePopover](/docs/composables/usePopover) for programmatic control of popovers (and tooltips).
apps/docs/src/docs/components/popover.md (1)

5-9: Good rename to usePopover; add a short migration/prereq note.

Aligned with PR renames. Recommend clarifying that programmatic control requires app-level orchestration (BApp or the compatible registry/orchestrator plugin) and that usePopoverController is deprecated.

 interactive element via the `<BPopover>` component or [`v-b-popover`](/docs/directives/BPopover)
-directive. Popovers can also be created and programmatically controlled via the `usePopover` composable.
+directive. Popovers can also be created and programmatically controlled via the `usePopover` composable.
+
+:::tip Migration
+`usePopover` replaces the legacy `usePopoverController` (now a deprecated alias). For programmatic
+control to work, ensure your app provides the orchestration layer (e.g., wrap your root with BApp
+or install the compatible registry/orchestrator plugin).
+:::
apps/docs/src/docs/composables/useToast.md (7)

1-1: Add a top-level heading or disable MD041 for component headers

markdownlint flags missing H1. Since this page uses a component header, either add an H1 or disable the rule at the top.

Apply one of:

+<!-- markdownlint-disable MD041 -->
 <ComposableHeader path="useToast/index.ts" title="useToast" />

or

+# useToast
 <ComposableHeader path="useToast/index.ts" title="useToast" />

20-26: BApp example lacks import/registration context

The template-only snippet may confuse users copying it into a fresh project. Consider adding a script block that imports BApp (or a note that BApp is globally registered by the library install).

For example:

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

51-54: Standardize import path for useToast (tree-shaking and consistency)

This snippet imports from the package root, while the page footer imports from composables/useToast. Pick one path across the docs; using the composable path improves clarity and helps tree-shaking.

-import {useToast} from 'bootstrap-vue-next'
+import {useToast} from 'bootstrap-vue-next/composables/useToast'

60-61: Fix grammar and clarify id guidance; avoid “point in time” phrasing

The paragraph has grammar issues and confusing phrasing.

-The `create` method returns a `promise` that is resolved then the toast closes. You can give toast a unique id. Since `Toasts` are fluid and can move around a lot, returning the index at a given point in time is not ideal for as its position may be changed in the array. So, for use with the `remove` method, you need to give a unique identifier
+The `create` method returns a Promise that resolves when the toast closes. You can (and should) provide a unique `id`. Because toasts can reorder while animating, relying on array indices is fragile—use your `id` with `remove` instead.

66-69: Tighten wording for second-argument options

Minor grammar/style improvements.

-Optional second argument can be passed to `create` to some options: `keep` and `resolveOnHide`. The `keep` option will keep the toast in the registry after it is hidden, allowing you to show it again without creating a new instance. The `resolveOnHide` option will resolve the promise returned by `create` when the toast is hidden, not after the hide has finished.
+An optional second argument can be passed to `create` with options: `keep` and `resolveOnHide`. `keep` retains the toast in the registry after it is hidden, allowing you to show it again without creating a new instance. `resolveOnHide` resolves the Promise returned by `create` when the toast is hidden, not after the hide has finished.

113-114: Fix typo and rephrase for clarity

“reactvity” → “reactivity”.

-Using props can work for most situations, but it leaves some finer control to be desired. For instance, you can add HTML to any `slot` value. This can either be an imported SFC or an inline render function. For reactvity, you must use a getter function.
+Using props works for most situations, but sometimes finer control is desired. For example, you can provide any slot content (an imported SFC or an inline render function). For reactivity, use a getter function.

264-266: Avoid unused destructuring to keep examples tight

remove and toasts aren’t used in this page-level script. Consider destructuring only what is used to minimize noise.

-const {create, remove, toasts} = useToast()
+const {create} = useToast()
📜 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 83534cc and 44b405b.

📒 Files selected for processing (3)
  • apps/docs/src/docs/components/popover.md (2 hunks)
  • apps/docs/src/docs/composables/useToast.md (8 hunks)
  • apps/docs/src/docs/migration-guide.md (2 hunks)
🧰 Additional context used
🧠 Learnings (3)
📚 Learning: 2025-06-26T19:46:19.333Z
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/composables/useToast.md
  • apps/docs/src/docs/components/popover.md
  • apps/docs/src/docs/migration-guide.md
📚 Learning: 2025-04-28T22:48:46.738Z
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/docs/components/popover.md
📚 Learning: 2025-06-05T11:43:10.793Z
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/migration-guide.md
🪛 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)

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

[grammar] ~60-~60: Ensure spelling is correct
Context: ...od returns a promise that is resolved then the toast closes. You can give toast a ...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)


[style] ~60-~60: This phrase is redundant. Consider writing “point” or “time”.
Context: ...d a lot, returning the index at a given point in time is not ideal for as its position may be...

(MOMENT_IN_TIME)

apps/docs/src/docs/components/popover.md

[grammar] ~78-~78: There might be a mistake here.
Context: ...rnatively, you can set the manual prop and use the [v-model](#programmatic-co...

(QB_NEW_EN)

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

[grammar] ~617-~617: There might be a mistake here.
Context: ...Modal`](/docs/composables/useModal) that fills the same use cases (and more). Pl...

(QB_NEW_EN)


[grammar] ~620-~620: There might be a mistake here.
Context: ...return here for examples of replacements for msgBoxOk and msgBoxConfirm. Exa...

(QB_NEW_EN)


[grammar] ~633-~633: There might be a mistake here.
Context: ...method accepts all properties defined on [BModal](/docs/components/modal#componen...

(QB_NEW_EN)

⏰ 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/components/popover.md (1)

77-80: All documentation links verified; no stale references remain

  • usePopover.md and useToggle.md both exist
  • No occurrences of usePopoverController found in docs
  • Anchors for “Programmatic control via v-model” and “Exposed functions” are present and resolve correctly
apps/docs/src/docs/composables/useToast.md (1)

225-247: No changes needed: create(..., {resolveOnHide: true}) resolves a BvTriggerableEvent with an ok property

The promise returned by create is resolved with the BvTriggerableEvent instance (see orchestratorShared.ts), and the BApp orchestrator hook sets event.ok = true for an 'ok' trigger and false for 'cancel'. Therefore reading r.ok is correct and no update to the example is required.

Comment on lines 139 to +142
body: firstRef.value.body,
slots: {default: () => h('div', null, {default: () => `custom! ${firstRef.value.body}`})},
})
// Demonstration psuedocode, you can also import a component and use it
// Demonstration pseudocode, you can also import a component and use it
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Incorrect h() usage inside slots: pass string/children, not a slots object for native elements

h('div', null, {default: ...}) is invalid for native elements; pass the children directly.

-    slots: {default: () => h('div', null, {default: () => `custom! ${firstRef.value.body}`})},
+    slots: {default: () => h('div', null, `custom! ${firstRef.value.body}`)},
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
body: firstRef.value.body,
slots: {default: () => h('div', null, {default: () => `custom! ${firstRef.value.body}`})},
})
// Demonstration psuedocode, you can also import a component and use it
// Demonstration pseudocode, you can also import a component and use it
body: firstRef.value.body,
slots: {default: () => h('div', null, `custom! ${firstRef.value.body}`)},
})
// Demonstration pseudocode, you can also import a component and use it
🤖 Prompt for AI Agents
In apps/docs/src/docs/composables/useToast.md around lines 139 to 142, the
example wrongly calls h('div', null, {default: ...}) which is invalid for native
elements; change it to pass children directly (e.g. h('div', null, `custom!
${firstRef.value.body}`) or h('div', `custom! ${firstRef.value.body}`)), and if
you need a slots object only use that pattern when rendering a component (not a
native element).

Comment on lines 224 to 226
<script setup lang="ts">
const {create} = useToastController()
const {create} = useToast()
const promiseToast = () => {
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Import BButton for render-function usage

This snippet calls h(BButton, ...) but does not import BButton. Add the import so the example is copy-paste runnable.

 <script setup lang="ts">
+import {BButton} from 'bootstrap-vue-next'
 const {create} = useToast()
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<script setup lang="ts">
const {create} = useToastController()
const {create} = useToast()
const promiseToast = () => {
<script setup lang="ts">
import {BButton} from 'bootstrap-vue-next'
const {create} = useToast()
const promiseToast = () => {
// ...
🤖 Prompt for AI Agents
In apps/docs/src/docs/composables/useToast.md around lines 224 to 226, the
example uses h(BButton, ...) but never imports BButton; add an import for
BButton from the project's UI library (the same source used elsewhere in these
docs, e.g. the Bootstrap-Vue or component package) at the top of the <script
setup> so the render-function example is copy-paste runnable.

Comment on lines +257 to 265
import {useToast} from 'bootstrap-vue-next/composables/useToast'
import HighlightCard from '../../components/HighlightCard.vue'

import UsePluginAlert from '../../components/UsePluginAlert.vue'
import {ref, computed, h, onMounted} from 'vue'
import ComposableHeader from './ComposableHeader.vue'

const {create, remove, toasts} = useToastController()
const {create, remove, toasts} = useToast()

Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Page footer imports: also import BButton for render-function examples

The page-level script uses h(BButton, ...) later (Lines 316-322) but never imports BButton.

 import {data} from '../../data/components/toast.data'
 import {useToast} from 'bootstrap-vue-next/composables/useToast'
+import {BButton} from 'bootstrap-vue-next'
 import HighlightCard from '../../components/HighlightCard.vue'
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
import {useToast} from 'bootstrap-vue-next/composables/useToast'
import HighlightCard from '../../components/HighlightCard.vue'
import UsePluginAlert from '../../components/UsePluginAlert.vue'
import {ref, computed, h, onMounted} from 'vue'
import ComposableHeader from './ComposableHeader.vue'
const {create, remove, toasts} = useToastController()
const {create, remove, toasts} = useToast()
import {data} from '../../data/components/toast.data'
import {useToast} from 'bootstrap-vue-next/composables/useToast'
import {BButton} from 'bootstrap-vue-next'
import HighlightCard from '../../components/HighlightCard.vue'
import UsePluginAlert from '../../components/UsePluginAlert.vue'
import {ref, computed, h, onMounted} from 'vue'
import ComposableHeader from './ComposableHeader.vue'
const {create, remove, toasts} = useToast()
🤖 Prompt for AI Agents
In apps/docs/src/docs/composables/useToast.md around lines 257 to 265, the
module uses h(BButton, ...) later but never imports BButton; add an import for
BButton from the Bootstrap Vue Next package at the top of the file (alongside
the existing imports) so the render-function examples can reference BButton
without causing a runtime/reference error.

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
apps/docs/src/docs/composables/usePopover.md (1)

113-116: Incorrect h() usage for native element; third arg should be children, not a slots object.

Passing {default: () => ...} is for component slots, not native elements. This example won’t render as intended.

   slots: {
-    default: (scope) =>
-      h('div', null, {default: () => `Custom content - Visible: ${scope.visible}`}),
+    default: (scope) =>
+      h('div', null, `Custom content - Visible: ${scope.visible}`),
   },
packages/nuxt/playground/app.vue (1)

25-27: Update for new API: use create(...) instead of show(...)

useToast now exposes create rather than show/hide. Calling toast.show(...) will fail.

Apply this diff:

-    <BButton @click="toast.show({ props: { title: 'Hello World!' } })">
+    <BButton @click="toast.create({ title: 'Hello World!', modelValue: true })">
       Show Global Toast
     </BButton>
apps/docs/src/docs/components/toast.md (1)

34-36: Fix example variable mismatch (active vs isActive)

The snippet binds v-model="active" but defines isActive in script. Use the same name to avoid copy/paste confusion.

Apply this diff:

-<script setup lang="ts">
-const isActive = ref(false)
-</script>
+<script setup lang="ts">
+const active = ref(false)
+</script>
♻️ Duplicate comments (3)
packages/bootstrap-vue-next/src/composables/useModal/index.ts (1)

223-231: Good: robust component detection by comparing the component type

Comparing component.parent.type directly to BModal avoids the minification issues inherent to string name checks. This addresses prior feedback.

packages/nuxt/playground/app.vue (1)

162-170: Ensure useToast is available in the Nuxt playground

If your Nuxt module doesn’t auto-import useToast, this will break at runtime. Import explicitly here to avoid relying on auto-imports.

Apply this diff:

 <script setup>
+import {useToast} from 'bootstrap-vue-next'
 const show = ref(false)

 const f = useBreadcrumb()
 useColorMode()
 useModal()
 const toast = useToast()
 const formSelectMultipleSelected = ref([])
 </script>
apps/docs/src/docs/components/toast.md (1)

198-201: Good: examples now include modelValue: true and updated API

Examples align with the new create(...) API and include modelValue where needed. This avoids confusion vs. the live demo.

Also applies to: 208-214, 221-222

🧹 Nitpick comments (14)
apps/docs/src/docs/composables/usePopover.md (6)

1-1: Silence markdownlint MD041 by adding a rule-disable at the top.

Docs in this repo commonly start with a component header. To keep markdownlint happy without changing structure, disable MD041 on the first line.

+<!-- markdownlint-disable MD041 -->
 <ComposableHeader path="usePopover/index.ts" title="usePopover" />

31-36: Clarify “Legacy plugin” guidance to reflect removed per-feature plugins and point to orchestratorPlugin.

Per PR objectives, separate toast/modal/popover plugins were removed; there’s an orchestratorPlugin. A short note avoids confusion for users migrating existing code.

 ### Plugin Setup (Legacy)

-Alternatively, you can use the traditional plugin approach.
+Alternatively, you can use the traditional plugin approach.
+
+Note: As of v0.40, there are no separate toast/modal/popover controller plugins. If you stick with plugins, use the single `orchestratorPlugin` (or prefer `BApp`) and follow the migration guide.

42-49: Popover example button label mismatches default trigger; use “Click me” for accuracy.

Bootstrap popovers default to click. Labeling “Hover me” is misleading.

-  <BButton ref="popoverButton">Hover me</BButton>
+  <BButton ref="popoverButton">Click me</BButton>
...
-  <BButton ref="popoverButton">Hover me</BButton>
+  <BButton ref="popoverButton">Click me</BButton>

67-75: Fix inconsistent button text between preview and code (“Hover me” vs “Click me”).

This section demonstrates a tooltip (hover default), so keep both as “Hover me”.

-  <BButton ref="reactiveExample">Click me</BButton>
+  <BButton ref="reactiveExample">Hover me</BButton>

125-132: Tighten “Return Value” wording to reflect an awaitable controller object.

The API returns a controller that is awaitable (promise-like) and also exposes control methods; calling it a “promise that includes methods” can confuse readers.

-The `popover` and `tooltip` methods return a promise that resolves to a `BvTriggerableEvent` object when the popover is hidden. The promise includes methods to control the popover:
+The `popover` and `tooltip` methods return an awaitable controller. You can call its methods immediately to control the instance, and you can also `await` it to resolve when the popover/tooltip is hidden. The controller exposes:

145-148: Consider adding a note about TypeScript version for await using.

await using requires TS 5.2+ and an AsyncDisposable implementation from the library. A short note avoids confusion for users on older TS.

 ```js
 await using pop = popover({title: 'Hello World!'})

+> Note: await using requires TypeScript 5.2+ and that the returned controller implements Symbol.asyncDispose.


</blockquote></details>
<details>
<summary>packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue (2)</summary><blockquote>

`25-31`: **Normalize `promise` access for consistency**

`promise.stop?.()` / `promise.resolve(e)` and `promise.value.destroy?.()` / `promise.value.ref = ref` suggests `promise` is a wrapper with a `value` payload. Consider consistently dereferencing either the wrapper or its payload to avoid confusion and future regressions.

If `resolve`/`stop` live on `promise.value`, normalize as below:

```diff
-                  promise.stop?.()
+                  promise.value?.stop?.()
-                  if (options?.resolveOnHide) {
-                    promise.resolve(e)
-                  }
+                  if (options?.resolveOnHide) {
+                    promise.value?.resolve?.(e)
+                  }
...
-                  if (!options?.resolveOnHide) {
-                    promise.resolve(e)
-                  }
+                  if (!options?.resolveOnHide) {
+                    promise.value?.resolve?.(e)
+                  }

Can you confirm where resolve/stop are actually defined? If they’re on the wrapper, we should do the inverse and remove .value for ref/destroy.

Also applies to: 39-57


113-148: Minor: position class computation looks toast-centric

All active non-toast positions are given empty style/class later, but the default adds toast-container position-fixed p-3 to every active position first. This is harmless because you override for modal and popover below, but it’s a little indirect.

Optional: compute toast positions only, and append modal/popover directly without the toast classes, which simplifies the logic.

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

99-106: BOrchestratorProps: consider clarifying filter type Doc/TS JSDoc

The function type is correct. Consider adding a brief JSDoc in the public types explaining that filter runs against orchestrated items (toast/modal/popover/tooltip) and must be pure. This will help consumers craft filters for multi-orchestrator setups.

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

49-50: Make resolvedProps robust for any input shape (ref/getter/plain object)

toRef(obj) is fragile when obj is not a ref. Use a computed wrapper over toValue to support MaybeRefOrGetter reliably.

Apply this diff:

-    const resolvedProps = toRef(obj)
+    // Support ref, getter, or plain object
+    const resolvedProps = computed(() => toValue(obj))

127-150: Optional: route show/hide through the promise API for consistency

Directly mutating store entries’ modelValue is fine, but it bypasses the unified methods exposed on the promise (set/show/hide). Using the promise keeps behavior centralized (emits, watchers, and destroy hooks).

Example patch for the “found in store” case:

-      if (modal) {
-        modal.modelValue = true
-        modal['onUpdate:modelValue']?.(true)
-      }
+      if (modal) {
+        modal.promise.value.show()
+      }
-      if (modal) {
-        modal.modelValue = false
-        modal['onUpdate:modelValue']?.(false)
-      }
+      if (modal) {
+        modal.promise.value.hide(trigger)
+      }

Also applies to: 157-179

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

5-5: Tighten phrasing (“in conjunction with” → “with”)

Minor wording improvement for readability.

Apply this diff:

-The `BOrchestrator` component is an internal component that manages the rendering and positioning of dynamic components like modals, toasts, and popovers. It works in conjunction with `BApp` to provide a centralized orchestration layer.
+The `BOrchestrator` component manages the rendering and positioning of dynamic components like modals, toasts, and popovers. It works with `BApp` to provide a centralized orchestration layer.

42-74: Document the missing teleportTo prop

The docs page lists several props but omits teleportTo, which is present in types and the data file. Add it for completeness.

Apply this diff:

 ## Props

 ### `noPopovers`
@@
 ### `appendToast`
@@
 ### `filter`
@@
+- ### `teleportTo`
+  - **Type:** `string | Element | null | undefined`
+  - **Default:** `null`
+  - **Description:** Target element to which orchestrated content is teleported (via Vue Teleport). Useful for rendering into a specific DOM container.
apps/docs/src/docs/components/toast.md (1)

244-244: Prefer root export for composable import path

For stability across bundlers, import from the package root if it re-exports useToast. The current deep path may break with export map changes.

Apply this diff (if root export exists):

-import {useToast} from 'bootstrap-vue-next/composables/useToast'
+import {useToast} from 'bootstrap-vue-next'

If root export is not available, keep the current path and consider adding a note in the docs.

📜 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 44b405b and 3037973.

📒 Files selected for processing (17)
  • apps/docs/src/data/components/orchestrator.data.ts (1 hunks)
  • apps/docs/src/data/components/toast.data.ts (1 hunks)
  • apps/docs/src/docs/components/orchestrator.md (1 hunks)
  • apps/docs/src/docs/components/toast.md (7 hunks)
  • apps/docs/src/docs/composables/usePopover.md (6 hunks)
  • apps/playground/src/components/Comps/TModal.vue (4 hunks)
  • apps/playground/src/components/Comps/TToast.vue (3 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/composables/useModal/index.ts (1 hunks)
  • packages/bootstrap-vue-next/src/composables/usePopover/index.ts (1 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/types/ComponentOrchestratorTypes.ts (9 hunks)
  • packages/bootstrap-vue-next/src/types/ComponentProps.ts (2 hunks)
  • packages/nuxt/playground/app.vue (2 hunks)
  • packages/nuxt/src/runtime/createBootstrap.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (6)
  • packages/bootstrap-vue-next/src/composables/useToast/index.ts
  • packages/bootstrap-vue-next/src/composables/useToggle/index.ts
  • packages/bootstrap-vue-next/src/composables/usePopover/index.ts
  • apps/playground/src/components/Comps/TModal.vue
  • packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts
  • apps/playground/src/components/Comps/TToast.vue
🧰 Additional context used
🧠 Learnings (9)
📚 Learning: 2025-04-28T22:48:46.738Z
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/toast.data.ts
  • apps/docs/src/data/components/orchestrator.data.ts
  • apps/docs/src/docs/components/orchestrator.md
  • packages/bootstrap-vue-next/src/types/ComponentProps.ts
  • packages/bootstrap-vue-next/src/composables/useModal/index.ts
  • apps/docs/src/docs/composables/usePopover.md
  • packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue
📚 Learning: 2025-06-26T19:46:19.333Z
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/data/components/toast.data.ts
  • apps/docs/src/docs/components/orchestrator.md
  • apps/docs/src/docs/composables/usePopover.md
  • apps/docs/src/docs/components/toast.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:

  • packages/bootstrap-vue-next/src/components/BApp/BApp.vue
  • packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue
📚 Learning: 2025-04-28T20:33:04.113Z
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.

Applied to files:

  • packages/bootstrap-vue-next/src/components/BApp/BApp.vue
📚 Learning: 2025-05-26T17:27:44.251Z
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:

  • packages/bootstrap-vue-next/src/components/BApp/BApp.vue
📚 Learning: 2025-04-28T20:33:04.113Z
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()`.

Applied to files:

  • packages/bootstrap-vue-next/src/components/BApp/BApp.vue
📚 Learning: 2025-05-28T07:32:45.658Z
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/BApp.vue
📚 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:

  • packages/bootstrap-vue-next/src/components/BApp/BApp.vue
📚 Learning: 2025-05-28T07:57:19.915Z
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/BApp.vue
🧬 Code Graph Analysis (3)
apps/docs/src/data/components/orchestrator.data.ts (2)
apps/docs/src/types/index.ts (2)
  • ComponentReference (59-74)
  • PropRecord (17-17)
packages/bootstrap-vue-next/src/types/ComponentProps.ts (1)
  • BOrchestratorProps (99-106)
packages/bootstrap-vue-next/src/types/ComponentProps.ts (2)
packages/bootstrap-vue-next/src/types/BootstrapVueOptions.ts (1)
  • BvnComponentProps (307-309)
packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (1)
  • OrchestratorArrayValue (234-238)
packages/bootstrap-vue-next/src/composables/useModal/index.ts (4)
packages/bootstrap-vue-next/src/utils/keys.ts (1)
  • orchestratorRegistryKey (210-214)
packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (6)
  • ModalOrchestratorCreateParam (223-223)
  • OrchestratorCreateOptions (225-232)
  • PromiseWithComponent (14-16)
  • ModalOrchestratorParam (205-221)
  • ModalOrchestratorArrayValue (186-203)
  • ControllerKey (12-12)
packages/bootstrap-vue-next/src/composables/orchestratorShared.ts (4)
  • buildPromise (20-115)
  • show (42-48)
  • hide (49-55)
  • get (64-66)
packages/bootstrap-vue-next/src/composables/useModalManager.ts (1)
  • useSharedModalStack (15-58)
🪛 LanguageTool
apps/docs/src/docs/components/orchestrator.md

[style] ~5-~5: ‘in conjunction with’ might be wordy. Consider a shorter alternative.
Context: ... modals, toasts, and popovers. It works in conjunction with BApp to provide a centralized orchest...

(EN_WORDINESS_PREMIUM_IN_CONJUNCTION_WITH)


[grammar] ~46-~46: There might be a mistake here.
Context: ...## Props ### noPopovers - Type: boolean - Default: false - Description: If...

(QB_NEW_EN)


[grammar] ~47-~47: There might be a mistake here.
Context: ... - **Type:**boolean- **Default:**false- **Description:** Iftrue`, prevents popov...

(QB_NEW_EN)


[grammar] ~52-~52: There might be a mistake here.
Context: ...g rendered ### noToasts - Type: boolean - Default: false - Description: If...

(QB_NEW_EN)


[grammar] ~53-~53: There might be a mistake here.
Context: ... - **Type:**boolean- **Default:**false- **Description:** Iftrue`, prevents toast...

(QB_NEW_EN)


[grammar] ~58-~58: There might be a mistake here.
Context: ...g rendered ### noModals - Type: boolean - Default: false - Description: If...

(QB_NEW_EN)


[grammar] ~59-~59: There might be a mistake here.
Context: ... - **Type:**boolean- **Default:**false- **Description:** Iftrue`, prevents modal...

(QB_NEW_EN)


[grammar] ~64-~64: There might be a mistake here.
Context: ...endered ### appendToast - Type: boolean - Default: false - Description: If...

(QB_NEW_EN)


[grammar] ~65-~65: There might be a mistake here.
Context: ... - **Type:**boolean- **Default:**false- **Description:** Iftrue`, new toasts are...

(QB_NEW_EN)


[grammar] ~70-~70: There might be a mistake here.
Context: ...he beginning ### filter - Type: (item: OrchestratorArrayValue) => boolean - Default: () => true - **Description:...

(QB_NEW_EN)


[grammar] ~71-~71: There might be a mistake here.
Context: ...rArrayValue) => boolean- **Default:**() => true` - Description: Custom filter function to...

(QB_NEW_EN)

🪛 markdownlint-cli2 (0.17.2)
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)

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

[warning] 98-98:
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 (7)
packages/nuxt/src/runtime/createBootstrap.ts (1)

20-27: BOrchestrator/BApp options wiring looks correct

Both components are registered with default teleportTo: '#teleports' and allow overrides via opts?.components. This aligns with the new architecture and should maintain expected Nuxt bootstrap behavior.

apps/docs/src/data/components/toast.data.ts (1)

1-1: Docs import update aligns with orchestrator removal

Dropping BToastOrchestratorProps from the import is consistent with the move to BApp/BOrchestrator and the useToast composable. No further changes needed here.

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

74-97: BAppProps surface is reasonable; TeleportProps['to'] is the right type for teleportTo

  • defaults/mergeDefaults API matches prior discussion (boolean or custom merge fn).
  • teleportTo using TeleportProps['to'] keeps parity with Vue’s Teleport.
  • rtl union supports both boolean and init object.

LGTM.

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

27-30: Nice use of getter-based toRef for defaults

toRef(() => props.defaults) is the right choice in Vue 3.3+ to keep the provided defaults reactive without extra computed overhead.

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

113-118: Fix: onScopeDispose has an invalid extra argument

Vue’s onScopeDispose only accepts a single callback. The second boolean argument causes a type error and won’t compile.

Apply this diff:

-    onScopeDispose(() => {
+    onScopeDispose(() => {
       const modal = store.value.find((el) => el._self === _self)
       if (modal) {
         modal.promise.value.destroy?.()
       }
-    }, true)
+    })
⛔ 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.
apps/docs/src/data/components/orchestrator.data.ts (1)

4-46: LGTM: props schema covers current surface (including teleportTo)

The data entry matches BOrchestratorProps and includes teleportTo. Good alignment with types and docs.

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

140-143: Nice clarification on rAF frequency and interval throttling

The updated explanation correctly states that requestAnimationFrame updates each frame (~16 ms) and how to throttle via interval.

Comment on lines +27 to +34
useProvideDefaults(
toRef(() => props.defaults),
props.mergeDefaults
)
useRegistry(props.rtl)
if (!props.noOrchestrator) {
useOrchestratorRegistry()
}
Copy link

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

Initialize orchestrator registry reactively when noOrchestrator toggles

Currently the registry is created only once when noOrchestrator is false at setup. If a user toggles noOrchestrator from true to false at runtime, BOrchestrator will render without an installed registry.

Watch the prop and install when it switches to false:

-useRegistry(props.rtl)
-if (!props.noOrchestrator) {
-  useOrchestratorRegistry()
-}
+useRegistry(props.rtl)
+if (!props.noOrchestrator) {
+  useOrchestratorRegistry()
+}
+// Ensure late-enable also installs the registry
+watch(
+  () => props.noOrchestrator,
+  (no) => {
+    if (!no) useOrchestratorRegistry()
+  }
+)

🏁 Script executed:

#!/bin/bash
# Show the relevant section around the orchestrator registry calls in BApp.vue
rg -n -C3 "useOrchestratorRegistry" packages/bootstrap-vue-next/src/components/BApp/BApp.vue

Length of output: 524


🏁 Script executed:

#!/bin/bash
# Locate the orchestratorShared file
rg -l "orchestratorShared" -g "packages/bootstrap-vue-next/src/composables/*"

Length of output: 130


🏁 Script executed:

#!/bin/bash
# Show the export of useOrchestratorRegistry in composables index.ts
rg -n -C5 "useOrchestratorRegistry" packages/bootstrap-vue-next/src/composables/index.ts

Length of output: 416


🏁 Script executed:

#!/bin/bash
# Locate the orchestratorShared source file
ls -l packages/bootstrap-vue-next/src/composables/orchestratorShared.*

Length of output: 188


🏁 Script executed:

#!/bin/bash
# Display the beginning of orchestratorShared.ts to inspect registry implementation
sed -n '1,200p' packages/bootstrap-vue-next/src/composables/orchestratorShared.ts

Length of output: 4319


🏁 Script executed:

#!/bin/bash
# Display the top of BApp.vue to inspect imports and props
sed -n '1,80p' packages/bootstrap-vue-next/src/components/BApp/BApp.vue

Length of output: 986


🏁 Script executed:

#!/bin/bash
# Display the beginning of BOrchestrator.vue to inspect orchestration implementation
sed -n '1,200p' packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue

Length of output: 4683


Ensure orchestrator registry re-initializes when noOrchestrator toggles

Add a watch in BApp.vue to call useOrchestratorRegistry() whenever noOrchestrator switches from true to false:

Files to update:

  • packages/bootstrap-vue-next/src/components/BApp/BApp.vue (setup block)
--- a/packages/bootstrap-vue-next/src/components/BApp/BApp.vue
+++ b/packages/bootstrap-vue-next/src/components/BApp/BApp.vue
@@
-import {toRef} from 'vue'
+import {toRef, watch} from 'vue'
@@
 useProvideDefaults(
   toRef(() => props.defaults),
   props.mergeDefaults
 )
 useRegistry(props.rtl)
 if (!props.noOrchestrator) {
   useOrchestratorRegistry()
 }
+// Ensure late-enable also installs the orchestrator registry
+watch(
+  () => props.noOrchestrator,
+  (noOrchestrator) => {
+    if (!noOrchestrator) {
+      useOrchestratorRegistry()
+    }
+  }
+)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
useProvideDefaults(
toRef(() => props.defaults),
props.mergeDefaults
)
useRegistry(props.rtl)
if (!props.noOrchestrator) {
useOrchestratorRegistry()
}
// at the top of your <script setup> or setup() block
import { toRef, watch } from 'vue'
useProvideDefaults(
toRef(() => props.defaults),
props.mergeDefaults
)
useRegistry(props.rtl)
if (!props.noOrchestrator) {
useOrchestratorRegistry()
}
// Ensure late-enable also installs the orchestrator registry
watch(
() => props.noOrchestrator,
(noOrchestrator) => {
if (!noOrchestrator) {
useOrchestratorRegistry()
}
}
)
🤖 Prompt for AI Agents
packages/bootstrap-vue-next/src/components/BApp/BApp.vue around lines 27-34: add
a watch on props.noOrchestrator in the setup block that calls
useOrchestratorRegistry() when the prop transitions from true to false;
specifically, import/watch as needed and add watch(() => props.noOrchestrator,
(newVal, oldVal) => { if (!newVal && oldVal) useOrchestratorRegistry() }) so the
orchestrator registry is re-initialized whenever noOrchestrator toggles off.

Comment on lines +91 to +101
const orchestratorRegistry = inject(orchestratorRegistryKey)
if (orchestratorRegistry) {
if (!orchestratorRegistry._isOrchestratorInstalled.value) {
orchestratorRegistry._isOrchestratorInstalled.value = true
}
} else {
console.warn(
'[BOrchestrator] The orchestrator registry not found. Please use BApp, useRegistry or provide the plugin.'
)
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Avoid crash when orchestrator registry is missing; make warning dev-only

If orchestratorRegistry is not provided, the computed items chain will dereference undefined (orchestratorRegistry?.store.value -> .filter(...)), causing a runtime error. Also, the console warning trips the linter.

  • Guard items with a safe fallback to [].
  • Gate the warning to dev (or remove/replace it if you prefer zero console usage).

Apply:

 } else {
-  console.warn(
-    '[BOrchestrator] The orchestrator registry not found. Please use BApp, useRegistry or provide the plugin.'
-  )
+  if (import.meta?.env?.DEV) {
+    // eslint-disable-next-line no-console
+    console.warn(
+      '[BOrchestrator] The orchestrator registry was not found. Use BApp, useRegistry, or provide the plugin.'
+    )
+  }
 }
 
-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)
-)
+const items = computed(() => {
+  const store = orchestratorRegistry?.store.value ?? []
+  return store
+    .filter((el) => !props.noPopovers || el.type !== 'popover')
+    .filter((el) => !props.noToasts || el.type !== 'toast')
+    .filter((el) => !props.noModals || el.type !== 'modal')
+    .filter(props.filter)
+})

Also applies to: 150-156

🧰 Tools
🪛 GitHub Check: test-lint

[warning] 98-98:
Unexpected console statement

🤖 Prompt for AI Agents
In packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue around
lines 91-101 (also apply same change at 150-156), the code risks a runtime crash
because computed `items` dereferences `orchestratorRegistry` when it's undefined
and the console.warn triggers linter issues; fix by guarding the computed chain
to return an empty array when `orchestratorRegistry` is falsy (e.g., use
`orchestratorRegistry?.store.value ?? []` before `.filter` or early-return
`[]`), and make the warning dev-only by wrapping it in a runtime dev check (or
remove it) so no lint/console noise in production.

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