diff --git a/composer.json b/composer.json
index 75b6fa585e..80739a561c 100644
--- a/composer.json
+++ b/composer.json
@@ -245,7 +245,10 @@
}
},
"scripts": {
- "phpunit": "@php -d memory_limit=2G vendor/bin/phpunit --display-warnings --display-skipped --display-deprecations --display-errors --display-notices",
+ "phpunit": [
+ "Composer\\Config::disableProcessTimeout",
+ "@php -d memory_limit=2G vendor/bin/phpunit --display-warnings --display-skipped --display-deprecations --display-errors --display-notices"
+ ],
"coverage": "vendor/bin/phpunit --coverage-html build/reports/html --coverage-clover build/reports/clover.xml",
"fmt": "vendor/bin/mago fmt",
"lint:fix": "vendor/bin/mago lint --fix --format-after-fix",
@@ -276,4 +279,4 @@
"composer exceptions:build"
]
}
-}
+}
\ No newline at end of file
diff --git a/docs/1-essentials/02-views.md b/docs/1-essentials/02-views.md
index 5030bc7346..17b6536ace 100644
--- a/docs/1-essentials/02-views.md
+++ b/docs/1-essentials/02-views.md
@@ -559,6 +559,75 @@ This component provides the ability to inject any icon from the [Iconify](https:
```html
```
+will render
+```html
+
+```
+
+This component includes some optional props you can use to control width and height. As a fallback, if you specify no class, no style, no width & height, the component will render a default width and height, but you can override this behaviour in any of the following ways.
+
+```html
+
+```
+will render
+```html
+
+```
+
+Firstly, you can set width and height using Tailwind or custom classes. As long as you pass the `class` prop, the component will assume you are providing suitable dimensions, and will not check, or assert, any default dimensions.
+
+```html
+
+```
+will render
+```html
+
+```
+
+Secondly, if you aren't using Tailwind, or wish to set for a single icon without making a class, you can instead pass dimensions via the `style` prop. Again, as long as you pass `style`, the component will assume you are providing suitable dimensions, and will not check, or assert, any default dimensions.
+
+```html
+
+```
+will render
+```html
+
+```
+
+Finally, you may provide the width and height properties directly with the props `width` and `height`. The component requires both to be set, or will render the fallback dimensions.
+
+```html
+
+```
+will render
+```html
+
+```
The first time a specific icon is being rendered, Tempest will query the [Iconify API](https://iconify.design/docs/api/queries.html) to fetch the corresponding SVG tag. The result of this query will be cached indefinitely, so it can be reused at no further cost.
diff --git a/packages/view/src/Components/x-icon.view.php b/packages/view/src/Components/x-icon.view.php
index 67905ea976..f6bb76c746 100644
--- a/packages/view/src/Components/x-icon.view.php
+++ b/packages/view/src/Components/x-icon.view.php
@@ -1,37 +1,63 @@
render($name);
-} else {
- $svg = null;
-}
-
-if ($svg === null && $environment->isLocal()) {
- $svg = '';
-}
-
-if ($class) {
- $svg = str($svg)
- ->replace(
+$svg = str(is_string($name) ? get(Icon::class)->render($name) : null)
+ ->when(
+ fn (ImmutableString $s): bool => $s->toString() === '' && $environment->isLocal(),
+ fn (ImmutableString $s): ImmutableString => str(""),
+ )
+ ->replace(
+ search: " width=\"1em\" height=\"1em\"",
+ replace: '',
+ )
+ ->when(
+ $style ?? null,
+ fn (ImmutableString $s): ImmutableString => $s->replace(
+ search: '