puppygirl-py/puppygirl/elements/host.py
2025-10-08 11:40:26 -04:00

67 lines
1.5 KiB
Python

from dataclasses import dataclass
from typing import TYPE_CHECKING
from .constants import TemplateAttr
from .shadow_root import ShadowRootMode
from ..renderer import Query, Renderable
if TYPE_CHECKING:
from .. import Puppygirl
from .shadow_root import Node
from ..puppytype import RenderableElement, Templates
@dataclass
class PuppygirlHost(Renderable):
puppygirl: "Puppygirl"
@property
def name(self):
return "pg-host"
def query(self) -> Query:
return Query(self.name, attrs={ "template": True })
def render(self, node: "Node", templates: "Templates") -> "RenderableElement":
template = templates[node[TemplateAttr]]
shadow_root = node.attach_shadow(ShadowRootMode.Open)
shadow_root.append_child(template.clone())
return node
@dataclass
class PuppygirlPart(Renderable):
puppygirl: "Puppygirl"
@property
def name(self):
return "pg-part"
def query(self) -> Query:
return Query(self.name, attrs={ "for": True })
def render(self, node: "Node", templates: "Templates") -> "RenderableElement":
template = node.parent.find("template", recursive=False)
if template is None:
return node
part_name = node["for"]
parts = template.find_all(attrs={ "part": part_name })
attrs = {
attr: value
for attr, value in node.value.attrs.items()
if attr != "for"
}
for attr, value in attrs.items():
for part in parts:
part[attr] = value
return []