-
-
Notifications
You must be signed in to change notification settings - Fork 162
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
base: main
Are you sure you want to change the base?
draft of BApp #2732
Conversation
|
WalkthroughReplaces 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
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)
Estimated code review effort🎯 5 (Critical) | ⏱️ ~120+ minutes Possibly related issues
Possibly related PRs
Suggested reviewers
Poem
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 unit tests
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. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. CodeRabbit Commands (Invoked using PR/Issue comments)Type Other keywords and placeholders
CodeRabbit Configuration File (
|
@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 |
@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 Advantages of BApp:
Advantages of Plugin:
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
Add bootstrap and BSVN
Add a reference to BLink
Add a reference to BAvatar
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 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:
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 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... |
There was a problem hiding this 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
, andset
returnvoid
, whereas every other promise interface returnsPromiseWith*
, enablingawait 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<...>) => PromiseWithPopoverBreaking 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 thetrue
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 aBvTriggerableEvent
, the page now prints[object Object]
. For the docs you might want toJSON.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 warningConsider 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 protectionFor 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 mountTeleport rendering happens on the next micro-task.
Add aawait wrapper.vm.$nextTick()
before the assertions to avoid a race whereConditionalTeleport
hasn’t mounted yet in CI.packages/bootstrap-vue-next/src/types/ComponentProps.ts (1)
77-78
:teleportTo
typing is too narrow
TeleportProps['to']
isstring | RendererElement | null
.
Users often pass a CSS selector function orHTMLElement | null
. Consider widening tostring | Element | null
to avoid externalRendererElement
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 awarnOnce
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 areset()
that flips the ref and emptiespopovers
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 insideval
stay reactive and will be duplicated into store, risking reactive cross-links.
A deep unwrap (e.g.toRaw
orstructuredClone
) beforesplice
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 largecreate
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:
- Props resolution and normalization logic
- Watcher setup logic
- 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 = valpackages/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 genericOrchestratorCreateOptions
share identical structure.
Prefer a single exported alias to avoid drift:export type OrchestratorCreateOptions = { keep?: boolean resolveOnHide?: boolean /** @deprecated */ returnBoolean?: boolean } export type ModalOrchestratorCreateOptions = OrchestratorCreateOptionsKeeps typings DRY and maintenance-friendly.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 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 oneBApp
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 goodEntries 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 LGTMThe broader union correctly matches the new promise return type.
packages/bootstrap-vue-next/src/plugins/toastController/index.ts (1)
11-15
: State provisioning looks correctReactive 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/bashLocate 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 thetrue
parameter in onScopeDispose.The second parameter
true
toonScopeDispose
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.
packages/bootstrap-vue-next/src/components/BModal/BModalOrchestrator.vue
Outdated
Show resolved
Hide resolved
packages/bootstrap-vue-next/src/components/BPopover/BPopoverOrchestrator.vue
Outdated
Show resolved
Hide resolved
packages/bootstrap-vue-next/src/components/BApp/BAppOrchestrator.vue
Outdated
Show resolved
Hide resolved
packages/bootstrap-vue-next/src/components/BApp/BAppOrchestrator.vue
Outdated
Show resolved
Hide resolved
packages/bootstrap-vue-next/src/composables/useToastController/index.ts
Outdated
Show resolved
Hide resolved
commit: |
@dwgray you can use the pr.new packages now. I've never gotten the direct git+npm to work on this project.
@VividLemon 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. |
Thanks @xvaara! This looks great. I just rebuilt the "final" version of my test app which references just BLink & BAvatar BSVN 0.30.3
BLink & BAvatar BSVN 0.30.3 BApp Branch
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 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. |
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 |
Or what do you mean by tools? Composable that creates the registries? Yes, simply this and a small demo on how to do it. |
I think there are better things to test than performance. Just keep the bundle size low and we should be ok |
@coderabbitai full review |
✅ Actions performedFull review triggered. |
There was a problem hiding this 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 toModalOrchestratorCreateOptions
. 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
: Respectroot
when resolving byid
Nice SSR-safe guard!
However, the branch that handles a string selector still hard-codesdocument.getElementById(...)
, ignoring theroot
argument when it happens to be aDocument
(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 whenroot
is not aDocument
:-const idElement = document.getElementById(element) +const doc = (root as Document | undefined) ?? SAFE_DOCUMENT +const idElement = doc?.getElementById?.(element) ?? undefinedThis 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
: Dropconsole.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 ifname
changes or is tree-shaken. Prefer:import BOrchestrator from '../BOrchestrator.vue' ... wrapper.findComponent(BOrchestrator)
15-17
: Avoid genericdiv
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 = valpackages/bootstrap-vue-next/src/composables/usePopover/index.ts (1)
57-57
: Use a more descriptive Symbol identifierThe 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:
- Create separate setup functions for each feature (orchestrator, showHide, modalManager, breadcrumb, rtl)
- Call these functions from
useRoot
based on the configuration- 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 modalLine 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
📒 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
tousePopover
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
anduseToast
, 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 deprecateduseModalController
.
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
anduseModal.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 deprecatedusePopoverController
.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 ofuseToastController
. 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
touseModal
is implemented correctly:
- Store filtering for modal type is appropriate since the orchestrator manages all overlay types
- Consistent replacement of
show()
withcreate()
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
tousePopover
:
- 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
andshowHidePlugin
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
touseToast
is implemented correctly:
- Store filtering for toast type is appropriate for the unified orchestrator
- Consistent replacement of
show()
withcreate()
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 ontools._isOrchestratorInstalled.value
but the flag is never flipped totrue
here nor reset on unmount.
Please double-check thatBOrchestrator
(oruseModal
) 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 itsshow
method have been properly updated to useuseToast
andcreate
. The prop changes fromvalue
tomodelValue
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 anduseToastController
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 booleanfailSilently
flag as its second argument. Passingtrue
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 inBAppProps
.
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
andmergeDefaults
enable global component configurationteleportTo
supports flexible orchestrator placement- Boolean flags provide granular control over features
rtl
property supports both simple boolean and detailed configurationThe 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 thenoOrchestrator
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 withv-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 defaultappendToast: false
provides predictable toast behaviornoOrchestrator: 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 managementuseRoot
sets up root-level orchestration and RTL supportThis 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 buildsThe 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 keysThe 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.asyncDisposeSymbol.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–99Suggested 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 ofpromise
. Based on the method signature, this appears correct as it should returnPromiseWithComponent
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
packages/bootstrap-vue-next/src/components/BPopover/BPopoverOrchestrator.vue
Show resolved
Hide resolved
packages/bootstrap-vue-next/src/composables/useProvideDefaults/index.ts
Outdated
Show resolved
Hide resolved
packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue
Outdated
Show resolved
Hide resolved
packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts
Outdated
Show resolved
Hide resolved
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. |
There was a problem hiding this 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
toformGroupKey
, 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
📒 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.
packages/bootstrap-vue-next/src/plugins/createBootstrap/index.ts
Outdated
Show resolved
Hide resolved
There was a problem hiding this 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
📒 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 andcreate
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.
There was a problem hiding this 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:
- The nested v-for with destructuring creates complex template logic that could be refactored
- The eslint-disable comment suggests the template might be doing too much
- 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
📒 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).
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 |
There was a problem hiding this 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> |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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: [], |
There was a problem hiding this comment.
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
@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 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: 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 |
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' |
There was a problem hiding this 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 importingApp
. 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 examplesSlightly 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
📒 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 goodExample 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.
There was a problem hiding this 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 BAppA 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 instructionRephrase 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 activeThe 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-shakingTree-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.
📒 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 goodThanks 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 caveatBundle 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
, andrtlPlugin
are correctly defined and re-exported inpackages/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) ...
There was a problem hiding this 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 BAppPropsThe 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 typingVerification confirms that
BPopoverOrchestrator
is still exported (packages/bootstrap-vue-next/src/components/BPopover/index.ts), its.vue
file exists, and the props typeBPopoverOrchestratorProps
is defined (packages/bootstrap-vue-next/src/types/ComponentProps.ts). The only remaining issue is that inBootstrapVueOptions.ts
it’s incorrectly typed asnever
.Please update the mapping in
packages/bootstrap-vue-next/src/types/BootstrapVueOptions.ts
(around lines 302–304):- BPopoverOrchestrator: never + BPopoverOrchestrator: ComponentProps.BPopoverOrchestratorPropspackages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (1)
70-110
: Restoreid?: ControllerKey
on orchestrator params for stable programmatic controlPrevious 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’screate(...)
, not ashow
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 whenresolveOnHide
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 changelogThe 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><BApp></code>, you must have initialized the createBootstrap plugin for + If not using <code><BApp></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 summarizingDirectly 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 computedSlight 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 APIThe 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 structuremarkdownlint 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/FeaturesSame 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 noteMinor 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 APIMapping 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': OrchestratorCreateOptionsIf 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 intentMinor: 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 RegisterShowHideMapValueRegisterShowHideFnInput.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 usePopoverSwitching 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` propapps/docs/src/docs/demo/ModalMessageBox.vue (1)
18-22
: Consider formatting the result for readability when it may be an event objectcreate 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 sectionTighten 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 descriptionMinor 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 configurableNoted 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 foruseToast
.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.
📒 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 LGTMList 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—LGTMMessaging 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 DocumentationThe 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 correctImport 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 APIGood 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 correctBApp and BOrchestrator entries in componentsWithExternalPath are sensible and align with the new architecture.
Also applies to: 93-94
138-152
: Composable path remapping LGTMConsolidating 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 AvailabilityI searched the codebase and found no local declaration of
AsyncDisposable
, nor any TS config inpackages/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
ortype AsyncDisposable
found anywhere.
• Only tsconfig files are undertemplates/vite
(libs: ES2020, DOM, DOM.Iterable) andapps/docs/tsconfig.app.json
(libs: ESNext, DOM, DOM.Iterable), neither of which apply to the library build.
• No tsconfig.json inpackages/bootstrap-vue-next
declaresesnext.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 goodMigrating 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 appropriatelyImports 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 typingSwitching 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?
There was a problem hiding this 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)
🧹 Nitpick comments (8)
packages/nuxt/playground/app.vue (2)
6-8
: Consider migrating playground to BApp for parity with the recommended setupTo 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() calluseModal() 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 thedefaults
type and clarify wordingThe 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
: AlignmergeDefaults
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 fornoOrchestrator
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: clarifyrtl
boolean semanticsMinor 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 slotThis 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
: UpdateteleportTo
type to match Vue Teleport’sto
propThe official
TeleportProps['to']
is typed asstring | RendererElement | null | undefined
(whereRendererElement
is anElement
in the browser). Our docs currently narrow this toHTMLElement
and omitundefined
.• File: apps/docs/src/data/components/app.data.ts
– Line 32: change thetype
fieldteleportTo: { - 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.
📒 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 correctUsing BAppProps from the package and local ComponentReference/PropRecord aligns with the docs data system.
43-43
: Great use ofsatisfies
to keep docs in sync with propsThis guards against drift between documented props and the actual BAppProps surface.
There was a problem hiding this 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
, notshow
. 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) exposingdestroy
.- 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 nameTemplate 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 ModalOrchestratorCreateParamYou 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 argumentonScopeDispose 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 headingThe 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 exampleFor 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 ModalOrchestratorParamModalOrchestratorParam 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 timelineOrchestratorCreateOptions 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.
📒 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 fixSwitching 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 nowThe updated explanation accurately reflects requestAnimationFrame cadence and the interval tuning. Thanks for tightening this up.
198-224
: BLink integration example parity: includes modelValueThe 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 exampleThe 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 surfaceConsolidating 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 OrchestratorArrayValueThe 'type' discriminators across orchestrated entries will make narrowing reliable and DX-friendly.
There was a problem hiding this 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 modalAppending .show() to create(...) ensures the example works as written.
153-159
: Clarify “promise” vs “thenable controller” and fix phrasingThe 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 guideLabel 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 MaybeRefMinor 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 compilesThe 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 resolutionSubject–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 usingThe 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.
📒 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
There was a problem hiding this 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
(nottop-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` fromapps/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 callstoast.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 calldestroy()
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 spaceMinor 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 spacingReads 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” termSince 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 orchestratorMirror 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 tooltipsMatches 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 tousePopover
; 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 headersmarkdownlint 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 contextThe 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” phrasingThe 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 optionsMinor 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
andtoasts
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.
📒 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
anduseToggle.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 anok
propertyThe promise returned by
create
is resolved with theBvTriggerableEvent
instance (see orchestratorShared.ts), and the BApp orchestrator hook setsevent.ok = true
for an'ok'
trigger andfalse
for'cancel'
. Therefore readingr.ok
is correct and no update to the example is required.
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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
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).
<script setup lang="ts"> | ||
const {create} = useToastController() | ||
const {create} = useToast() | ||
const promiseToast = () => { |
There was a problem hiding this comment.
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.
<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.
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() | ||
|
There was a problem hiding this comment.
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.
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.
There was a problem hiding this 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: usecreate(...)
instead ofshow(...)
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
vsisActive
)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 typeComparing 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
: EnsureuseToast
is available in the Nuxt playgroundIf 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 includemodelValue: true
and updated APIExamples 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 forawait 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 implementsSymbol.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
forref
/destroy
.Also applies to: 39-57
113-148
: Minor: position class computation looks toast-centricAll 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 formodal
andpopover
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 clarifyingfilter
type Doc/TS JSDocThe 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
: MakeresolvedProps
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 consistencyDirectly 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 missingteleportTo
propThe 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 pathFor 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.
📒 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:** If
true`, 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:** If
true`, 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:** If
true`, 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:** If
true`, 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 correctBoth components are registered with default
teleportTo: '#teleports'
and allow overrides viaopts?.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 removalDropping
BToastOrchestratorProps
from the import is consistent with the move to BApp/BOrchestrator and theuseToast
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 forteleportTo
defaults
/mergeDefaults
API matches prior discussion (boolean or custom merge fn).teleportTo
usingTeleportProps['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 argumentVue’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 throttlingThe updated explanation correctly states that requestAnimationFrame updates each frame (~16 ms) and how to throttle via interval.
useProvideDefaults( | ||
toRef(() => props.defaults), | ||
props.mergeDefaults | ||
) | ||
useRegistry(props.rtl) | ||
if (!props.noOrchestrator) { | ||
useOrchestratorRegistry() | ||
} |
There was a problem hiding this comment.
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.
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.
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.' | ||
) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
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
, andusePopover
feat!: combined the old plugins to match the new BApp and composables.
feat!: the old
useModal
was removed sinceuseToggle
does all what it did.Release-As: 0.40.0
END_COMMIT_OVERRIDE
Summary by CodeRabbit
New Features
Refactor
Documentation
Tests
Chores