diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ae17fd6..2aebbfa4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## 1.1.1 under development +- Enh #306: Raise `yiisoft/html` version to `^3.13 || ^4.0` (@vjik) - Enh #305: Add `tabIndex()` method to `Button` widget (@Mister-42) ## 1.1.0 March 06, 2026 diff --git a/composer.json b/composer.json index b57f4dfc..83ba2570 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ }, "require": { "php": "8.1 - 8.5", - "yiisoft/html": "^3.0", + "yiisoft/html": "^3.13 || ^4.0", "yiisoft/widget": "^2.0" }, "require-dev": { diff --git a/src/Accordion.php b/src/Accordion.php index 5578adbd..594e0304 100644 --- a/src/Accordion.php +++ b/src/Accordion.php @@ -520,7 +520,7 @@ public function render(): string $id = $this->getId(); - return Div::tag() + return (new Div()) ->addAttributes($attributes) ->addClass(self::NAME, $classes, ...$this->cssClasses) ->addContent("\n", $this->renderItems($id), "\n") @@ -569,14 +569,14 @@ private function renderBody(AccordionItem $accordionItem, string $parentId, stri unset($bodyAttributes['class'], $collapseAttributes['class']); - return Div::tag() + return (new Div()) ->attribute('data-bs-parent', $this->alwaysOpen ? null : '#' . $parentId) ->addAttributes($collapseAttributes) ->addClass(self::CLASS_COLLAPSE, $accordionItem->isActive() ? 'show' : null, $classesCollapseAttributes) ->id($collapseId) ->addContent( "\n", - Div::tag() + (new Div()) ->addAttributes($bodyAttributes) ->addClass(self::CLASS_BODY, $classesBodyAttributes) ->addContent("\n", $accordionItem->getBody(), "\n") @@ -658,7 +658,7 @@ private function renderItem(AccordionItem $accordionItem, string $parentId): str /** @psalm-var non-empty-string $collapseId */ $collapseId = $accordionItem->getId(); - return Div::tag()->addClass(self::CLASS_ITEM) + return (new Div())->addClass(self::CLASS_ITEM) ->addContent( "\n", $this->renderHeader($accordionItem, $collapseId), diff --git a/src/Alert.php b/src/Alert.php index a926895a..388279af 100644 --- a/src/Alert.php +++ b/src/Alert.php @@ -567,7 +567,7 @@ public function render(): string $content = preg_replace("/\n{2}/", "\n", $content) ?? ''; - return Div::tag()->addAttributes($attributes)->content($content)->encode(false)->id($this->getId())->render(); + return (new Div())->addAttributes($attributes)->content($content)->encode(false)->id($this->getId())->render(); } /** diff --git a/src/Breadcrumbs.php b/src/Breadcrumbs.php index db20b6e8..d4085b6a 100644 --- a/src/Breadcrumbs.php +++ b/src/Breadcrumbs.php @@ -407,7 +407,7 @@ public function render(): string } - return Nav::tag() + return (new Nav()) ->addAttributes($attributes) ->addClass(...$this->cssClasses) ->content("\n", $this->renderList(), "\n") @@ -493,7 +493,7 @@ private function renderItem(BreadcrumbLink $breadcrumbLink): string $itemsAttributes['aria-current'] = 'page'; } - return Li::tag() + return (new Li()) ->addAttributes($itemsAttributes) ->addClass( self::ITEM_NAME, @@ -519,7 +519,7 @@ private function renderLink(BreadcrumbLink $breadcrumbLink): string return match ($url) { null => $label, - default => A::tag() + default => (new A()) ->attributes($this->linkAttributes) ->addAttributes($breadcrumbLink->getAttributes()) ->content($label) diff --git a/src/Button.php b/src/Button.php index bc8c3ffe..29c774fe 100644 --- a/src/Button.php +++ b/src/Button.php @@ -528,7 +528,7 @@ public function type(ButtonType $type): self { $new = clone $this; $new->tag = match ($type) { - ButtonType::LINK => A::tag(), + ButtonType::LINK => (new A()), ButtonType::RESET => ButtonTag::reset(''), ButtonType::RESET_INPUT => Input::resetButton(), ButtonType::SUBMIT => ButtonTag::submit(''), @@ -584,7 +584,7 @@ public function render(): string { $attributes = $this->attributes; $classes = $attributes['class'] ?? null; - $tag = $this->tag ?? ButtonTag::tag()->button(''); + $tag = $this->tag ?? (new ButtonTag())->button(''); unset($attributes['class'], $attributes['id']); diff --git a/src/ButtonGroup.php b/src/ButtonGroup.php index 94e353a7..ef5f8a41 100644 --- a/src/ButtonGroup.php +++ b/src/ButtonGroup.php @@ -299,7 +299,7 @@ public function render(): string return ''; } - return Div::tag() + return (new Div()) ->attributes($attributes) ->attribute('role', 'group') ->addClass( diff --git a/src/ButtonToolbar.php b/src/ButtonToolbar.php index 6fe472e2..42c72ed9 100644 --- a/src/ButtonToolbar.php +++ b/src/ButtonToolbar.php @@ -274,7 +274,7 @@ public function render(): string return ''; } - return Div::tag() + return (new Div()) ->attributes($attributes) ->attribute('role', 'toolbar') ->addClass( diff --git a/src/Carousel.php b/src/Carousel.php index 0608616e..63d7bf32 100644 --- a/src/Carousel.php +++ b/src/Carousel.php @@ -26,9 +26,9 @@ * = Carousel::widget() * ->id('carouselExample') * ->items( - * CarouselItem::to(Img::tag()->alt('First slide')->src('image-1.jpg'), active: true), - * CarouselItem::to(Img::tag()->alt('Second slide')->src('image-2.jpg')), - * CarouselItem::to(Img::tag()->alt('Third slide')->src('image-3.jpg')), + * CarouselItem::to((new Img())->alt('First slide')->src('image-1.jpg'), active: true), + * CarouselItem::to((new Img())->alt('Second slide')->src('image-2.jpg')), + * CarouselItem::to((new Img())->alt('Third slide')->src('image-3.jpg')), * ) * ?> * ``` @@ -409,9 +409,9 @@ public function id(bool|string $id): self * Example usage: * ```php * $carousel->items( - * CarouselItem::to(Img::tag()->alt('First slide')->src('image-1.jpg'), active: true), - * CarouselItem::to(Img::tag()->alt('Second slide')->src('image-2.jpg')), - * CarouselItem::to(Img::tag()->alt('Third slide')->src('image-3.jpg')), + * CarouselItem::to((new Img())->alt('First slide')->src('image-1.jpg'), active: true), + * CarouselItem::to((new Img())->alt('Second slide')->src('image-2.jpg')), + * CarouselItem::to((new Img())->alt('Third slide')->src('image-3.jpg')), * ); */ public function items(CarouselItem ...$items): self @@ -498,7 +498,7 @@ public function render(): string Html::addCssClass($attributes, [self::NAME, self::CLASS_SLIDE, $classes, ...$this->cssClasses]); - return Div::tag() + return (new Div()) ->attributes($attributes) ->addContent( "\n", @@ -549,12 +549,12 @@ private function renderControlNext(string $id): string ->addClass(self::CLASS_CAROUSEL_CONTROL_NEXT) ->addContent( "\n", - Span::tag() + (new Span()) ->addAttributes(['aria-hidden' => 'true']) ->addClass(self::CLASS_CAROUSEL_CONTROL_NEXT_ICON) ->render(), "\n", - Span::tag()->addClass('visually-hidden')->addContent($this->controlNextLabel)->render(), + (new Span())->addClass('visually-hidden')->addContent($this->controlNextLabel)->render(), "\n", ) ->encode(false) @@ -580,12 +580,12 @@ private function renderControlPrevious(string $id): string ->addClass(self::CLASS_CAROUSEL_CONTROL_PREV) ->addContent( "\n", - Span::tag() + (new Span()) ->addAttributes(['aria-hidden' => 'true']) ->addClass(self::CLASS_CAROUSEL_CONTROL_PREV_ICON) ->render(), "\n", - Span::tag()->addClass('visually-hidden')->addContent($this->controlPreviousLabel)->render(), + (new Span())->addClass('visually-hidden')->addContent($this->controlPreviousLabel)->render(), "\n", ) ->encode(false) @@ -643,7 +643,7 @@ private function renderItem(CarouselItem $carouselItem, bool $active): string ); } - $captionContainerTag = Div::tag() + $captionContainerTag = (new Div()) ->addClass(self::CLASS_CAROUSEL_CAPTION) ->addContent( "\n", @@ -658,7 +658,7 @@ private function renderItem(CarouselItem $carouselItem, bool $active): string ) . "\n"; } - return Div::tag() + return (new Div()) ->addClass( self::CLASS_CAROUSEL_ITEM, $carouselItem->isActive() || $active ? 'active' : null, @@ -704,7 +704,7 @@ private function renderItems(string $id): string } if ($this->showIndicators) { - $renderIndicators = Div::tag() + $renderIndicators = (new Div()) ->addClass(self::CLASS_CAROUSEL_INDICATORS) ->addContent("\n" . implode("\n", $indicators) . "\n") ->encode(false) @@ -712,7 +712,7 @@ private function renderItems(string $id): string } return $renderIndicators - . Div::tag() + . (new Div()) ->addClass(self::CLASS_CAROUSEL_INNER) ->addContent("\n" . implode("\n", $items) . "\n") ->encode(false) diff --git a/src/Collapse.php b/src/Collapse.php index 895d7a4f..8e1b69bd 100644 --- a/src/Collapse.php +++ b/src/Collapse.php @@ -357,12 +357,12 @@ public function render(): string foreach ($this->items as $item) { if ($item->getContent() !== '') { - $collapseDiv = Div::tag() + $collapseDiv = (new Div()) ->addClass(self::NAME, ...$this->cssClasses) ->addAttributes($this->attributes) ->addContent( "\n", - Div::tag() + (new Div()) ->addAttributes($this->cardBodyAttributes) ->addClass(self::CARD, self::CARD_BODY) ->addContent( @@ -378,7 +378,7 @@ public function render(): string $collapseDiv = $collapseDiv->addClass(self::COLLAPSE_MULTIPLE); if ($item->getTogglerMultiple() === false) { - $collapse[] = Div::tag()->addClass('col')->addContent("\n", $collapseDiv, "\n"); + $collapse[] = (new Div())->addClass('col')->addContent("\n", $collapseDiv, "\n"); } } else { $collapse[] = $collapseDiv; @@ -403,7 +403,7 @@ private function renderCollapse(array $collapse): string $collapseContent = implode("\n", $collapse); return $this->container - ? Div::tag() + ? (new Div()) ->addAttributes($this->containerAttributes) ->addContent("\n", $collapseContent, "\n") ->encode(false) diff --git a/src/Dropdown.php b/src/Dropdown.php index 0ad3e9a8..6530109c 100644 --- a/src/Dropdown.php +++ b/src/Dropdown.php @@ -492,7 +492,7 @@ public function theme(string $theme): self * Example usage: * ```php * $dropdown->toggler( - * Button::tag() + * (new Button()) * ->addAttributes( * [ * 'data-bs-toggle' => 'dropdown', @@ -773,7 +773,7 @@ public function render(): string $renderItems = $this->renderItems($togglerId); return match ($this->container) { - true => Div::tag() + true => (new Div()) ->addAttributes($attributes) ->addClass(...$containerClasses) ->addClass($classes) @@ -835,7 +835,7 @@ private function renderItem(DropdownItem $item): Li */ private function renderItemButton(DropdownItem $item): Li { - return Li::tag() + return (new Li()) ->addAttributes($item->getAttributes()) ->addContent( "\n", @@ -856,11 +856,11 @@ private function renderItemButton(DropdownItem $item): Li */ private function renderItemDivider(DropdownItem $item): Li { - return Li::tag() + return (new Li()) ->addAttributes($item->getAttributes()) ->addContent( "\n", - Hr::tag()->addAttributes($item->getItemAttributes())->addClass(self::DROPDOWN_ITEM_DIVIDER_CLASS), + (new Hr())->addAttributes($item->getItemAttributes())->addClass(self::DROPDOWN_ITEM_DIVIDER_CLASS), "\n", ); } @@ -874,7 +874,7 @@ private function renderItemDivider(DropdownItem $item): Li */ private function renderItemHeader(DropdownItem $item): Li { - return Li::tag() + return (new Li()) ->addAttributes($item->getAttributes()) ->addContent( "\n", @@ -908,11 +908,11 @@ private function renderItemLink(DropdownItem $item): Li $itemAttributes['aria-disabled'] = 'true'; } - return Li::tag() + return (new Li()) ->addAttributes($item->getAttributes()) ->addContent( "\n", - A::tag()->addAttributes($itemAttributes)->content($item->getContent())->url($item->getUrl()), + (new A())->addAttributes($itemAttributes)->content($item->getContent())->url($item->getUrl()), "\n", ); } @@ -926,7 +926,7 @@ private function renderItemLink(DropdownItem $item): Li */ private function renderListContentItem(DropdownItem $item): Li { - return Li::tag() + return (new Li()) ->addAttributes($item->getAttributes()) ->addContent("\n", $item->getContent(), "\n") ->encode(false); @@ -941,11 +941,11 @@ private function renderListContentItem(DropdownItem $item): Li */ private function renderItemText(DropdownItem $item): Li { - return Li::tag() + return (new Li()) ->addAttributes($item->getAttributes()) ->addContent( "\n", - Span::tag() + (new Span()) ->addAttributes($item->getItemAttributes()) ->addClass(self::DROPDOWN_ITEM_TEXT_CLASS) ->content($item->getContent()) @@ -973,7 +973,7 @@ private function renderItems(?string $togglerId): string } } - $ulTag = Ul::tag() + $ulTag = (new Ul()) ->addAttributes(['aria-labelledby' => $togglerId]) ->addClass(self::DROPDOWN_LIST_CLASS, ...$this->alignmentClasses) ->items(...$items); @@ -998,7 +998,7 @@ private function renderToggler(?string $togglerId): string $togglerContent = match ($this->togglerSplit) { true => "\n" - . Span::tag() + . (new Span()) ->addContent($this->togglerContent) ->addClass(self::DROPDOWN_TOGGLER_SPAN_CLASS) ->render() @@ -1051,7 +1051,7 @@ private function renderToggler(?string $togglerId): string */ private function renderTogglerLink(array $togglerAttributes, string $togglerContent): string { - return A::tag() + return (new A()) ->addAttributes($togglerAttributes) ->attribute('role', 'button') ->attribute('data-bs-toggle', 'dropdown') @@ -1070,7 +1070,7 @@ private function renderTogglerLink(array $togglerAttributes, string $togglerCont private function renderTogglerSplit(): string { if ($this->togglerLink) { - return A::tag() + return (new A()) ->addAttributes(['role' => 'button']) ->addClass( self::DROPDOWN_TOGGLER_BUTTON_CLASS, diff --git a/src/Modal.php b/src/Modal.php index 3c6ce5b4..60d3283b 100644 --- a/src/Modal.php +++ b/src/Modal.php @@ -23,13 +23,13 @@ * * ```php * = Modal::widget() - * ->body(P::tag()->content('Modal body text goes here.')) + * ->body((new P())->content('Modal body text goes here.')) * ->footer( - * Button::tag() + * (new Button()) * ->addClass('btn btn-secondary') * ->attribute('data-bs-dismiss', 'modal') * ->content('Close'), - * Button::tag() + * (new Button()) * ->addClass('btn btn-primary') * ->content('Save changes'), * ) @@ -595,7 +595,7 @@ public function render(): string throw new InvalidArgumentException('Set the trigger button before rendering the modal.'); } - $modal = Div::tag() + $modal = (new Div()) ->addAttributes($attributes) ->addClass( self::NAME, @@ -639,7 +639,7 @@ private function renderBody(): string unset($bodyAttributes['class']); - return Div::tag() + return (new Div()) ->addAttributes($bodyAttributes) ->addClass( self::MODAL_BODY, @@ -662,7 +662,7 @@ private function renderContent(): string Html::addCssClass($contentAttributes, [self::MODAL_CONTENT, $contentClasses]); - return Div::tag() + return (new Div()) ->addAttributes($contentAttributes) ->addClass( self::MODAL_CONTENT, @@ -688,7 +688,7 @@ private function renderDialog(): string unset($dialogAttributes['class']); - return Div::tag() + return (new Div()) ->addAttributes($dialogAttributes) ->addClass( self::MODAL_DIALOG, @@ -712,7 +712,7 @@ private function renderHeader(): string unset($headerAttributes['class']); - return Div::tag() + return (new Div()) ->addAttributes($headerAttributes) ->addClass( self::MODAL_HEADER, @@ -735,7 +735,7 @@ private function renderFooter(): string unset($footerAttributes['class']); - return Div::tag() + return (new Div()) ->addAttributes($footerAttributes) ->addClass( self::MODAL_FOOTER, diff --git a/src/Nav.php b/src/Nav.php index bae6cf6f..c3e58ab8 100644 --- a/src/Nav.php +++ b/src/Nav.php @@ -486,7 +486,7 @@ public function render(): string } $html = $this->tag === '' - ? Ul::tag()->addAttributes($attributes)->id($id)->items(...$this->renderItems())->render() + ? (new Ul())->addAttributes($attributes)->id($id)->items(...$this->renderItems())->render() : Html::tag($this->tag) ->addAttributes($attributes) ->addContent("\n", implode("\n", $this->createLinks()), "\n") @@ -506,7 +506,7 @@ public function render(): string private function createLink(NavLink $item): A|Button { $attributes = $item->getUrlAttributes(); - $tag = A::tag()->href($item->getUrl()); + $tag = (new A())->href($item->getUrl()); Html::addCssClass($attributes, [self::NAV_LINK_CLASS]); @@ -524,7 +524,7 @@ private function createLink(NavLink $item): A|Button } if ($item->hasContent()) { - $tag = Button::tag()->type('button'); + $tag = (new Button())->type('button'); $paneId = $item->getId(); $attributes['id'] = $paneId; @@ -672,7 +672,7 @@ private function renderItemsDropdown(Dropdown $items): Li $togglerClasses[] = self::NAV_LINK_ACTIVE_CLASS; } - return Li::tag() + return (new Li()) ->addClass(...$this->dropdownCssClasses, ...$dropDownItems->getCssClasses()) ->addContent( "\n", @@ -703,7 +703,7 @@ private function renderNavItem(NavLink $item): Li $attributes['role'] = 'presentation'; } - return Li::tag()->addAttributes($attributes)->addContent("\n", $this->createLink($item), "\n"); + return (new Li())->addAttributes($attributes)->addContent("\n", $this->createLink($item), "\n"); } /** @@ -730,7 +730,7 @@ private function renderTabContent(): string Html::addCssClass($paneAttributes, ['widget' => 'tab-content']); return "\n" - . Div::tag() + . (new Div()) ->addAttributes($paneAttributes) ->content("\n" . implode("\n", $panes) . "\n") ->encode(false) @@ -764,7 +764,7 @@ private function renderTabPane(NavLink $item): string ); } - return Div::tag() + return (new Div()) ->attributes($paneAttributes) ->addAttributes( [ diff --git a/src/NavBar.php b/src/NavBar.php index 06cc58a8..b00f0e87 100644 --- a/src/NavBar.php +++ b/src/NavBar.php @@ -345,7 +345,7 @@ public function brandAttributes(array $attributes): self * $navBar->brandImage('path/to/image.png'); * * // or - * $navBar->brandImage(Img::tag()->src('path/to/image.png')); + * $navBar->brandImage((new Img())->src('path/to/image.png')); * ``` */ public function brandImage(string|Stringable $image): self @@ -839,7 +839,7 @@ private function renderToggler(string $id): string $togglerTag = Button::button('') ->addAttributes($togglerAttributes) ->addClass(self::NAV_TOGGLE, $togglerClasses) - ->addContent("\n", Span::tag()->addClass(self::NAV_TOGGLE_ICON), "\n") + ->addContent("\n", (new Span())->addClass(self::NAV_TOGGLE_ICON), "\n") ->encode(false); if (array_key_exists('data-bs-toggle', $togglerAttributes) === false) { diff --git a/src/Offcanvas.php b/src/Offcanvas.php index 0797ce6a..709d3e5d 100644 --- a/src/Offcanvas.php +++ b/src/Offcanvas.php @@ -696,13 +696,13 @@ private function renderHeader(string $id): string Html::addCssClass($titleAttributes, [self::TITLE_CLASS]); - return Div::tag() + return (new Div()) ->attributes($headerAttributes) ->content( "\n", Html::tag('h5', $this->title, $titleAttributes), "\n", - Button::tag() + (new Button()) ->attributes( [ 'aria-label' => 'Close', diff --git a/src/Progress.php b/src/Progress.php index ac75bae9..79885f54 100644 --- a/src/Progress.php +++ b/src/Progress.php @@ -452,7 +452,7 @@ public function render(): string $attributes['style'] = 'width: ' . $this->percent . '%'; } - return Div::tag() + return (new Div()) ->attributes($attributes) ->addClass( self::NAME, @@ -505,7 +505,7 @@ private function renderBar(): string $barAttributes['style'] = 'width: ' . $this->percent . '%'; } - $renderBar = Div::tag() + $renderBar = (new Div()) ->attributes($barAttributes) ->addClass(self::PROGRESS_BAR, ...$this->barClasses) ->addClass($barClasses) diff --git a/src/ProgressStack.php b/src/ProgressStack.php index 2f71c490..b9737f53 100644 --- a/src/ProgressStack.php +++ b/src/ProgressStack.php @@ -246,7 +246,7 @@ public function render(): string $content .= $bar->stacked()->render() . "\n"; } - return Div::tag() + return (new Div()) ->attributes($attributes) ->addClass( self::PROGRESS_STACKED, diff --git a/src/Toast.php b/src/Toast.php index 5dc3c517..8b089e93 100644 --- a/src/Toast.php +++ b/src/Toast.php @@ -294,7 +294,7 @@ public function body(string|Stringable $content, array $attributes = [], BackedE { $new = clone $this; $new->body = is_string($content) - ? Div::tag() + ? (new Div()) ->addAttributes($attributes) ->addClass( self::TOAST_BODY, @@ -482,7 +482,7 @@ public function image(string|Stringable $content, string $alt = '', array $attri { $new = clone $this; $new->image = is_string($content) - ? Img::tag()->addAttributes($attributes)->alt($alt)->src($content)->render() + ? (new Img())->addAttributes($attributes)->alt($alt)->src($content)->render() : (string) $content; return $new; @@ -517,7 +517,7 @@ public function time(string|Stringable $content, array $attributes = [], BackedE { $new = clone $this; $new->time = is_string($content) - ? Small::tag()->addAttributes($attributes)->addClass(...$class)->content($content)->render() + ? (new Small())->addAttributes($attributes)->addClass(...$class)->content($content)->render() : (string) $content; return $new; @@ -552,7 +552,7 @@ public function title(string|Stringable $content, array $attributes = [], Backed { $new = clone $this; $new->title = is_string($content) - ? Strong::tag() + ? (new Strong()) ->addAttributes($attributes) ->addClass( self::TOAST_TITLE_HEADER, @@ -606,7 +606,7 @@ public function render(): string } return match ($this->container) { - true => $this->triggerButton . Div::tag() + true => $this->triggerButton . (new Div()) ->addClass(self::TOAST_CONTAINER) ->content( "\n", @@ -645,7 +645,7 @@ private function renderCloseButton(): string $closeButtonAttributes = $this->closeButtonAttributes; $closeButtonClasses = $closeButtonAttributes['class'] ?? null; - $closeButtonTag = Button::tag() + $closeButtonTag = (new Button()) ->addAttributes($closeButtonAttributes) ->addClass(self::CLASS_CLOSE_BUTTON, $closeButtonClasses) ->content($this->closeButton) @@ -691,7 +691,7 @@ private function renderHeader(): string return ''; } - return Div::tag() + return (new Div()) ->addAttributes($headerAttributes) ->addClass( self::TOAST_HEADER, @@ -728,7 +728,7 @@ private function renderToast(): string $content = preg_replace("/\n{2}/", "\n", $content) ?? ''; - return Div::tag() + return (new Div()) ->addAttributes($attributes) ->addClass( self::NAME, diff --git a/tests/AccordionTest.php b/tests/AccordionTest.php index a23be51b..5dc6fe48 100644 --- a/tests/AccordionTest.php +++ b/tests/AccordionTest.php @@ -22,14 +22,14 @@ public function testAddAttributes(): void { Assert::equalsWithoutLE( << +
.accordion-body, though the transition does limit overflow.
.accordion-body, though the transition does limit overflow.
.accordion-body, though the transition does limit overflow.
.accordion-body, though the transition does limit overflow.
.accordion-body, though the transition does limit overflow.
.accordion-body, though the transition does limit overflow.
.accordion-body, though the transition does limit overflow.
.accordion-body, though the transition does limit overflow.
.accordion-body, though the transition does limit overflow.
.accordion-body, though the transition does limit overflow.
.accordion-body, though the transition does limit overflow.
.accordion-body, though the transition does limit overflow.