Skip to content

Conversation

@VividLemon
Copy link
Member

@VividLemon VividLemon commented May 11, 2025

Describe the PR

A clear and concise description of what the pull request does.

Small replication

A small replication or video walkthrough can help demonstrate the changes made. This is optional, but can help observe the intended changes. A mentioned issue that contains a replication also works.

PR checklist

What kind of change does this PR introduce? (check at least one)

  • Bugfix 🐛 - fix(...)
  • Feature - feat(...)
  • ARIA accessibility - fix(...)
  • Documentation update - docs(...)
  • Other (please describe)

The PR fulfills these requirements:

  • Pull request title and all commits follow the Conventional Commits convention or has an override in this pull request body This is very important, as the CHANGELOG is generated from these messages, and determines the next version type. Pull requests that do not follow conventional commits or do not have an override will be denied

Summary by CodeRabbit

  • Refactor

    • Improved internal handling of reactive properties and composables for better consistency and maintainability. No changes to visible features or user-facing behavior.
  • Chores

    • Updated the package manager version to pnpm 10.11.0.
    • Cleaned up formatting and whitespace in documentation and changelog files for improved readability. No changes to documentation content.

perf: avoid watching entire objects in some cases

chore: use pnpm v10.10
@bolt-new-by-stackblitz
Copy link

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

@coderabbitai
Copy link
Contributor

coderabbitai bot commented May 11, 2025

Walkthrough

This update includes refactoring of several composable function signatures to accept destructured objects with getter functions or reactive values, instead of computed objects. It also introduces safer access patterns and unwrapping of reactivity in composables. Additionally, there are formatting and whitespace cleanups in documentation and changelog files, and a minor update to the package manager version in package.json.

Changes

File(s) Change Summary
apps/docs/src/docs/migration-guide.md Removed an extraneous blank line after a note; whitespace cleanup only.
package.json Updated packageManager field: pnpm version incremented from 10.8.0 to 10.11.0.
packages/bootstrap-vue-next/CHANGELOG.md, packages/nuxt/CHANGELOG.md Markdown formatting and whitespace adjustments for consistency; no content changes.
packages/bootstrap-vue-next/src/components/BAlert/BAlert.vue,
.../BToast/BToast.vue
Refactored arguments to useCountdownHover from computed objects to objects of getter functions for reactivity.
packages/bootstrap-vue-next/src/components/BFormTextarea/BFormTextarea.vue Refactored config passed to useTextareaResize from a computed object to an object of getter functions for each prop.
packages/bootstrap-vue-next/src/components/BLink/BLink.vue Changed useBLinkTagResolver argument from a computed object to an object of getter functions for each prop.
packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts Refactored useBLinkTagResolver to accept destructured reactive props; improved reactivity handling and optional chaining.
packages/bootstrap-vue-next/src/composables/useCountdownHover.ts Refactored to accept destructured reactive parameters instead of a single props object.
packages/bootstrap-vue-next/src/composables/useTextareaResize.ts Changed signature to destructured reactive parameters; internal logic updated for direct reactive value access.
packages/bootstrap-vue-next/src/composables/useTransitions.ts Moved transition prop constants to module scope; function now reuses these instead of recreating objects on each call.

Sequence Diagram(s)

sequenceDiagram
    participant Component as Component (e.g., BAlert, BToast, BFormTextarea, BLink)
    participant Composable as Composable (e.g., useCountdownHover, useTextareaResize, useBLinkTagResolver)

    Component->>Composable: Call composable with object of getter functions (reactive props)
    Composable->>Composable: Unwrap each prop using toValue or similar
    Composable-->>Component: Return computed/reactive results
Loading

Poem

A hop, a skip, a gentle tweak,
Refactors here, some whitespace sleek.
Composables now with getters bright,
Their reactivity just feels right!
Changelogs neat, transitions clear,
The codebase hums—springtime is here! 🐇✨


📜 Recent review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 3c2a998 and 8d1448a.

📒 Files selected for processing (1)
  • package.json (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • package.json
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: build

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

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

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

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

@pkg-pr-new
Copy link

pkg-pr-new bot commented May 11, 2025

bsvn-vite-ts

npm i https://pkg.pr.new/bootstrap-vue-next/bootstrap-vue-next@2691
npm i https://pkg.pr.new/bootstrap-vue-next/bootstrap-vue-next/@bootstrap-vue-next/nuxt@2691

commit: 8d1448a

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🔭 Outside diff range comments (1)
packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts (1)

129-133: ⚠️ Potential issue

Incorrect query-string assembly – join('=') should be join('&')

Current output for {a:1, b:2} becomes a=1=b=2, which is invalid.

-        ? `?${Object.keys(stableTo.query)
-            .map((e) => `${e}=${stableTo.query?.[e]}`)
-            .join('=')}`
+        ? `?${Object.keys(stableTo.query)
+            .map((key) => `${encodeURIComponent(key)}=${encodeURIComponent(String(stableTo.query![key]))}`)
+            .join('&')}`

Also added encodeURIComponent for safety.

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

11-13: Hyphens used for nested lists
The indentation and marker style for the nested devDependencies entry are clear and uniform. To prevent markdownlint from flagging repeated “### Dependencies” headings in a changelog context, you might disable the no-duplicate-heading rule at the top of this file.

<!-- markdownlint-disable MD024 -->
packages/bootstrap-vue-next/src/components/BToast/BToast.vue (1)

218-223: Double-check reactivity of the newly-passed getters

Passing arrow-function getters works with toValue, but remember they are evaluated only when toValue() is called inside useCountdownHover.
If modelValue switches between number and boolean while the mouse is already over the toast, the watcher in useCountdownHover will not re-fire until the hover state toggles. That means modelValueIgnoresHover may be stale for the remainder of the current hover session.

If you expect modelValue to change during an active hover, consider adding a watch(modelValue, …) inside useCountdownHover (or call toValue() reactively with a computed) so the pause/resume logic reacts immediately.
Otherwise, the current approach is fine.

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

25-36: Use Boolean() or !! for explicit coercion

To improve readability you can shorten the guard clauses:

-    if (toValue(noHoverPause) ?? false) return
+    if (!!toValue(noHoverPause)) return

Same for noResumeOnHoverLeave and modelValueIgnoresHover.

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

29-35: toValue(maxRows) may return undefined – keep the Number parser happy

When maxRows is omitted, toValue(maxRows) is undefined.
While parseInt(undefined) returns NaN (handled by nanToZero), passing an explicit null communicates intent and avoids unnecessary parsing work:

-    computed(() => toValue(maxRows) || NaN),
+    computed(() => {
+      const v = toValue(maxRows)
+      return v == null ? NaN : v
+    }),

Minor, but it removes an || shortcut and one implicit coercion.


88-92: Guard against undefined noAutoShrink

Same reasoning as above – ensure a boolean:

-    if (toValue(noAutoShrink) && (Number.parseFloat(oldHeight.toString()) || 0) > newHeight) {
+    if (!!toValue(noAutoShrink) && (Number.parseFloat(oldHeight.toString()) || 0) > newHeight) {
packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts (1)

88-93: Tag resolution may mis-detect router availability

instance?.appContext?.app?.component(routerName.value) checks the component registry, not plugins.
If the router plugin is present but RouterLink isn’t globally registered, this returns undefined even though routing works.
Consider checking router !== undefined (already retrieved earlier) for a more reliable detection.

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between dc85d94 and b0a75ab.

📒 Files selected for processing (12)
  • apps/docs/src/docs/migration-guide.md (0 hunks)
  • package.json (1 hunks)
  • packages/bootstrap-vue-next/CHANGELOG.md (1 hunks)
  • packages/bootstrap-vue-next/src/components/BAlert/BAlert.vue (1 hunks)
  • packages/bootstrap-vue-next/src/components/BFormTextarea/BFormTextarea.vue (1 hunks)
  • packages/bootstrap-vue-next/src/components/BLink/BLink.vue (1 hunks)
  • packages/bootstrap-vue-next/src/components/BToast/BToast.vue (1 hunks)
  • packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts (4 hunks)
  • packages/bootstrap-vue-next/src/composables/useCountdownHover.ts (2 hunks)
  • packages/bootstrap-vue-next/src/composables/useTextareaResize.ts (2 hunks)
  • packages/bootstrap-vue-next/src/composables/useTransitions.ts (1 hunks)
  • packages/nuxt/CHANGELOG.md (1 hunks)
💤 Files with no reviewable changes (1)
  • apps/docs/src/docs/migration-guide.md
🧰 Additional context used
🧬 Code Graph Analysis (2)
packages/bootstrap-vue-next/src/composables/useTextareaResize.ts (1)
packages/bootstrap-vue-next/src/types/CommonTypes.ts (1)
  • Numberish (3-3)
packages/bootstrap-vue-next/src/composables/useBLinkHelper.ts (1)
packages/bootstrap-vue-next/src/utils/stringUtils.ts (1)
  • toPascalCase (59-65)
🪛 markdownlint-cli2 (0.17.2)
packages/nuxt/CHANGELOG.md

19-19: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


23-23: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


33-33: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


37-37: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


47-47: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


51-51: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


61-61: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


65-65: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


75-75: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


79-79: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


89-89: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


93-93: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


107-107: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


117-117: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


121-121: Multiple headings with the same content
null

(MD024, no-duplicate-heading)

packages/bootstrap-vue-next/CHANGELOG.md

17-17: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


36-36: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


55-55: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


77-77: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


83-83: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


87-87: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


95-95: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


103-103: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


110-110: Multiple headings with the same content
null

(MD024, no-duplicate-heading)

⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: build
🔇 Additional comments (11)
package.json (1)

58-58:

Details

✅ Verification successful

Bump pnpm version for packageManager
Updating the packageManager field from [email protected] to [email protected] aligns your workspace with the latest pnpm features and bug fixes. Ensure your CI and local environments are updated accordingly, and regenerate the lockfile (pnpm-lock.yaml) if needed.

Please run the following script to verify that [email protected] is available on the npm registry:


🏁 Script executed:

#!/bin/bash
# Verify [email protected] exists on the npm registry
npm view pnpm versions --json | jq 'index("10.10.0")' >/dev/null \
  && echo "[email protected] is available" \
  || echo "[email protected] is not available"

Length of output: 116


Bump pnpm version for packageManager

[email protected] is confirmed available on the npm registry. Please ensure your CI and local environments are updated to use this version, and regenerate the lockfile (pnpm-lock.yaml) if needed.

packages/bootstrap-vue-next/CHANGELOG.md (4)

7-7: **Properly formatted issue reference with commit hash. **

The entry follows a consistent format with the issue number properly hyperlinked and the commit hash referenced in parentheses. This standard format makes it easy to track changes back to their origin in the codebase.


13-13: **Well-structured feature entry with issue reference. **

This entry adheres to the proper changelog format, with the component name in bold, followed by a clear description of the change, and proper links to both the issue and commit.


19-20: **Consistent bug fix entries with proper references. **

Both entries follow the project's established pattern for documenting bug fixes, with appropriate component prefixes and clear descriptions. The issue and commit references allow for easy traceability.


1-2076: **Overall well-maintained changelog with consistent formatting. **

The CHANGELOG.md file maintains a consistent format throughout, with:

  • Clear version headings with links to compare views
  • Organized sections for Features, Bug Fixes, Breaking Changes, etc.
  • Proper formatting of issue references and commit hashes
  • Component names in bold at the beginning of entries
  • Consistent spacing between sections

This makes the document highly readable and useful for tracking the project's evolution. The consistent structure helps users and developers quickly find information about specific changes.

🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

17-17: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


36-36: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


55-55: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


77-77: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


83-83: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


87-87: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


95-95: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


103-103: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


110-110: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


116-116: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


121-121: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


128-128: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


132-132: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


139-139: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


145-145: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


158-158: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


164-164: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


174-174: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


180-180: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


186-186: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


192-192: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


199-199: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


205-205: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


211-211: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


217-217: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


221-221: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


227-227: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


232-232: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


238-238: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


244-244: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


251-251: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


257-257: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


263-263: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


270-270: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


277-277: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


283-283: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


289-289: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


296-296: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


300-300: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


306-306: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


312-312: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


318-318: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


327-327: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


332-332: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


340-340: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


346-346: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


354-354: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


360-360: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


365-365: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


371-371: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


377-377: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


390-390: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


392-392: Spaces inside emphasis markers
null

(MD037, no-space-in-emphasis)


408-408: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


427-427: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


433-433: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


439-439: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


443-443: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


449-449: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


455-455: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


459-459: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


465-465: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


472-472: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


476-476: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


482-482: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


486-486: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


492-492: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


498-498: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


504-504: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


510-510: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


516-516: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


522-522: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


528-528: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


534-534: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


542-542: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


554-554: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


561-561: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


572-572: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


586-586: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


592-592: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


598-598: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


604-604: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


611-611: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


618-618: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


624-624: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


630-630: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


634-634: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


642-642: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


648-648: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


654-654: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


662-662: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


668-668: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


674-674: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


682-682: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


691-691: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


697-697: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


703-703: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


711-711: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


717-717: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


721-721: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


728-728: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


732-732: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


738-738: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


745-745: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


751-751: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


757-757: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


761-761: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


765-765: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


775-775: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


781-781: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


785-785: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


791-791: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


801-801: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


805-805: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


811-811: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


817-817: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


832-832: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


851-851: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


863-863: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


869-869: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


875-875: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


881-881: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


887-887: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


893-893: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


895-895: Bare URL used
null

(MD034, no-bare-urls)


896-896: Bare URL used
null

(MD034, no-bare-urls)


899-899: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


901-901: Bare URL used
null

(MD034, no-bare-urls)


905-905: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


911-911: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


915-915: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


920-920: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


927-927: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


933-933: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


939-939: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


943-943: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


948-948: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


954-954: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


959-959: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


964-964: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


974-974: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


986-986: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1011-1011: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1023-1023: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1029-1029: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1034-1034: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1047-1047: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1049-1049: Bare URL used
null

(MD034, no-bare-urls)


1053-1053: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1060-1060: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1066-1066: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1070-1070: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1076-1076: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1083-1083: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1090-1090: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1095-1095: Bare URL used
null

(MD034, no-bare-urls)


1103-1103: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1112-1112: Bare URL used
null

(MD034, no-bare-urls)


1127-1127: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1148-1148: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1156-1156: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1162-1162: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1166-1166: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1172-1172: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1176-1176: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1182-1182: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1186-1186: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1193-1193: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1199-1199: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1205-1205: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1210-1210: Bare URL used
null

(MD034, no-bare-urls)


1240-1240: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1284-1284: Bare URL used
null

(MD034, no-bare-urls)


1292-1292: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1304-1304: Bare URL used
null

(MD034, no-bare-urls)


1313-1313: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1320-1320: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1329-1329: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1337-1337: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1343-1343: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1349-1349: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1353-1353: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1357-1357: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1363-1363: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1371-1371: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1377-1377: Bare URL used
null

(MD034, no-bare-urls)


1387-1387: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1416-1416: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1421-1421: Bare URL used
null

(MD034, no-bare-urls)


1457-1457: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1463-1463: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1470-1470: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1477-1477: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1483-1483: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1489-1489: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1495-1495: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1501-1501: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1507-1507: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1513-1513: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1519-1519: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1525-1525: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1531-1531: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1538-1538: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1542-1542: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1550-1550: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1556-1556: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1562-1562: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1568-1568: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1574-1574: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1576-1576: Bare URL used
null

(MD034, no-bare-urls)


1578-1578: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1584-1584: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1588-1588: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1594-1594: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1600-1600: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1607-1607: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1611-1611: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1619-1619: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1632-1632: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1690-1690: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1755-1755: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1760-1760: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1766-1766: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1771-1771: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1776-1776: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1783-1783: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1789-1789: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1796-1796: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1802-1802: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1808-1808: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1818-1818: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1824-1824: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1830-1830: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1837-1837: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1843-1843: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1849-1849: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1855-1855: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1860-1860: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1865-1865: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1874-1874: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1882-1882: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1888-1888: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1892-1892: Bare URL used
null

(MD034, no-bare-urls)


1916-1916: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1920-1920: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1927-1927: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1933-1933: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1939-1939: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1943-1943: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1949-1949: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1955-1955: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1961-1961: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1965-1965: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1973-1973: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1979-1979: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1985-1985: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1991-1991: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


1997-1997: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


2003-2003: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


2008-2008: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


2019-2019: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


2025-2025: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


2031-2031: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


2037-2037: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


2043-2043: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


2048-2048: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


2055-2055: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


2061-2061: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


2065-2065: Multiple headings with the same content
null

(MD024, no-duplicate-heading)


2071-2071: Multiple headings with the same content
null

(MD024, no-duplicate-heading)

packages/nuxt/CHANGELOG.md (1)

7-7: Consistent list formatting applied
Switching the top‐level list marker from an asterisk to a hyphen improves consistency with the rest of the document.

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

3-16: Great optimization by using module-level constants

Moving NO_FADE_PROPS and FADE_PROPS outside the function scope ensures these transition property objects are defined once and reused across function calls rather than recreated each time.

The as const satisfies TransitionProps type assertions are also a good practice, providing compile-time type safety while allowing TypeScript to narrow the object types to their literal values.


18-19: Simplified composable implementation with direct constants

The refactored implementation now leverages the module-level constants and uses toValue to unwrap the reactive value, avoiding unnecessary recreations of the transition property objects.

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

73-79: Improved reactivity handling with getter functions

This change from passing a computed object to passing an object with individual getter functions is a good performance optimization. Each property is now accessed only when needed rather than creating derived reactive state for all properties at once.

This pattern makes the code more maintainable and avoids potential issues with stale computed values.

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

103-107: Enhanced reactivity with individual getter functions

Replacing a computed object with individual getter functions for each property is an excellent optimization. This aligns with the performance improvements seen across other components in this PR.

This approach enables fine-grained reactivity tracking, as each property is only evaluated when needed rather than recalculating the entire object when any dependency changes.

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

213-217: Optimized reactivity handling with property getters

Converting from a computed object to an object with property getter functions is a solid performance improvement. Each getter function now accesses props directly and includes additional logic that was previously part of the computed property.

This pattern enables more efficient reactivity tracking as each property is only evaluated when needed, rather than recalculating an entire object whenever any single dependency changes.

Comment on lines 6 to 18
{
modelValueIgnoresHover,
noHoverPause,
noResumeOnHoverLeave,
}: {
noHoverPause?: MaybeRefOrGetter<boolean>
noResumeOnHoverLeave?: MaybeRefOrGetter<boolean>
/**
* Countdown/hover rules don't apply to static model-values (boolean)
*/
modelValueIgnoresHover: boolean
}>,
modelValueIgnoresHover: MaybeRefOrGetter<boolean>
},
actions: {
Copy link
Contributor

@coderabbitai coderabbitai bot May 11, 2025

Choose a reason for hiding this comment

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

⚠️ Potential issue

Optional parameters lack safe fallbacks

noHoverPause and noResumeOnHoverLeave are typed as optional, yet later code calls toValue(...) without a default.
toValue(undefined) returns undefined, which is truthy-falsy ambiguous and could accidentally skip the pause / resume logic.

Add explicit fallbacks:

  }: {
-    noHoverPause?: MaybeRefOrGetter<boolean>
-    noResumeOnHoverLeave?: MaybeRefOrGetter<boolean>
+    noHoverPause?: MaybeRefOrGetter<boolean>
+    noResumeOnHoverLeave?: MaybeRefOrGetter<boolean>
   /**
    * Countdown/hover rules don't apply to static model-values (boolean)
    */
   modelValueIgnoresHover: MaybeRefOrGetter<boolean>
 }, 
@@
-    if (toValue(noHoverPause)) return
+    if (toValue(noHoverPause) ?? false) return
@@
-    if (toValue(noResumeOnHoverLeave)) return
+    if (toValue(noResumeOnHoverLeave) ?? false) return

This guarantees deterministic boolean checks.

Copy link
Member Author

Choose a reason for hiding this comment

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

The falsy is fine

Copy link
Contributor

Choose a reason for hiding this comment

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

@VividLemon Understood! You're right that the falsy behavior provides a sensible default where undefined allows the hover pause/resume functionality to work normally. Thanks for the clarification.

Comment on lines +85 to 86
const routerName = computed(() => toPascalCase(toValue(routerComponentName)))

Copy link
Contributor

@coderabbitai coderabbitai bot May 11, 2025

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Potential undefined routerComponentName

If the prop is omitted, toPascalCase(undefined) will blow up. Provide a fallback:

-  const routerName = computed(() => toPascalCase(toValue(routerComponentName)))
+  const routerName = computed(() =>
+    toPascalCase(toValue(routerComponentName) || 'RouterLink')
+  )

Prevents hard-to-trace runtime errors.

📝 Committable suggestion

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

Suggested change
const routerName = computed(() => toPascalCase(toValue(routerComponentName)))
const routerName = computed(() =>
toPascalCase(toValue(routerComponentName) || 'RouterLink')
)

Copy link
Member Author

Choose a reason for hiding this comment

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

routerComponentName is a required value in the input object and should not be undefined. MaybeRefOrGetter

Copy link
Contributor

Choose a reason for hiding this comment

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

@VividLemon You're absolutely right! I see that routerComponentName is typed as MaybeRefOrGetter<string> (not optional or undefined) and is a required parameter in the destructured object. My suggestion was unnecessary since the type system guarantees it will always have a string value. Thanks for the clarification!

🐰
✨ Learning updated!
📚 Got it!


✏️ Learnings added
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.877Z
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.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

Comment on lines +82 to +83
const resolvedTo = computed(() => toValue(to) || '')
const resolvedReplace = readonly(toRef(replace))
Copy link
Contributor

@coderabbitai coderabbitai bot May 11, 2025

Choose a reason for hiding this comment

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

⚠️ Potential issue

toRef used on a non-object – causes runtime / TS errors

toRef(replace) expects either a reactive object/key pair or an existing ref.
Here replace can be a raw boolean or a getter function, so Vue will throw.

-  const resolvedReplace = readonly(toRef(replace))
+  const resolvedReplace = computed(() => toValue(replace))

This keeps the value reactive without mis-using toRef.

📝 Committable suggestion

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

Suggested change
const resolvedTo = computed(() => toValue(to) || '')
const resolvedReplace = readonly(toRef(replace))
const resolvedTo = computed(() => toValue(to) || '')
const resolvedReplace = computed(() => toValue(replace))

Copy link
Member Author

Choose a reason for hiding this comment

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

No, toRef will take an input and make it a ref. If it is already a ref, it will use the existing ref. toRef(undefined) will make a ref(undefined). Using a computed here instead incurs the performance overhead of computeds caching, which is unnecessary when doing a property access

Copy link
Contributor

Choose a reason for hiding this comment

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

@VividLemon Thank you for the correction! You're absolutely right about Vue 3.3+ toRef behavior. I appreciate you clarifying that toRef can indeed handle MaybeRefOrGetter types directly and will properly create a ref from any input, and that using computed here would add unnecessary caching overhead for simple property access.

I was incorrectly applying older Vue patterns where this might have been problematic. The getter-based toRef() introduced in Vue 3.3 handles this elegantly.

🐰 ✨ (thoughtful rabbit taking notes)


✏️ Learnings added
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.241Z
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.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.


🧠 Learnings 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 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: 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.

@VividLemon VividLemon merged commit 34d2a8f into bootstrap-vue-next:main May 26, 2025
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant