88use Latte \Compiler \Nodes \Html \AttributeNode ;
99use Latte \Compiler \Nodes \Html \ElementNode ;
1010use Latte \Compiler \Nodes \Html \ExpressionAttributeNode ;
11+ use Latte \Compiler \Nodes \Php \ArgumentNode ;
1112use Latte \Compiler \Nodes \Php \ArrayItemNode ;
1213use Latte \Compiler \Nodes \Php \Expression \ArrayNode ;
14+ use Latte \Compiler \Nodes \Php \Expression \FunctionCallNode ;
1315use Latte \Compiler \Nodes \Php \ExpressionNode ;
16+ use Latte \Compiler \Nodes \Php \NameNode ;
1417use Latte \Compiler \Nodes \Php \Scalar \StringNode ;
1518use Latte \Compiler \Nodes \PrintNode ;
1619use Latte \Compiler \Nodes \TextNode ;
20+ use LatteView \Extension \Frontend \Nodes \DataSerializationNode ;
21+ use LatteView \Extension \Frontend \Serializers \UniversalSerializer ;
1722
1823trait AttributeParserTrait
1924{
@@ -28,6 +33,21 @@ protected function getAttributesNode(?ElementNode $el): ArrayNode
2833
2934 $ items = [];
3035 foreach ($ el ->attributes ->children as $ child ) {
36+ // Handle DataSerializationNode (e.g., n:data-alpine="$data")
37+ if ($ child instanceof DataSerializationNode) {
38+ $ attrName = $ child ->getPublicAttributeName ();
39+ $ nameNode = new StringNode ($ attrName );
40+
41+ // Create a function call expression: UniversalSerializer::serialize($data)
42+ $ valueNode = new FunctionCallNode (
43+ new NameNode (UniversalSerializer::class . '::serialize ' ),
44+ [new ArgumentNode ($ child ->getDataExpression (), false , false , null , $ child ->position )],
45+ );
46+
47+ $ items [] = new ArrayItemNode ($ valueNode , $ nameNode );
48+ continue ;
49+ }
50+
3151 // Handle standard AttributeNode (e.g., method="get")
3252 if ($ child instanceof AttributeNode && $ child ->name instanceof TextNode) {
3353 $ name = $ child ->name ->content ;
0 commit comments