This PR was squashed before being merged into the 3.x branch.
Discussion
----------
Introduce CVA to html-extra
Hey! This PR introduces CVA to Twig. All of this has already been merged into SymfonyUX (https://github.com/symfony/ux/pull/1416), but `@kbond` suggested that this repo can be a better place for this feature.
Here is a description from the PR merged in to SymfonyUX:
------------------------------
This PR introduces a new concept CVA (Class Variance Authority), by adding a1 twig function, to help you manage your class in your component.
Let's take an example an Alert component. In your app, an alert can have a lot of different styles one for success, one for alert, one for warning, and different sizes, with icons or not... You need something that lets you completely change the style of your component without creating a new component, and without creating too much complexity in your template.
Here is the reason came CVA.
Your Alert component can now look like this:
```twig
{% props color = 'blue', size = 'md' %}
{% set alert = html_cva(
'alert rounded-lg',
{
color: {
blue: 'text-blue-800 bg-blue-50 dark:bg-gray-800 dark:text-blue-400',
red: 'text-red-800 bg-red-50 dark:bg-gray-800 dark:text-red-400',
green: 'text-green-800 bg-green-50 dark:bg-gray-800 dark:text-green-400',
yellow: 'text-yellow-800 bg-yellow-50 dark:bg-gray-800 dark:text-yellow-400',
},
size: {
sm: 'px-4 py-3 text-sm',
md: 'px-6 py-4 text-base',
lg: 'px-8 py-5 text-lg',
}
},
[{
color: ['red'],
size: ['lg'],
class: 'font-semibold'
}],
{
rounded: 'md'
}
}) %}
<div class="{{ cva.apply({color, size}, attribute.render('class'), 'flex p-4') }}">
...
</div>
```
So here you have a `cva` function that lets you define different variants of your component.
You can now use your component like this:
```twig
<twig:Alert color="red" size="md"/>
<twig:Alert color="green" size="sm"/>
<twig:Alert color="yellow" size="lg"/>
<twig:Alert color="red" size="md" class="dark:bg-gray-800"/>
```
And then you get the following result:
<img width="1269" alt="Capture d’écran 2024-01-24 à 00 52 33" src="https://github.com/symfony/ux/assets/32077734/6a5e25be-5b81-4ae7-8385-0fa5422d0396">
If you want to know more about the concept I implement here you can look at:
- CVA (js version): https://cva.style/docs
- tailwind merge: https://github.com/gehrisandro/tailwind-merge-php, https://github.com/dcastil/tailwind-merge
- this implementation by using tailwind-merge and cva is inspired a lot by: https://ui.shadcn.com/ (shadcn is the most starred library on github in 2023)
- a really good article that explains the philosophy behind https://manupa.dev/blog/anatomy-of-shadcn-ui
- this PR works great in a LASTstack: https://symfonycasts.com/screencast/last-stack/last-stack
Tell me what you think about it! Thanks for your time! Cheers 🧡
------------
Commits
-------
e3ac14e1 Introduce CVA to html-extra
This PR was merged into the 3.x branch.
Discussion
----------
Special functions extension point
The `parent`, `attribute`, `block` (and `loop` in 4.0) functions are handled directly in ExpressionParser as they are converted to specific Nodes.
It means that recursive loops can only be implemented in core. By adding a new extension point, we are removing the hardcoded handling of such functions and we open up the possibility for user-land functions to do the same.
*Review is easier when hiding whitespace.*
Commits
-------
44280790 Add an extension point for parsing special functions
This PR was merged into the 3.x branch.
Discussion
----------
Add support for named arguments on special functions
Commits
-------
0c30e78b Add support for named arguments on special functions
This PR was merged into the 3.x branch.
Discussion
----------
Throw a SyntaxError exception at compile time when a Twig callable has not the minimum number of required arguments
When using named arguments, a compilation error is thrown when some required arguments are missing.
But when not using arguments, the error was thrown at runtime. This PR fixed this.
Commits
-------
0823d234 Throw a SyntaxError exception at compile time when a Twig callable has not the minimum number of required arguments
This PR was merged into the 3.x branch.
Discussion
----------
Extract a new CallableArgumentsExtractor class
Commits
-------
e1705f88 Extract a new CallableArgumentsExtractor class
This PR was merged into the 3.x branch.
Discussion
----------
Make Node::__toString() more readable
Commits
-------
b431ecad Make Node::__toString() more readable
This PR was merged into the 3.x branch.
Discussion
----------
Remove remaining const optimizations
After #4198, some Token:: constant optimizations remained.
This PR removes them.. **in case** this was not intended
Commits
-------
c662e0ce Remove remaining const optimizations
This PR was merged into the 3.x branch.
Discussion
----------
Move FunctionExpression/FilterExpression/TestExpression attributes from compilation time to parsing time
Closes#3895
Opened early to gather feedback.
Commits
-------
3156d809 Move FunctionExpression/FilterExpression/TestExpression attributes from compilation time to parsing time
This PR was merged into the 3.x branch.
Discussion
----------
Cleanup the implementation of the defined test for constants
Let's avoid modifying the `TwigFunction`.
Commits
-------
6ecd1f13 Cleanup the implementation of the defined test for constants
This PR was merged into the 3.x branch.
Discussion
----------
Make various optimizations for dynamic Twig callables
Commits
-------
148d3e07 Make various optimization for dynamic Twig callables
This PR was squashed before being merged into the 3.x branch.
Discussion
----------
Optimize stripcslashes
See https://github.com/twigphp/Twig/pull/4176#issuecomment-2283168241 by `@smnandre`
```
# Old
Benchmark 1: php bench.php
Time (mean ± σ): 1.192 s ± 0.004 s [User: 1.163 s, System: 0.009 s]
Range (min … max): 1.186 s … 1.198 s 10 runs
# New
Benchmark 1: php bench.php
Time (mean ± σ): 356.5 ms ± 1.1 ms [User: 342.0 ms, System: 7.6 ms]
Range (min … max): 354.6 ms … 358.2 ms 10 runs
```
Using bench.php:
```php
<?php
require_once __DIR__.'/vendor/autoload.php';
$string = str_repeat("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut a tincidunt turpis. \\App\\Entity\\Product \World \065 App\#{var} \'quoted\' Donec pharetra enim quis erat pharetra, dignissim molestie erat laoreet. Vivamus auctor purus sed lorem vestibulum rhoncus.", 10);
$loader = new Twig\Loader\ArrayLoader([
'index.twig' => <<<EOF
{{ "$string" }}
EOF
,
]);
$twig = new Twig\Environment($loader);
for ($i = 0; $i < 10000; $i++) {
$twig->tokenize(new Twig\Source($twig->getLoader()->getSourceContext('index.twig')->getCode(), 'index.twig'));
}
```
Commits
-------
bc6e36de Optimize stripcslashes
This PR was merged into the 3.x branch.
Discussion
----------
(minor) Prefer `className` over `classname`
For consistency with how it's written in the tested classes.
Commits
-------
03012f19 (minor) Prefer `className` over `classname`
This PR was merged into the 3.x branch.
Discussion
----------
Remove escape
Interestingly this didn’t fail on the branch that introduced the change. Are we sure the integration tests work at all?
See [failing job](https://github.com/twigphp/Twig/actions/runs/10341129793) on merge to main.
Commits
-------
8ef12588 Remove escape
This PR was merged into the 3.x branch.
Discussion
----------
Deprecate unnecessary escape characters
This is a first attempt at solving #4123 and #2712.
Currently it writes the deprecations to an array in the Lexer. This is probably not the way to do it. Should we directly trigger `E_USER_DEPRECATED` errors?
/cc `@stof` `@fabpot` Let me know what you think 😊
Commits
-------
c6656cf5 Deprecate unnecessary escape characters
This PR was merged into the 3.x branch.
Discussion
----------
Add the notion of a Twig callable
Commits
-------
84bc23af Add the notion of a Twig callable
This PR was merged into the 3.x branch.
Discussion
----------
Drop support for 8.0
The most recent version of PHP 7 (7.4) was deprecated more than a year and a half ago.
We won't remove code that supports PHP 7 (as this has already been done in 4.x and there is no point in redoing the work in the 3.x branch), but we will use some new PHP 8 features in the 3.x branch from now on.
Commits
-------
c070cd71 Drop support for 8.0
This PR was merged into the 3.x branch.
Discussion
----------
Add a note about how to escape a string interpolation in a string
Commits
-------
38e47a3e Add a note about how to escape a string interpolation in a string