diff --git a/README.md b/README.md
index 69727eff..96d149a2 100644
--- a/README.md
+++ b/README.md
@@ -46,7 +46,7 @@
Several quick start options are available:
-- [Download the latest release](https://github.com/coreui/coreui-react/archive/v5.6.0.zip)
+- [Download the latest release](https://github.com/coreui/coreui-react/archive/v5.7.1.zip)
- Clone the repo: `git clone https://github.com/coreui/coreui-react.git`
- Install with [npm](https://www.npmjs.com/): `npm install @coreui/react`
- Install with [yarn](https://yarnpkg.com/): `yarn add @coreui/react`
diff --git a/lerna.json b/lerna.json
index a4d781c9..d86538ff 100644
--- a/lerna.json
+++ b/lerna.json
@@ -1,6 +1,6 @@
{
"npmClient": "yarn",
"packages": ["packages/*"],
- "version": "5.6.0",
+ "version": "5.7.1",
"$schema": "node_modules/lerna/schemas/lerna-schema.json"
}
diff --git a/package.json b/package.json
index 46a8d37c..b7e32b5f 100644
--- a/package.json
+++ b/package.json
@@ -22,18 +22,18 @@
"test:update": "npm-run-all charts:test:update icons:test:update lib:test:update"
},
"devDependencies": {
- "@typescript-eslint/parser": "^8.31.1",
- "eslint": "^9.25.1",
- "eslint-config-prettier": "^10.1.2",
- "eslint-plugin-prettier": "^5.2.6",
+ "@typescript-eslint/parser": "^8.36.0",
+ "eslint": "^9.31.0",
+ "eslint-config-prettier": "^10.1.5",
+ "eslint-plugin-prettier": "^5.5.1",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-hooks": "^5.2.0",
- "eslint-plugin-unicorn": "^59.0.0",
- "globals": "^16.0.0",
- "lerna": "^8.2.2",
+ "eslint-plugin-unicorn": "^59.0.1",
+ "globals": "^16.3.0",
+ "lerna": "^8.2.3",
"npm-run-all": "^4.1.5",
- "prettier": "^3.5.3",
- "typescript-eslint": "^8.31.1"
+ "prettier": "^3.6.2",
+ "typescript-eslint": "^8.36.0"
},
"overrides": {
"gatsby-remark-external-links": {
diff --git a/packages/coreui-react/README.md b/packages/coreui-react/README.md
index 83407ad9..190eafc0 100644
--- a/packages/coreui-react/README.md
+++ b/packages/coreui-react/README.md
@@ -46,7 +46,7 @@
Several quick start options are available:
-- [Download the latest release](https://github.com/coreui/coreui-react/archive/v5.6.0.zip)
+- [Download the latest release](https://github.com/coreui/coreui-react/archive/v5.7.1.zip)
- Clone the repo: `git clone https://github.com/coreui/coreui-react.git`
- Install with [npm](https://www.npmjs.com/): `npm install @coreui/react`
- Install with [yarn](https://yarnpkg.com/): `yarn add @coreui/react`
diff --git a/packages/coreui-react/package.json b/packages/coreui-react/package.json
index 7ab67b3c..4e62fee7 100644
--- a/packages/coreui-react/package.json
+++ b/packages/coreui-react/package.json
@@ -1,6 +1,6 @@
{
"name": "@coreui/react",
- "version": "5.6.0",
+ "version": "5.7.1",
"description": "UI Components Library for React.js",
"keywords": [
"react",
@@ -41,21 +41,21 @@
"test:update": "jest --coverage --updateSnapshot"
},
"dependencies": {
- "@coreui/coreui": "^5.3.2",
+ "@coreui/coreui": "^5.4.1",
"@popperjs/core": "^2.11.8",
"prop-types": "^15.8.1"
},
"devDependencies": {
- "@rollup/plugin-commonjs": "^28.0.3",
+ "@rollup/plugin-commonjs": "^28.0.6",
"@rollup/plugin-node-resolve": "^16.0.1",
- "@rollup/plugin-typescript": "^12.1.2",
+ "@rollup/plugin-typescript": "^12.1.4",
"@testing-library/dom": "^10.4.0",
"@testing-library/jest-dom": "^6.6.3",
"@testing-library/react": "^16.3.0",
"@types/jest": "^29.5.14",
- "@types/prop-types": "15.7.14",
- "@types/react": "^19.1.2",
- "@types/react-dom": "^19.1.2",
+ "@types/prop-types": "15.7.15",
+ "@types/react": "^19.1.8",
+ "@types/react-dom": "^19.1.6",
"@types/react-transition-group": "^4.4.12",
"classnames": "^2.5.1",
"cross-env": "^7.0.3",
@@ -64,8 +64,8 @@
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-transition-group": "^4.4.5",
- "rollup": "^4.40.1",
- "ts-jest": "^29.3.2",
+ "rollup": "^4.45.0",
+ "ts-jest": "^29.4.0",
"tslib": "^2.8.1",
"typescript": "^5.8.3"
},
diff --git a/packages/coreui-react/src/components/button/CButton.tsx b/packages/coreui-react/src/components/button/CButton.tsx
index f8f5e17a..cbb003d7 100644
--- a/packages/coreui-react/src/components/button/CButton.tsx
+++ b/packages/coreui-react/src/components/button/CButton.tsx
@@ -66,7 +66,7 @@ export const CButton: PolymorphicRefForwardingComponent<'button', CButtonProps>
>(
(
{ children, as = 'button', className, color, shape, size, type = 'button', variant, ...rest },
- ref,
+ ref
) => {
return (
className={classNames(
'btn',
{
- [`btn-${color}`]: color && !variant,
- [`btn-${variant}-${color}`]: color && variant,
+ [`btn-${variant}-${color}`]: variant && color,
+ [`btn-${variant}`]: variant && !color,
+ [`btn-${color}`]: !variant && color,
[`btn-${size}`]: size,
},
shape,
- className,
+ className
)}
{...rest}
ref={ref}
@@ -88,7 +89,7 @@ export const CButton: PolymorphicRefForwardingComponent<'button', CButtonProps>
{children}
)
- },
+ }
)
CButton.propTypes = {
diff --git a/packages/coreui-react/src/components/dropdown/CDropdown.tsx b/packages/coreui-react/src/components/dropdown/CDropdown.tsx
index 5b5e35d4..2d8a7bbd 100644
--- a/packages/coreui-react/src/components/dropdown/CDropdown.tsx
+++ b/packages/coreui-react/src/components/dropdown/CDropdown.tsx
@@ -1,4 +1,13 @@
-import React, { ElementType, forwardRef, HTMLAttributes, useEffect, useRef, useState } from 'react'
+import React, {
+ ElementType,
+ forwardRef,
+ HTMLAttributes,
+ useCallback,
+ useEffect,
+ useMemo,
+ useRef,
+ useState,
+} from 'react'
import PropTypes from 'prop-types'
import classNames from 'classnames'
import type { Options } from '@popperjs/core'
@@ -190,59 +199,64 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
ref
) => {
const dropdownRef = useRef(null)
- const dropdownToggleRef = useRef(null)
const dropdownMenuRef = useRef(null)
const forkedRef = useForkedRef(ref, dropdownRef)
+ const [dropdownToggleElement, setDropdownToggleElement] = useState(null)
const [_visible, setVisible] = useState(visible)
const { initPopper, destroyPopper } = usePopper()
- const Component = variant === 'nav-item' ? 'li' : as
-
- // Disable popper if responsive aligment is set.
- if (typeof alignment === 'object') {
- popper = false
- }
+ const dropdownToggleRef = useCallback((node: HTMLElement | null) => {
+ if (node) {
+ setDropdownToggleElement(node)
+ }
+ }, [])
- const contextValues = {
- alignment,
- container,
- dark,
- dropdownToggleRef,
- dropdownMenuRef,
- popper,
- portal,
- variant,
- visible: _visible,
- setVisible,
- }
+ const allowPopperUse = popper && typeof alignment !== 'object'
+ const Component = variant === 'nav-item' ? 'li' : as
- const defaultPopperConfig = {
- modifiers: [
- {
- name: 'offset',
- options: {
- offset: offset,
+ const computedPopperConfig: Partial = useMemo(() => {
+ const defaultPopperConfig = {
+ modifiers: [
+ {
+ name: 'offset',
+ options: {
+ offset,
+ },
},
- },
- ],
- placement: getPlacement(placement, direction, alignment, isRTL(dropdownMenuRef.current)),
- }
+ ],
+ placement: getPlacement(placement, direction, alignment, isRTL(dropdownMenuRef.current)),
+ }
- const computedPopperConfig: Partial = {
- ...defaultPopperConfig,
- ...(typeof popperConfig === 'function' ? popperConfig(defaultPopperConfig) : popperConfig),
- }
+ return {
+ ...defaultPopperConfig,
+ ...(typeof popperConfig === 'function' ? popperConfig(defaultPopperConfig) : popperConfig),
+ }
+ }, [offset, placement, direction, alignment, popperConfig])
useEffect(() => {
- setVisible(visible)
+ if (visible) {
+ handleShow()
+ } else {
+ handleHide()
+ }
}, [visible])
useEffect(() => {
- const toggleElement = dropdownToggleRef.current
+ const toggleElement = dropdownToggleElement
+ const menuElement = dropdownMenuRef.current
+ if (allowPopperUse && menuElement && toggleElement && _visible) {
+ initPopper(toggleElement, menuElement, computedPopperConfig)
+ }
+ }, [dropdownToggleElement])
+
+ const handleShow = () => {
+ const toggleElement = dropdownToggleElement
const menuElement = dropdownMenuRef.current
- if (_visible && toggleElement && menuElement) {
- if (popper) {
+ if (toggleElement && menuElement) {
+ setVisible(true)
+
+ if (allowPopperUse) {
initPopper(toggleElement, menuElement, computedPopperConfig)
}
@@ -255,28 +269,26 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
onShow?.()
}
+ }
- return () => {
- if (popper) {
- destroyPopper()
- }
-
- toggleElement?.removeEventListener('keydown', handleKeydown)
- menuElement?.removeEventListener('keydown', handleKeydown)
+ const handleHide = () => {
+ setVisible(false)
- window.removeEventListener('mouseup', handleMouseUp)
- window.removeEventListener('keyup', handleKeyup)
+ const toggleElement = dropdownToggleElement
+ const menuElement = dropdownMenuRef.current
- onHide?.()
+ if (allowPopperUse) {
+ destroyPopper()
}
- }, [
- computedPopperConfig,
- destroyPopper,
- dropdownMenuRef,
- dropdownToggleRef,
- initPopper,
- _visible,
- ])
+
+ toggleElement?.removeEventListener('keydown', handleKeydown)
+ menuElement?.removeEventListener('keydown', handleKeydown)
+
+ window.removeEventListener('mouseup', handleMouseUp)
+ window.removeEventListener('keyup', handleKeyup)
+
+ onHide?.()
+ }
const handleKeydown = (event: KeyboardEvent) => {
if (
@@ -299,16 +311,16 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
}
if (event.key === 'Escape') {
- setVisible(false)
+ handleHide()
}
}
const handleMouseUp = (event: Event) => {
- if (!dropdownToggleRef.current || !dropdownMenuRef.current) {
+ if (!dropdownToggleElement || !dropdownMenuRef.current) {
return
}
- if (dropdownToggleRef.current.contains(event.target as HTMLElement)) {
+ if (dropdownToggleElement.contains(event.target as HTMLElement)) {
return
}
@@ -317,11 +329,25 @@ export const CDropdown: PolymorphicRefForwardingComponent<'div', CDropdownProps>
(autoClose === 'inside' && dropdownMenuRef.current.contains(event.target as HTMLElement)) ||
(autoClose === 'outside' && !dropdownMenuRef.current.contains(event.target as HTMLElement))
) {
- setTimeout(() => setVisible(false), 1)
+ setTimeout(() => handleHide(), 1)
return
}
}
+ const contextValues = {
+ alignment,
+ container,
+ dark,
+ dropdownMenuRef,
+ dropdownToggleRef,
+ handleHide,
+ handleShow,
+ popper: allowPopperUse,
+ portal,
+ variant,
+ visible: _visible,
+ }
+
return (
{variant === 'input-group' ? (
diff --git a/packages/coreui-react/src/components/dropdown/CDropdownContext.ts b/packages/coreui-react/src/components/dropdown/CDropdownContext.ts
index 81af43aa..d46b69d2 100644
--- a/packages/coreui-react/src/components/dropdown/CDropdownContext.ts
+++ b/packages/coreui-react/src/components/dropdown/CDropdownContext.ts
@@ -5,10 +5,10 @@ export interface CDropdownContextProps {
alignment?: Alignments
container?: DocumentFragment | Element | (() => DocumentFragment | Element | null) | null
dark?: boolean
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
- dropdownToggleRef: RefObject
dropdownMenuRef: RefObject
- setVisible: React.Dispatch>
+ dropdownToggleRef: (node: HTMLElement | null) => void
+ handleHide?: () => void
+ handleShow?: () => void
popper?: boolean
portal?: boolean
variant?: 'btn-group' | 'dropdown' | 'input-group' | 'nav-item'
diff --git a/packages/coreui-react/src/components/dropdown/CDropdownToggle.tsx b/packages/coreui-react/src/components/dropdown/CDropdownToggle.tsx
index ee8dfe82..def263e5 100644
--- a/packages/coreui-react/src/components/dropdown/CDropdownToggle.tsx
+++ b/packages/coreui-react/src/components/dropdown/CDropdownToggle.tsx
@@ -45,18 +45,24 @@ export const CDropdownToggle: FC = ({
trigger = 'click',
...rest
}) => {
- const { dropdownToggleRef, variant, visible, setVisible } = useContext(CDropdownContext)
+ const { dropdownToggleRef, handleHide, handleShow, variant, visible } =
+ useContext(CDropdownContext)
const triggers = {
...((trigger === 'click' || trigger.includes('click')) && {
onClick: (event: React.MouseEvent) => {
event.preventDefault()
- setVisible(!visible)
+
+ if (visible) {
+ handleHide?.()
+ } else {
+ handleShow?.()
+ }
},
}),
...((trigger === 'focus' || trigger.includes('focus')) && {
- onFocus: () => setVisible(true),
- onBlur: () => setVisible(false),
+ onFocus: () => handleShow?.(),
+ onBlur: () => handleHide?.(),
}),
}
@@ -74,36 +80,32 @@ export const CDropdownToggle: FC = ({
...(!rest.disabled && { ...triggers }),
}
- const Toggler = () => {
- if (custom && React.isValidElement(children)) {
- return (
- <>
- {React.cloneElement(children as React.ReactElement, {
- 'aria-expanded': visible,
- ...(!rest.disabled && { ...triggers }),
- ref: dropdownToggleRef,
- })}
- >
- )
- }
-
- if (variant === 'nav-item' && navLink) {
- return (
-
- {children}
-
- )
- }
+ if (custom && React.isValidElement(children)) {
+ return (
+ <>
+ {React.cloneElement(children as React.ReactElement, {
+ 'aria-expanded': visible,
+ ...(!rest.disabled && { ...triggers }),
+ ref: dropdownToggleRef,
+ })}
+ >
+ )
+ }
+ if (variant === 'nav-item' && navLink) {
return (
-
+
{children}
- {split && Toggle Dropdown}
-
+
)
}
- return
+ return (
+
+ {children}
+ {split && Toggle Dropdown}
+
+ )
}
CDropdownToggle.propTypes = {
diff --git a/packages/coreui-react/src/components/nav/CNav.tsx b/packages/coreui-react/src/components/nav/CNav.tsx
index 233994af..f056fbf7 100644
--- a/packages/coreui-react/src/components/nav/CNav.tsx
+++ b/packages/coreui-react/src/components/nav/CNav.tsx
@@ -21,7 +21,7 @@ export interface CNavProps
/**
* Set the nav variant to tabs or pills.
*/
- variant?: 'pills' | 'tabs' | 'underline' | 'underline-border'
+ variant?: 'enclosed' | 'enclosed-pills' | 'pills' | 'tabs' | 'underline' | 'underline-border'
}
export const CNav: PolymorphicRefForwardingComponent<'ul', CNavProps> = forwardRef<
@@ -32,11 +32,12 @@ export const CNav: PolymorphicRefForwardingComponent<'ul', CNavProps> = forwardR
{
/**
* Set the nav variant to tabs or pills.
*/
- variant?: 'pills' | 'tabs' | 'underline' | 'underline-border'
+ variant?: 'enclosed' | 'enclosed-pills' | 'pills' | 'tabs' | 'underline' | 'underline-border'
}
export const CTabList = forwardRef(
@@ -39,7 +39,7 @@ export const CTabList = forwardRef(
const target = event.target as HTMLElement
// eslint-disable-next-line unicorn/prefer-spread
const items: HTMLElement[] = Array.from(
- tabListRef.current.querySelectorAll('.nav-link:not(.disabled):not(:disabled)'),
+ tabListRef.current.querySelectorAll('.nav-link:not(.disabled):not(:disabled)')
)
let nextActiveElement
@@ -51,7 +51,7 @@ export const CTabList = forwardRef(
items,
target,
event.key === 'ArrowDown' || event.key === 'ArrowRight',
- true,
+ true
)
}
@@ -65,11 +65,12 @@ export const CTabList = forwardRef(
(
{children}
)
- },
+ }
)
CTabList.propTypes = {
children: PropTypes.node,
className: PropTypes.string,
layout: PropTypes.oneOf(['fill', 'justified']),
- variant: PropTypes.oneOf(['pills', 'tabs', 'underline', 'underline-border']),
+ variant: PropTypes.oneOf([
+ 'enclosed',
+ 'enclosed-pills',
+ 'pills',
+ 'tabs',
+ 'underline',
+ 'underline-border',
+ ]),
}
CTabList.displayName = 'CTabList'
diff --git a/packages/docs/content/components/button/examples/ButtonGhostBaseClassExample.tsx b/packages/docs/content/components/button/examples/ButtonGhostBaseClassExample.tsx
new file mode 100644
index 00000000..d99be5d5
--- /dev/null
+++ b/packages/docs/content/components/button/examples/ButtonGhostBaseClassExample.tsx
@@ -0,0 +1,12 @@
+import React from 'react'
+import { CButton } from '@coreui/react'
+
+export const ButtonGhostBaseClassExample = () => {
+ return (
+ <>
+ Base ghost button
+ Active state
+ Disabled state
+ >
+ )
+}
diff --git a/packages/docs/content/components/button/examples/ButtonOutlineBaseClassExample.tsx b/packages/docs/content/components/button/examples/ButtonOutlineBaseClassExample.tsx
new file mode 100644
index 00000000..2c5de0e3
--- /dev/null
+++ b/packages/docs/content/components/button/examples/ButtonOutlineBaseClassExample.tsx
@@ -0,0 +1,12 @@
+import React from 'react'
+import { CButton } from '@coreui/react'
+
+export const ButtonOutlineBaseClassExample = () => {
+ return (
+ <>
+ Base outline button
+ Active state
+ Disabled state
+ >
+ )
+}
diff --git a/packages/docs/content/components/button/index.mdx b/packages/docs/content/components/button/index.mdx
index 4d615ebb..87cb6205 100644
--- a/packages/docs/content/components/button/index.mdx
+++ b/packages/docs/content/components/button/index.mdx
@@ -28,21 +28,41 @@ If you're using `` component as `` elements that are used to trigger
## Outline buttons
-If you need a button, but without the strong background colors. Set `variant="outline"` prop to remove all background colors.
+### Base outline style
-
+The `variant="outline` property provides a neutral outline button style without any color modifiers. It’s useful as a foundation for minimal buttons without background color or strong visual emphasis.
-## Ghost buttons
+
-If you need a ghost variant of react button, set `variant="ghost"` prop to remove all background colors.
+These React buttons use a transparent background, subtle border, and inherit text color from the parent context. They’re best suited for minimalist UI elements like modals, toolbars, or secondary actions.
-
+### Themed outline variants
+
+If you need a button, but without the strong background colors, set `color` and `variant=" outline"` props to remove all background colors.
+
+
+
+These outline variants of our React.js buttons retain transparent backgrounds by default, but display a background tint on hover or focus to indicate interactivity. They’re ideal for secondary actions when you want to differentiate from the standard buttons visually.
Some of the button styles use a relatively light foreground color, and should only be used on a
dark background in order to have sufficient contrast.
+## Ghost buttons
+
+### Base ghost style
+
+Use the `variant="ghost"` property to create ultra-minimalist buttons with no borders and a fully transparent background. These React buttons rely solely on text color for visibility and apply a background highlight when hovered over or in an active state.
+
+They’re perfect for interfaces where you want buttons to be present but visually unobtrusive—such as action buttons in modals, cards, or toolbars.
+
+
+
+To apply theme colors to React ghost buttons, use the `color` and `variant="ghost"` properties. By default, these variants color only the text. On hover or focus, they add a background that corresponds to the theme color.
+
+
+
## Sizes
Larger or smaller react buttons? Add `size="lg"` or `size="sm"` for additional sizes.
diff --git a/packages/docs/content/components/navs-tabs/examples/NavEnclosedExample.tsx b/packages/docs/content/components/navs-tabs/examples/NavEnclosedExample.tsx
new file mode 100644
index 00000000..33cbf837
--- /dev/null
+++ b/packages/docs/content/components/navs-tabs/examples/NavEnclosedExample.tsx
@@ -0,0 +1,21 @@
+import React from 'react'
+import { CNav, CNavItem, CNavLink } from '@coreui/react'
+
+export const NavEnclosedExample = () => {
+ return (
+
+
+ Active
+
+
+ Link
+
+
+ Link
+
+
+ Disabled
+
+
+ )
+}
diff --git a/packages/docs/content/components/navs-tabs/examples/NavEnclosedPillsExample.tsx b/packages/docs/content/components/navs-tabs/examples/NavEnclosedPillsExample.tsx
new file mode 100644
index 00000000..e49457f8
--- /dev/null
+++ b/packages/docs/content/components/navs-tabs/examples/NavEnclosedPillsExample.tsx
@@ -0,0 +1,21 @@
+import React from 'react'
+import { CNav, CNavItem, CNavLink } from '@coreui/react'
+
+export const NavEnclosedPillsExample = () => {
+ return (
+
+
+ Active
+
+
+ Link
+
+
+ Link
+
+
+ Disabled
+
+
+ )
+}
diff --git a/packages/docs/content/components/navs-tabs/index.mdx b/packages/docs/content/components/navs-tabs/index.mdx
index 5b07eb17..439f05eb 100644
--- a/packages/docs/content/components/navs-tabs/index.mdx
+++ b/packages/docs/content/components/navs-tabs/index.mdx
@@ -64,6 +64,19 @@ Take that same code, but use `variant="underline-border"` instead:
+### Enclosed
+
+Use the `variant="enclosed"` class to give your navigation items a subtle border and rounded styling.
+
+
+
+### Enclosed pills
+
+Use the `variant="enclosed-pills"` to achieve a pill-style appearance for each nav item, using pill-shaped borders and smoother outlines.
+
+
+
+
### Fill and justify
Force your ``'s contents to extend the full available width one of two modifier classes. To proportionately fill all available space with your `.nav-item`s, use `layout="fill"`. Notice that all horizontal space is occupied, but not every nav item has the same width.
diff --git a/packages/docs/content/components/tabs/examples/TabsEnclosedExample.tsx b/packages/docs/content/components/tabs/examples/TabsEnclosedExample.tsx
new file mode 100644
index 00000000..0c7b4a18
--- /dev/null
+++ b/packages/docs/content/components/tabs/examples/TabsEnclosedExample.tsx
@@ -0,0 +1,31 @@
+import React from 'react'
+import { CTab, CTabContent, CTabList, CTabPanel, CTabs } from '@coreui/react'
+
+export const TabsEnclosedExample = () => {
+ return (
+
+
+ Home
+ Profile
+ Contact
+
+ Disabled
+
+
+
+
+ Home tab content
+
+
+ Profile tab content
+
+
+ Contact tab content
+
+
+ Disabled tab content
+
+
+
+ )
+}
diff --git a/packages/docs/content/components/tabs/examples/TabsEnclosedPillsExample.tsx b/packages/docs/content/components/tabs/examples/TabsEnclosedPillsExample.tsx
new file mode 100644
index 00000000..8fc0d82b
--- /dev/null
+++ b/packages/docs/content/components/tabs/examples/TabsEnclosedPillsExample.tsx
@@ -0,0 +1,31 @@
+import React from 'react'
+import { CTab, CTabContent, CTabList, CTabPanel, CTabs } from '@coreui/react'
+
+export const TabsEnclosedPillsExample = () => {
+ return (
+
+
+ Home
+ Profile
+ Contact
+
+ Disabled
+
+
+
+
+ Home tab content
+
+
+ Profile tab content
+
+
+ Contact tab content
+
+
+ Disabled tab content
+
+
+
+ )
+}
diff --git a/packages/docs/content/components/tabs/index.mdx b/packages/docs/content/components/tabs/index.mdx
index 00e61733..c493eb5d 100644
--- a/packages/docs/content/components/tabs/index.mdx
+++ b/packages/docs/content/components/tabs/index.mdx
@@ -10,7 +10,7 @@ since: 5.1.0
The basic React tabs example uses the `variant="tabs"` props to generate a tabbed interface.
-
+
## Available styles
@@ -20,35 +20,47 @@ Change the style of ``'s component with modifiers and utilities. Mix and
If you don’t provide the `variant` prop, the component will default to a basic style.
-
+
### Pills
Take that same code, but use `variant="pills"` instead:
-
+
### Underline
Take that same code, but use `variant="underline"` instead:
-
+
### Underline border
Take that same code, but use `variant="underline-border"` instead:
-
+
+
+### Enclosed
+
+Use the `variant="enclosed"` class to give your navigation items a subtle border and rounded styling.
+
+
+
+### Enclosed pills
+
+Use the `variant="enclosed-pills"` to achieve a pill-style appearance for each nav item, using pill-shaped borders and smoother outlines.
+
+
### Fill and justify
Force your ``'s contents to extend the full available width one of two modifier classes. To proportionately fill all available space use `layout="fill"`. Notice that all horizontal space is occupied, but not every nav item has the same width.
-
+
For equal-width elements, use `layout="justified"`. All horizontal space will be occupied by nav links, but unlike the `layout="fill"` above, every nav item will be the same width.
-
+
Sure! Here's a polished, production-ready **documentation section** (Markdown-style) explaining the **controlled usage** of the `` component, with a clear example:
@@ -68,7 +80,7 @@ This is useful when you need to synchronize the tab state with your application
> 💡 If you prefer the tabs to manage their own state, use `defaultActiveItemKey` instead.
-
+
## Accessibility
diff --git a/packages/docs/content/forms/checkbox/bootstrap.mdx b/packages/docs/content/forms/checkbox/bootstrap.mdx
index 185c6753..842bb911 100644
--- a/packages/docs/content/forms/checkbox/bootstrap.mdx
+++ b/packages/docs/content/forms/checkbox/bootstrap.mdx
@@ -1,69 +1,71 @@
---
-title: React Checkbox Components
-name: Checkbox
-description: Create consistent cross-browser and cross-device checkboxes with our React checkbox components.
+title: React Bootstrap Checkbox Component
+name: Checkbox with Bootstrap Styling
+description: Learn how to build accessible and consistent Bootstrap-style checkboxes in React using CoreUI components.
route: /forms/checkbox/
-other_frameworks: checkbox
+bootstrap_component: true
---
-## Approach
+## How to use React Bootstrap Checkbox component
-Browser default checkboxes and radios are replaced with the help of ``. Checkboxes are for selecting one or several options in a list.
+Use CoreUI’s `` to create cross-browser, accessible, and Bootstrap-styled checkboxes in React. Checkboxes are ideal for selecting one or more options from a list and can be styled, stacked, or grouped using layout utilities.
-## Checkboxes
+### Basic example
-
+Use the `` component to render a standard Bootstrap-style checkbox.
-### Indeterminate
+
-Checkboxes can utilize the `:indeterminate` pseudo-class when manually set via `indeterminate` property.
+### Indeterminate state
-
+Set the `indeterminate` property to render a checkbox in an indeterminate state, commonly used to indicate partial selections.
-### Disabled
+
-Add the `disabled` attribute and the associated `