diff --git a/packages/view/src/Attributes/ExpressionAttribute.php b/packages/view/src/Attributes/ExpressionAttribute.php
index 43f8b57d9..0fd8209d8 100644
--- a/packages/view/src/Attributes/ExpressionAttribute.php
+++ b/packages/view/src/Attributes/ExpressionAttribute.php
@@ -66,14 +66,20 @@ public static function render(string $name, mixed $value): string
return str($name)->kebab()->toString();
}
- if (! $value) {
+ if ($value === false || $value === null) {
+ return '';
+ }
+
+ $resolvedValue = self::resolveValue($value);
+
+ if ($resolvedValue === '') {
return '';
}
return sprintf(
'%s="%s"',
str($name)->kebab(),
- ExpressionAttribute::resolveValue($value),
+ $resolvedValue,
);
}
diff --git a/packages/view/src/Elements/ViewComponentElement.php b/packages/view/src/Elements/ViewComponentElement.php
index bf6f124fe..539700e9b 100644
--- a/packages/view/src/Elements/ViewComponentElement.php
+++ b/packages/view/src/Elements/ViewComponentElement.php
@@ -60,7 +60,7 @@ public function __construct(
$this->expressionAttributes = arr($attributes)
->filter(fn (string $_, string $key) => str_starts_with($key, ':'))
->filter(fn (string $_, string $key) => ! in_array($key, [':if', ':else', ':elseif', ':foreach', ':forelse'], strict: true))
- ->mapWithKeys(fn (string $value, string $key) => yield str($key)->camel()->ltrim(':')->toString() => $value ?: 'true');
+ ->mapWithKeys(fn (string $value, string $key) => yield str($key)->camel()->ltrim(':')->toString() => $value === '' ? 'true' : $value);
$this->scopedVariables = arr();
}
@@ -448,7 +448,7 @@ private function exportAttributesArray(): string
$isExpression = isset($this->expressionAttributes[$camelKey]);
$entries[] = $isExpression
- ? sprintf("'%s' => %s", $key, $value ?: 'true')
+ ? sprintf("'%s' => %s", $key, $value === '' ? 'true' : $value)
: sprintf("'%s' => %s", $key, ViewObjectExporter::exportValue($value));
}
diff --git a/tests/Integration/View/TempestViewRendererDataPassingTest.php b/tests/Integration/View/TempestViewRendererDataPassingTest.php
index 1bd3d479b..6212f296b 100644
--- a/tests/Integration/View/TempestViewRendererDataPassingTest.php
+++ b/tests/Integration/View/TempestViewRendererDataPassingTest.php
@@ -193,6 +193,25 @@ public function test_expression_attribute_on_view_component(): void
);
}
+ public function test_zero_expression_attribute_literal_on_view_component(): void
+ {
+ $this->view->registerViewComponent(
+ 'x-link',
+ <<<'HTML'
+