-
-
Notifications
You must be signed in to change notification settings - Fork 157
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
|
## Walkthrough
This change refactors modal, toast, and popover orchestration in the codebase. It removes separate controller plugins and composables, introduces a unified orchestrator plugin and composables (`useModal`, `useToast`, `usePopover`), adds new orchestrator components, updates documentation and tests, and centralizes state management for overlays.
## Changes
| File(s) | Change Summary |
|---------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `.../BApp/BApp.vue`, `.../BApp/BOrchestrator.vue`, `.../BApp/index.ts`, `.../BApp/bapp.spec.ts` | Added new `BApp` and `BOrchestrator` components for root-level orchestration, with tests and export. |
| `.../BModal/BModalOrchestrator.vue`, `.../BPopover/BPopoverOrchestrator.vue`, `.../BToast/BToastOrchestrator.vue` | Refactored orchestrator components to delegate rendering and control to `BOrchestrator`, removing manual orchestration and adding deprecation warnings. |
| `.../src/composables/useModal/index.ts`, `.../src/composables/usePopover/index.ts`, `.../src/composables/useToast/index.ts` | Replaced controller composables with unified `useModal`, `usePopover`, and `useToast` composables, providing promise-based creation and lifecycle management. |
| `.../src/composables/orchestratorShared.ts`, `.../src/composables/useProvideDefaults/index.ts`, `.../src/composables/useRoot.ts` | Added new composables for orchestrator registry, hierarchical defaults, and root-level state management. |
| `.../src/plugins/orchestrator/index.ts`, `.../src/plugins/index.ts`, `.../src/plugins/createBootstrap/index.ts` | Added and registered a new orchestrator plugin, removing previous modal, toast, and popover controller plugins. |
| `.../src/types/ComponentOrchestratorTypes.ts`, `.../src/types/ComponentProps.ts`, `.../src/types/BootstrapVueOptions.ts` | Updated and unified orchestrator-related types, added new props and options for `BApp`, and updated composable and component path mappings. |
| `.../src/utils/keys.ts` | Unified orchestrator injection keys, removing separate keys for modal, toast, and popover controllers. |
| `.../src/composables/index.ts`, `.../src/components/index.ts` | Updated exports to reflect new composables and components. |
| `.../src/plugins/showHide/index.ts` | Refactored show/hide plugin to use centralized registry logic. |
| `.../src/utils/getElement.ts` | Improved environment safety for element selection utility. |
| `.../src/composables/useModalController/index.ts`, `.../src/composables/usePopoverController/index.ts`, `.../src/composables/useToastController/index.ts` | Deleted controller composables for modal, popover, and toast. |
| `.../src/plugins/modalController/index.ts`, `.../src/plugins/popoverController/index.ts`, `.../src/plugins/toastController/index.ts` | Deleted controller plugins for modal, popover, and toast. |
| `.../App.vue`, `.../main.ts` | Updated root component and app setup to use new orchestrator and app components. |
| `.../src/docs/demo/ModalConfirm.vue`, `.../src/docs/demo/ModalMessageBox.vue`, `.../src/components/TableOfContentsNav.vue` | Updated demo and navigation components to use new composables and orchestrator store. |
| `.../src/docs/components/modal.md`, `.../src/docs/components/popover.md`, `.../src/docs/components/toast.md`, `.../src/docs/composables.md`, `.../src/docs/composables/useModal.md`, `.../src/docs/composables/usePopover.md`, `.../src/docs/composables/useToast.md`, `.../src/docs/migration-guide.md` | Updated documentation to reflect new APIs, composable names, and usage patterns. |
| `.../src/docs/composables/useModalController.md` | Deleted documentation for removed `useModalController` composable. |
| `.../src/components/Comps/TModal.vue`, `.../src/components/Comps/TToast.vue` | Updated playground components to use new composables and orchestrator store. |
| `.../src/components/BToast/toast-orchestrator.spec.ts` | Updated test assertions for toast orchestrator container class. |
## Sequence Diagram(s)
```mermaid
sequenceDiagram
participant App
participant BApp
participant BOrchestrator
participant useModal/useToast/usePopover
participant Store
App->>BApp: Mount root component
BApp->>BOrchestrator: Conditionally render orchestrator
useModal/useToast/usePopover->>Store: create({props, slots, ...})
Store->>BOrchestrator: Reactive updates (store array)
BOrchestrator->>App: Render overlays (modal/toast/popover) via TransitionGroup
App->>useModal/useToast/usePopover: Call control methods (show/hide/toggle/destroy)
useModal/useToast/usePopover->>Store: Update store/reactivity
BOrchestrator->>App: Emit events, resolve promises, handle lifecycle Possibly related PRs
Suggested reviewers
Poem
|
@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.
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. |
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
BApp
andBOrchestrator
components.useModal
,useToast
,usePopover
,useRoot
, anduseProvideDefaults
for enhanced programmatic control and global defaults management.Bug Fixes
document
object.Documentation
Refactor
Tests
Chores