-
-
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
|
WalkthroughRefactors orchestration and programmatic control for modals, toasts, and popovers: removes legacy controller plugins, introduces registry-based orchestrator components ( Changes
Sequence Diagram(s)sequenceDiagram
participant App as BApp
participant Registry as Orchestrator Registry
participant Composable as useModal/useToast/usePopover
participant Orchestrator as BOrchestrator
participant Component as User Component
App->>Registry: provide registry (store, flags)
Component->>Composable: call create(params)
Composable->>Registry: push/update orchestrator entry
Orchestrator->>Registry: watch store changes
Orchestrator->>Component: render dynamic component from store
Component->>Composable: call control methods (show/hide/toggle/destroy)
Composable->>Registry: update/remove entry
Orchestrator->>Composable: resolve promise on events
Estimated code review effort🎯 5 (Critical) | ⏱️ ~90+ minutes Possibly related issues
Possibly related PRs
Suggested reviewers
Poem
✨ 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 comments)
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
stackblitz for testing: old plugin and BOrchestrator: BApp with plugin: BOrchestrator and composables in App.vue: |
useProvideDefaults(props.defaults, props.mergeDefaults) | ||
useRoot(props.rtl) | ||
if (!props.noOrchestrator) { | ||
useOrchestratorRegistry(props.inherit) | ||
} |
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.
@VividLemon @dwgray I'm not sure how much we want to separate the registries.
My reasoning for this three ways is:
- defaults, you might want to override them in child components
- Orchestator, you might want to have seperate registries on some branch (not sure about this)
- useRoot (showHidestorage, modalmanager, breadcrumRegistry and rtlRegistry) are all global functionalities
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.
Does my latest comment, if we force them to use the registries always, fix this issue at all?
Otherwise it's likely fine to keep those three items always bound together
useOrchestratorRegistry(props.inherit)
props.inherit
etc isn't reactive. I haven't looked at the source code or anything, but considering it's use_
(the naming for a composable) then it seems like it should have a reactive input?
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.
@VividLemon I'm not sure anymore how the inherit stuff should go, we need to think about it a little more. I'm not really sure we need different registries with "inheritance" maybe we need a way to initilalise a new registry and pass that to a new orchestrator, which can be used in a branch of the app?
@dwgray what are your thoughts on the registries?
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.
BOrchestrator has a test with a filter function, so you could show some in a different orchestrator... like
const filter = (i) => i.id.match(/^profile/) && i.type === 'toast'
to match profile toasts do a different orchestrator. (and you need to filter them out of the primary orchestrator).
Do we need more than this actually?
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.
@xvaara I haven't used regestries before so I don't haveany strong opinions. I spent some time today trying to get my head wrapped around what you're doing here and wasn't fully successful.
I wonder if you could expand a little on the three points above from the perspective of use cases? Since you're using vue's provide/inject, for the defaults managed by useProvideDefaults, if some child component of BApp calls useProvideDefaults with different values, all its children will use the new defaults (or merged defaults) - that seems useful, but fairly corner case - like maybe the settings page of an app has different defaults for some of its components than the main App?
Is the same thing true of what you're doing with useOrchestratorRegistry? From my reading, the registry sets up the props for the different components that can be ochestrated (Popover, Modal, etc). I'm assuming these defaults override the defaults set using useProviderDefaults? But I get lost in where you would want to use one mechanism rather than the other.
I guess the other thing that you're doing with the filter is allowing different Orchestrators for the same type of orchestrated compnent based on some attribute of the component (in your example, that would be name & type match, but presumably you could have some arbitrary other field (like 'area') to filter on. But I'm struggly to see what that buys us.
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 removed the inherit all together from orchestratorRegistry. Didn't wrap my head around how it would be very useful, only edge cases came to mind.
@dwgray they get the new defaults or the merged ones, depending on the options for that. useOrchestratorRegistry doesn't set any defaults, just initialises the registries that the composables use.
My idea for the filter was that you can have multible ochestrators wrapped in different defaults, so maybe filter out error toasts and center them and make them red. Not 100% sure on the idea.
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 (4)
apps/docs/src/docs/migration-guide.md (1)
572-572
: Fix grammatical issue.Remove redundant "of" for better conciseness.
-The `create` accepts all of the properties that are defined on +The `create` accepts all the properties that are defined onapps/docs/src/docs/composables/usePopover.md (1)
13-13
: Improve grammar and clarity.Fix several grammatical issues for better readability.
-You must have initialized `BOrchestrator` component once and only once (doing multiple may display multiple `Popovers`). Also you need to provide the Orchestrator registy. use `BApp` component wrapping your app to initializes both of these for you. +You must initialize the `BOrchestrator` component once and only once (using multiple instances may display multiple `Popovers`). Also, you need to provide the Orchestrator registry. Use the `BApp` component wrapping your app to initialize both of these for you.apps/docs/src/docs/composables/useToast.md (1)
13-13
: Fix grammatical issues for consistency.Apply the same grammatical improvements as suggested for the popover documentation.
-You must have initialized `BOrchestrator` component once and only once (doing multiple may display multiple `Toasts`). Also you need to provide the Orchestrator registy. use `BApp` component wrapping your app to initializes both of these for you. +You must initialize the `BOrchestrator` component once and only once (using multiple instances may display multiple `Toasts`). Also, you need to provide the Orchestrator registry. Use the `BApp` component wrapping your app to initialize both of these for you.packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue (1)
120-120
: Fix typo in variable name.There's a typo in the variable name that should be corrected for consistency.
- const postisionsActive = items.value?.reduce( + const positionsActive = items.value?.reduce(And update the references on lines 131 and 140:
- for (const position in positionClasses) { - if (postisionsActive?.[position]) { + for (const position in positionClasses) { + if (positionsActive?.[position]) {- if (postisionsActive?.['modal']) { + if (positionsActive?.['modal']) {- if (postisionsActive?.['popover']) { + if (positionsActive?.['popover']) {
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (17)
apps/docs/.vitepress/theme/Layout.vue
(1 hunks)apps/docs/.vitepress/theme/index.ts
(0 hunks)apps/docs/src/docs/components/modal.md
(1 hunks)apps/docs/src/docs/composables/useModal.md
(1 hunks)apps/docs/src/docs/composables/usePopover.md
(5 hunks)apps/docs/src/docs/composables/useToast.md
(7 hunks)apps/docs/src/docs/migration-guide.md
(2 hunks)packages/bootstrap-vue-next/src/components/BApp/BApp.vue
(1 hunks)packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue
(1 hunks)packages/bootstrap-vue-next/src/components/BApp/index.ts
(1 hunks)packages/bootstrap-vue-next/src/composables/index.ts
(1 hunks)packages/bootstrap-vue-next/src/composables/orchestratorShared.ts
(1 hunks)packages/bootstrap-vue-next/src/composables/useModal/index.ts
(1 hunks)packages/bootstrap-vue-next/src/composables/useProvideDefaults/index.ts
(1 hunks)packages/bootstrap-vue-next/src/composables/useRoot.ts
(1 hunks)packages/bootstrap-vue-next/src/types/BootstrapVueOptions.ts
(7 hunks)packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts
(6 hunks)
💤 Files with no reviewable changes (1)
- apps/docs/.vitepress/theme/index.ts
✅ Files skipped from review due to trivial changes (2)
- apps/docs/src/docs/components/modal.md
- packages/bootstrap-vue-next/src/components/BApp/BApp.vue
🚧 Files skipped from review as they are similar to previous changes (4)
- packages/bootstrap-vue-next/src/components/BApp/index.ts
- packages/bootstrap-vue-next/src/composables/orchestratorShared.ts
- packages/bootstrap-vue-next/src/composables/index.ts
- packages/bootstrap-vue-next/src/types/BootstrapVueOptions.ts
🧰 Additional context used
🧠 Learnings (11)
📓 Common learnings
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
apps/docs/.vitepress/theme/Layout.vue (9)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:425-430
Timestamp: 2025-05-28T07:32:45.658Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex synchronization within sortTabs() is necessary and correct. When sorting tabs by DOM position, indices change, so activeIndex must be updated immediately to maintain consistency with activeId. This is not an unwanted side effect but a required consequence of the sorting operation.
Learnt from: unstoppablecarl
PR: bootstrap-vue-next/bootstrap-vue-next#2671
File: packages/bootstrap-vue-next/src/components/BToast/_toast.scss:1-3
Timestamp: 2025-04-27T17:30:42.045Z
Learning: In global SCSS files for bootstrap-vue-next, `:deep()` combinator should not be used as it only works in Vue's scoped style blocks. Standard CSS/SCSS selectors should be used instead.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:384-404
Timestamp: 2025-05-28T07:57:19.915Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex and activeId watchers are intentionally designed with separation of concerns: activeIndex watcher handles activate-tab event emission and complex validation logic, while activeId watcher is kept simple for synchronization between activeId and activeIndex values only.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:85-86
Timestamp: 2025-05-26T17:28:35.902Z
Learning: In the `useBLinkTagResolver` function in `packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts`, the `routerComponentName` parameter is required and typed as `MaybeRefOrGetter<string>`, ensuring it cannot be undefined.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2679
File: apps/docs/.vitepress/theme/Layout.vue:0-0
Timestamp: 2025-05-01T23:40:56.146Z
Learning: In bootstrap-vue-next, the `useScrollspy` hook returns an object with a `current` property which is the ID string (or null) of the currently active item, not an object containing an ID.
packages/bootstrap-vue-next/src/composables/useProvideDefaults/index.ts (5)
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:85-86
Timestamp: 2025-05-26T17:28:35.902Z
Learning: In the `useBLinkTagResolver` function in `packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts`, the `routerComponentName` parameter is required and typed as `MaybeRefOrGetter<string>`, ensuring it cannot be undefined.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: unstoppablecarl
PR: bootstrap-vue-next/bootstrap-vue-next#2671
File: packages/bootstrap-vue-next/src/components/BToast/_toast.scss:1-3
Timestamp: 2025-04-27T17:30:42.045Z
Learning: In global SCSS files for bootstrap-vue-next, `:deep()` combinator should not be used as it only works in Vue's scoped style blocks. Standard CSS/SCSS selectors should be used instead.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
packages/bootstrap-vue-next/src/composables/useModal/index.ts (9)
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2679
File: apps/docs/.vitepress/theme/Layout.vue:0-0
Timestamp: 2025-05-01T23:40:56.146Z
Learning: In bootstrap-vue-next, the `useScrollspy` hook returns an object with a `current` property which is the ID string (or null) of the currently active item, not an object containing an ID.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:85-86
Timestamp: 2025-05-26T17:28:35.902Z
Learning: In the `useBLinkTagResolver` function in `packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts`, the `routerComponentName` parameter is required and typed as `MaybeRefOrGetter<string>`, ensuring it cannot be undefined.
Learnt from: unstoppablecarl
PR: bootstrap-vue-next/bootstrap-vue-next#2671
File: packages/bootstrap-vue-next/src/components/BToast/_toast.scss:1-3
Timestamp: 2025-04-27T17:30:42.045Z
Learning: In global SCSS files for bootstrap-vue-next, `:deep()` combinator should not be used as it only works in Vue's scoped style blocks. Standard CSS/SCSS selectors should be used instead.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2669
File: apps/docs/src/data/components/table.data.ts:334-336
Timestamp: 2025-04-24T20:35:48.629Z
Learning: The generic type parameter for table items should use the singular form `Item` rather than the plural `Items` to improve readability and follow TypeScript conventions. This change would primarily affect two files: `packages/bootstrap-vue-next/src/types/ComponentProps.ts` and `apps/docs/src/data/components/table.data.ts`.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:384-404
Timestamp: 2025-05-28T07:57:19.915Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex and activeId watchers are intentionally designed with separation of concerns: activeIndex watcher handles activate-tab event emission and complex validation logic, while activeId watcher is kept simple for synchronization between activeId and activeIndex values only.
apps/docs/src/docs/composables/useModal.md (7)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2669
File: apps/docs/src/data/components/table.data.ts:334-336
Timestamp: 2025-04-24T20:35:48.629Z
Learning: The generic type parameter for table items should use the singular form `Item` rather than the plural `Items` to improve readability and follow TypeScript conventions. This change would primarily affect two files: `packages/bootstrap-vue-next/src/types/ComponentProps.ts` and `apps/docs/src/data/components/table.data.ts`.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:82-83
Timestamp: 2025-05-26T17:27:44.251Z
Learning: In Vue 3.3+, `toRef()` can accept any input type including raw values, existing refs, and getter functions (MaybeRefOrGetter). It will create a ref from the input or use the existing ref if one is passed. Using `toRef()` for simple property access is more performant than `computed()` because it avoids the caching overhead that computeds provide.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:384-404
Timestamp: 2025-05-28T07:57:19.915Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex and activeId watchers are intentionally designed with separation of concerns: activeIndex watcher handles activate-tab event emission and complex validation logic, while activeId watcher is kept simple for synchronization between activeId and activeIndex values only.
packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (4)
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2669
File: apps/docs/src/data/components/table.data.ts:334-336
Timestamp: 2025-04-24T20:35:48.629Z
Learning: The generic type parameter for table items should use the singular form `Item` rather than the plural `Items` to improve readability and follow TypeScript conventions. This change would primarily affect two files: `packages/bootstrap-vue-next/src/types/ComponentProps.ts` and `apps/docs/src/data/components/table.data.ts`.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
packages/bootstrap-vue-next/src/composables/useRoot.ts (5)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:85-86
Timestamp: 2025-05-26T17:28:35.902Z
Learning: In the `useBLinkTagResolver` function in `packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts`, the `routerComponentName` parameter is required and typed as `MaybeRefOrGetter<string>`, ensuring it cannot be undefined.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2669
File: apps/docs/src/data/components/table.data.ts:334-336
Timestamp: 2025-04-24T20:35:48.629Z
Learning: The generic type parameter for table items should use the singular form `Item` rather than the plural `Items` to improve readability and follow TypeScript conventions. This change would primarily affect two files: `packages/bootstrap-vue-next/src/types/ComponentProps.ts` and `apps/docs/src/data/components/table.data.ts`.
apps/docs/src/docs/composables/usePopover.md (7)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:622-626
Timestamp: 2025-06-05T11:43:10.793Z
Learning: In migration guides, links to the old/previous version's documentation (like bootstrap-vue.org) are appropriate and helpful when explaining deprecated features, as they provide users with reference points for what they're migrating from.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:384-404
Timestamp: 2025-05-28T07:57:19.915Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex and activeId watchers are intentionally designed with separation of concerns: activeIndex watcher handles activate-tab event emission and complex validation logic, while activeId watcher is kept simple for synchronization between activeId and activeIndex values only.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:85-86
Timestamp: 2025-05-26T17:28:35.902Z
Learning: In the `useBLinkTagResolver` function in `packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts`, the `routerComponentName` parameter is required and typed as `MaybeRefOrGetter<string>`, ensuring it cannot be undefined.
apps/docs/src/docs/composables/useToast.md (5)
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2669
File: apps/docs/src/data/components/table.data.ts:334-336
Timestamp: 2025-04-24T20:35:48.629Z
Learning: The generic type parameter for table items should use the singular form `Item` rather than the plural `Items` to improve readability and follow TypeScript conventions. This change would primarily affect two files: `packages/bootstrap-vue-next/src/types/ComponentProps.ts` and `apps/docs/src/data/components/table.data.ts`.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
apps/docs/src/docs/migration-guide.md (6)
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:622-626
Timestamp: 2025-06-05T11:43:10.793Z
Learning: In migration guides, links to the old/previous version's documentation (like bootstrap-vue.org) are appropriate and helpful when explaining deprecated features, as they provide users with reference points for what they're migrating from.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: unstoppablecarl
PR: bootstrap-vue-next/bootstrap-vue-next#2671
File: packages/bootstrap-vue-next/src/components/BToast/_toast.scss:1-3
Timestamp: 2025-04-27T17:30:42.045Z
Learning: In global SCSS files for bootstrap-vue-next, `:deep()` combinator should not be used as it only works in Vue's scoped style blocks. Standard CSS/SCSS selectors should be used instead.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2679
File: apps/docs/.vitepress/theme/Layout.vue:0-0
Timestamp: 2025-05-01T23:40:56.146Z
Learning: In bootstrap-vue-next, the `useScrollspy` hook returns an object with a `current` property which is the ID string (or null) of the currently active item, not an object containing an ID.
packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue (7)
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2425
File: packages/bootstrap-vue-next/src/plugins/popoverController/index.ts:138-140
Timestamp: 2025-04-28T22:48:46.738Z
Learning: In bootstrap-vue-next, `PopoverOrchestratorParam` includes an `id` field of type `ControllerKey` through inheritance from base types. This field is declared in the `BvControllerOptions` interface and propagated through the type hierarchy.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2701
File: apps/docs/src/docs/migration-guide.md:630-632
Timestamp: 2025-05-23T23:58:07.165Z
Learning: The `<NotYetImplemented/>` component in the bootstrap-vue-next documentation automatically renders text indicating "Not Yet Implemented", so additional explanatory text about features not being implemented is redundant when this component is used.
Learnt from: dwgray
PR: bootstrap-vue-next/bootstrap-vue-next#2762
File: apps/docs/src/docs/components/tooltip.md:0-0
Timestamp: 2025-06-26T19:46:19.333Z
Learning: BTooltip is a very thin wrapper around BPopover in bootstrap-vue-next. There is no separate `useTooltipController` composable - the `usePopoverController` composable can be used to programmatically control both popovers and tooltips.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:240-261
Timestamp: 2025-05-28T07:01:55.095Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the complex initialization logic with updateInitialActiveIndex and updateInitialActiveId flags is necessary for SSR compatibility. Tab initialization cannot be deferred to mounted lifecycle because tabs must be available for server-side rendering of the initial HTML state.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:384-404
Timestamp: 2025-05-28T07:57:19.915Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex and activeId watchers are intentionally designed with separation of concerns: activeIndex watcher handles activate-tab event emission and complex validation logic, while activeId watcher is kept simple for synchronization between activeId and activeIndex values only.
Learnt from: VividLemon
PR: bootstrap-vue-next/bootstrap-vue-next#2691
File: packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts:85-86
Timestamp: 2025-05-26T17:28:35.902Z
Learning: In the `useBLinkTagResolver` function in `packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts`, the `routerComponentName` parameter is required and typed as `MaybeRefOrGetter<string>`, ensuring it cannot be undefined.
Learnt from: xvaara
PR: bootstrap-vue-next/bootstrap-vue-next#2716
File: packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue:425-430
Timestamp: 2025-05-28T07:32:45.658Z
Learning: In BTabs component (packages/bootstrap-vue-next/src/components/BTabs/BTabs.vue), the activeIndex synchronization within sortTabs() is necessary and correct. When sorting tabs by DOM position, indices change, so activeIndex must be updated immediately to maintain consistency with activeId. This is not an unwanted side effect but a required consequence of the sorting operation.
🧬 Code Graph Analysis (1)
packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (2)
packages/bootstrap-vue-next/src/utils/classes.ts (1)
BvTriggerableEvent
(68-90)packages/bootstrap-vue-next/src/types/ComponentProps.ts (4)
BToastProps
(1290-1315)BTooltipProps
(1353-1355)BPopoverProps
(1317-1351)BModalProps
(1363-1426)
🪛 LanguageTool
apps/docs/src/docs/composables/useModal.md
[uncategorized] ~13-~13: This verb may not be in the correct tense. Consider changing the tense to fit the context better.
Context: ...ginAlert /> ## BOrchestrator You must have initialized BOrchestrator
component once and only...
(AI_EN_LECTOR_REPLACEMENT_VERB_TENSE)
[uncategorized] ~13-~13: You might be missing the article “the” here.
Context: ...Orchestrator You must have initialized BOrchestrator
component once and only o...
(AI_EN_LECTOR_MISSING_DETERMINER_THE)
[uncategorized] ~13-~13: A comma may be missing after the conjunctive/linking adverb ‘Also’.
Context: ...ultiple may display multiple Modals
). Also you need to provide the Orchestrator re...
(SENT_START_CONJUNCTIVE_LINKING_ADVERB_COMMA)
[uncategorized] ~13-~13: You might be missing the article “the” here.
Context: ...o provide the Orchestrator registy. use BApp
component wrapping your app to ini...
(AI_EN_LECTOR_MISSING_DETERMINER_THE)
[style] ~99-~99: Unless you want to emphasize “not”, use “cannot” which is more common.
Context: ...ontrol to be desired. For instance, you can not add HTML to any slot value. This is whe...
(CAN_NOT_PREMIUM)
[misspelling] ~148-~148: Did you mean “at a time”, “at the time”, or “at times”?
Context: ...create` method will resolve the promise at time of hiding the modal, rather than waitin...
(AT_TIME2)
[style] ~180-~180: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...s function sets the props of the modal. This is useful for updating the modal after ...
(ENGLISH_WORD_REPEAT_BEGINNING_RULE)
[style] ~184-~184: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...d. - destroy: () => Promise<void>
This function destroys the modal and cleans ...
(ENGLISH_WORD_REPEAT_BEGINNING_RULE)
[uncategorized] ~187-~187: Did you mean: “By default,”?
Context: ...ces associated with it. ### Lifecycle By default the modal is destroyed once it's closed...
(BY_DEFAULT_COMMA)
[uncategorized] ~188-~188: Possible missing comma found.
Context: ...ce it's closed. If you want to keep the modal use the option 'keep' in the second arg...
(AI_HYDRA_LEO_MISSING_COMMA)
[style] ~206-~206: As a shorter alternative for ‘able to’, consider using “can also”.
Context: ... create modals in a global context, you are also able to hide modals from anywhere in the app. T...
(BE_ABLE_TO)
apps/docs/src/docs/composables/usePopover.md
[uncategorized] ~13-~13: This verb may not be in the correct tense. Consider changing the tense to fit the context better.
Context: ...ginAlert /> ## BOrchestrator You must have initialized BOrchestrator
component once and only...
(AI_EN_LECTOR_REPLACEMENT_VERB_TENSE)
[uncategorized] ~13-~13: You might be missing the article “the” here.
Context: ...Orchestrator You must have initialized BOrchestrator
component once and only o...
(AI_EN_LECTOR_MISSING_DETERMINER_THE)
[uncategorized] ~13-~13: A comma may be missing after the conjunctive/linking adverb ‘Also’.
Context: ...tiple may display multiple Popovers
). Also you need to provide the Orchestrator re...
(SENT_START_CONJUNCTIVE_LINKING_ADVERB_COMMA)
[uncategorized] ~13-~13: You might be missing the article “the” here.
Context: ...o provide the Orchestrator registy. use BApp
component wrapping your app to ini...
(AI_EN_LECTOR_MISSING_DETERMINER_THE)
apps/docs/src/docs/composables/useToast.md
[uncategorized] ~13-~13: This verb may not be in the correct tense. Consider changing the tense to fit the context better.
Context: ...ginAlert /> ## BOrchestrator You must have initialized BOrchestrator
component once and only...
(AI_EN_LECTOR_REPLACEMENT_VERB_TENSE)
[uncategorized] ~13-~13: You might be missing the article “the” here.
Context: ...Orchestrator You must have initialized BOrchestrator
component once and only o...
(AI_EN_LECTOR_MISSING_DETERMINER_THE)
[uncategorized] ~13-~13: A comma may be missing after the conjunctive/linking adverb ‘Also’.
Context: ...ultiple may display multiple Toasts
). Also you need to provide the Orchestrator re...
(SENT_START_CONJUNCTIVE_LINKING_ADVERB_COMMA)
[uncategorized] ~13-~13: You might be missing the article “the” here.
Context: ...o provide the Orchestrator registy. use BApp
component wrapping your app to ini...
(AI_EN_LECTOR_MISSING_DETERMINER_THE)
apps/docs/src/docs/migration-guide.md
[style] ~572-~572: Consider removing “of” to be more concise
Context: .../ModalConfirm.vue The create
accepts all of the properties that are defined on [BModal]...
(ALL_OF_THE)
🪛 markdownlint-cli2 (0.17.2)
apps/docs/src/docs/composables/useModal.md
153-153: Multiple consecutive blank lines
Expected: 1; Actual: 2
(MD012, no-multiple-blanks)
apps/docs/src/docs/composables/useToast.md
1-1: First line in a file should be a top-level heading
(MD041, first-line-heading, first-line-h1)
🪛 GitHub Check: test-lint
packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue
[warning] 104-104:
Unexpected console statement
🔇 Additional comments (20)
packages/bootstrap-vue-next/src/composables/useRoot.ts (2)
22-97
: LGTM! Well-structured global state management.The
useRoot
composable effectively implements global state management using Vue's provide/inject pattern. The conditional setup ensures services are only initialized once, and the reactive registry implementations are correctly structured.
99-140
: Efficient show/hide registry implementation.The
_newShowHideRegistry
function provides a clean API for managing show/hide state with proper cleanup and ID updating mechanisms. The readonly wrapper on values ensures data integrity.apps/docs/src/docs/migration-guide.md (2)
558-574
: Consistent migration guide updates.The documentation correctly reflects the transition from
useModalController
touseModal
and updates the API examples to use the newcreate
method instead ofshow
.
665-665
: Consistent popover migration reference.Correctly updates the deprecated
$root
events reference to point users to the newusePopover
composable.apps/docs/.vitepress/theme/Layout.vue (2)
3-154
: Excellent adoption of the new BApp architecture.The layout correctly wraps the entire application in the
BApp
component, which initializes the global orchestration context and replaces the need for individual orchestrator components.
159-159
: Correct import update.Properly adds
BApp
to the imports to support the new root component wrapper pattern.apps/docs/src/docs/composables/usePopover.md (2)
1-29
: Consistent documentation updates for the new orchestrator pattern.The documentation correctly reflects the migration from
usePopoverController
tousePopover
and the newBOrchestrator
component usage.
145-151
: Updated imports align with new composable names.The import statements correctly reflect the transition to the new
usePopover
composable and maintain compatibility with the orchestrator pattern.apps/docs/src/docs/composables/useToast.md (2)
1-30
: Comprehensive documentation updates for toast orchestration.The documentation successfully migrates all references from
useToastController
touseToast
and correctly explains the newBOrchestrator
usage pattern.
249-256
: Import and usage examples align with new architecture.The script setup correctly demonstrates the new
useToast
composable usage and import patterns, providing clear examples for developers migrating to the orchestrator approach.packages/bootstrap-vue-next/src/composables/useProvideDefaults/index.ts (2)
6-37
: LGTM! Default injection and merging logic is well implemented.The composable correctly handles the provide/inject chain and the merging strategies. The past concern about early return breaking the chain has been resolved - the
provide
call always executes regardless of whether parent defaults exist.
48-83
: Well-designed deep merge implementation with circular reference protection.The
deepMerge
function properly handles circular references, preserves arrays, and maintains immutability by creating new objects. TheisPlainObject
helper provides accurate type checking.packages/bootstrap-vue-next/src/components/BApp/BOrchestrator.vue (2)
103-107
: Error handling for missing registry is now properly implemented.The console warning addresses the previous concern about silently continuing when the orchestrator registry is missing, helping developers identify configuration issues.
1-67
: Well-structured orchestrator template with proper event handling.The template effectively handles rendering of different UI element types with proper event lifecycle management and slot forwarding. The use of TransitionGroup and dynamic components is appropriate for this orchestration pattern.
packages/bootstrap-vue-next/src/composables/useModal/index.ts (3)
227-234
: Component type checking correctly implemented.The previous issue with fragile string-based component name comparison has been resolved. Now using direct type comparison with the imported
BModal
component, which is much more robust and won't break with minification.
29-122
: Comprehensive modal orchestration implementation.The
create
method provides a sophisticated promise-based API with proper reactive state management, lifecycle handling, and cleanup. The deep watching and modelValue synchronization logic is well thought out.
124-262
: Well-designed modal control methods.The
show
,hide
,hideAll
,get
, andcurrent
methods provide comprehensive modal management capabilities with proper fallback handling between orchestrated and traditional modal components.apps/docs/src/docs/composables/useModal.md (1)
1-303
: Comprehensive and well-structured documentation.The documentation effectively covers the new
useModal
API, including theBApp
/BOrchestrator
architecture, promise-based modal creation, reactivity, lifecycle management, and global modal control. The examples are clear and demonstrate practical usage patterns.The previous issue with incorrect type references has been resolved.
packages/bootstrap-vue-next/src/types/ComponentOrchestratorTypes.ts (2)
14-26
: Well-designed generic promise interface.The unified
PromiseWithComponent
interface provides consistent method signatures across all orchestrator types. The previous issue with inconsistenthide
method signatures has been resolved.
34-247
: Comprehensive type definitions with proper discriminators.The orchestrator array value types are well-structured with:
- Proper type discriminators (
'type': 'modal' | 'toast' | 'popover'
)- Consistent naming conventions (
_self
,_component
)- Generic promise integration
- Comprehensive slot and event handler typing
The
OrchestratorArrayValue
union type enables proper type discrimination at runtime.
I apologize to make this point now, kind of changing my mind, but simply having a registry point that contains a few refs is nothing to be concerned about in terms of performance. The major issue with the old size of the plugins was the scale of the business logic in them. If this logic is moved to composables, then by simply not using the composable, it is not included in the bundle (unlike the plugins). So if the "registries" are just some .provide() of refs, then we could just be best off forcing it and making no concessions for their removal (beyond not using bapp). Does anyone have any thoughts on this? I feel pretty bad upon thinking about this so late. |
They are only a few provides, yes. All the logic is in the composables now anyways. So I also see no reason for the user the be able to "disable" them. Do we want to continue supporting the plugin "way" of createBootstrap()? I don't know a way to use composables directly in them since you have to use the passed app prop for provide. In this PR i'm pulling in a function from the composable that I can just use in app.provide. |
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.
}, | ||
} 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.
|
||
The modern way to setup bootstrap-vue-next using the `BApp` component: | ||
|
||
See the [BApp component documentation](/docs/components/bapp) for complete configuration options. |
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
Verify BApp docs link path
Link points to “/docs/components/bapp”, but the docs file appears to be “components/app.md”. Confirm the correct route and update if needed.
🏁 Script executed:
#!/bin/bash
# Check for BApp docs file to validate the route slug
fd -a 'apps/docs/src/docs/components' -t d
fd -a 'apps/docs/src/docs/components' -e md | sed 's|.*/apps/docs/src||'
rg -n "^[#]+\\s+BApp" apps/docs/src/docs/components -n -S || true
Length of output: 1064
Update BApp docs link path
The link currently points to /docs/components/bapp
, but the actual file is apps/docs/src/docs/components/app.md
, which generates the route /docs/components/app
. Please update the link:
- See the [BApp component documentation](/docs/components/bapp) for complete configuration options.
+ See the [BApp component documentation](/docs/components/app) for complete configuration options.
File to update:
- apps/docs/src/docs.md (line 89)
📝 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.
See the [BApp component documentation](/docs/components/bapp) for complete configuration options. | |
See the [BApp component documentation](/docs/components/app) for complete configuration options. |
🤖 Prompt for AI Agents
In apps/docs/src/docs.md around line 89, the docs link currently points to
/docs/components/bapp but the generated route/file is /docs/components/app;
update the Markdown link target to /docs/components/app (i.e., change the href
from /docs/components/bapp to /docs/components/app) so it points to
apps/docs/src/docs/components/app.md.
BApp Component
The
BApp
component is the new recommended way to configure bootstrap-vue-next. It replaces the plugin-based approach and provides better defaults management and orchestrator integration.Features
Basic Usage
Configuration
Setting Component Defaults
Advanced Defaults Configuration
Orchestrator Configuration
Disabling Orchestrators
RTL Configuration
Migration from Plugins
Before (Plugin-based)
After (BApp-based)
Props
defaults
Partial<BvnComponentProps>
undefined
mergeDefaults
boolean
false
deepMerge
boolean
false
teleportTo
TeleportProps['to']
undefined
noModals
boolean
false
noToasts
boolean
false
noPopovers
boolean
false
noOrchestrator
boolean
false
appendToast
boolean
false
inhert
boolean
false
rtl
boolean | RTLConfig
false
RTL Configuration Object
Composables
When using
BApp
, the following composables work without requiring plugin installation:useToastController()
- Create and manage toasts programmaticallyuseModalController()
- Create and manage modals programmaticallyusePopoverController()
- Create and manage popovers programmaticallyInternal Features
The
BApp
component automatically provides several internal services:Default Merging Behavior
The component supports three modes for handling defaults:
defaults
prop completely replaces any existing defaultsmergeDefaults: true
): Shallow merge with existing defaultsmergeDefaults: true, deepMerge: true
): Deep merge nested objectsTeleporting
By default, orchestrators render inline. Use
teleportTo
to render them elsewhere:Backward Compatibility
The
BApp
component is fully backward compatible with existing plugin-based setups. You can gradually migrate by:BApp
to your root componentBApp
propsThe plugins will show deprecation warnings but continue to work until removed in a future version.
Notes
BApp
or orchestrator should be active at a time per applicationteleportTo
is specifiedPR checklist
What kind of change does this PR introduce? (check at least one)
fix(...)
feat(...)
fix(...)
docs(...)
The PR fulfills these requirements:
CHANGELOG
is generated from these messages, and determines the next version type. Pull requests that do not follow conventional commits or do not have an override will be deniedSummary by CodeRabbit
New Features
Refactor
Bug Fixes
Documentation
Tests
Chores