Source code for pybloqs.block.collapsible

from typing import ClassVar

from pybloqs.block.base import BaseBlock
from pybloqs.block.layout import CompositeBlockMixin
from pybloqs.html import append_to
from pybloqs.static import Css
from pybloqs.util import Cfg


[docs] class CollapsibleBlock(CompositeBlockMixin, BaseBlock): """A block that can be collapsed/expanded in HTML view. Parameters ---------- contents : list, tuple or set Elements to be included in the collapsible block. cascade_cfg : bool, default=True If True, enables parameter cascading from this block. If False, child blocks do not inherit parameters. **kwargs : dict Optional styling arguments. The `style` keyword has special meaning for grouping styling parameters. Notes ----- The `style` keyword argument is useful when styling parameter names clash with standard block parameters. """ resource_deps: ClassVar[tuple] = [ Css( css_string=""" details.pybloqs > summary { list-style: none; cursor: pointer; } details.pybloqs > summary :where(h1,h2,h3,h4,h5,h6)::before { content: '▶'; display: inline-block; margin-right: 0.5em; transition: transform 0.2s; } details[open].pybloqs > summary :where(h1,h2,h3,h4,h5,h6)::before { transform: rotate(90deg); } """, name="collapsible_block_style", ) ] def __init__(self, contents, cascade_cfg=True, **kwargs) -> None: super().__init__(**kwargs) self._contents = self._blockify_contents(contents, kwargs, self._settings.title_level) self._cascade_cfg = cascade_cfg self.container_tag = "details" def _write_contents(self, container, actual_cfg, *args, **kwargs) -> None: for content in self._contents: cell = append_to(container, "div") content._write_block(cell, actual_cfg if self._cascade_cfg else Cfg(), *args, **kwargs) def _write_title(self, container) -> None: title = append_to(container, "summary") title["class"] = self._settings.classes t = append_to(title, f"H{self._settings.title_level}") t.string = self._settings.title