Skip to content

Commit 8cecca4

Browse files
committed
[Site] Rework Toolkit recipe rendering system, improve our Markdown converter
1 parent f9e4178 commit 8cecca4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+1289
-390
lines changed

src/Toolkit/src/Recipe/RecipeManifest.php

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -94,18 +94,19 @@ public static function fromJson(string $json): self
9494
throw new \InvalidArgumentException(\sprintf('The dependency #%d of type "npm" must be a non-empty string.', $i));
9595
}
9696

97-
// format: "package@version" or "@scope/package@version"
98-
if (str_contains($package, '@')) {
99-
if (substr_count($package, '@') > 1) {
100-
$pos = strrpos($package, '@');
101-
$name = substr($package, 0, $pos);
102-
$version = substr($package, $pos + 1);
103-
} else {
104-
[$name, $version] = explode('@', $package, 2);
105-
}
97+
// format: "package@version", "@scope/package", "@scope/package@version"
98+
$name = $package;
99+
$version = null;
100+
$versionPos = strrpos($package, '@');
101+
if (false !== $versionPos && 0 !== $versionPos) {
102+
$name = substr($package, 0, $versionPos);
103+
$version = substr($package, $versionPos + 1);
104+
}
105+
106+
if (null !== $version) {
106107
$dependencies[] = new NpmPackageDependency($name, new ConstraintVersion($version));
107108
} else {
108-
$dependencies[] = new NpmPackageDependency($package);
109+
$dependencies[] = new NpmPackageDependency($name);
109110
}
110111
}
111112

src/Toolkit/tests/Recipe/RecipeManifestTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ public function testFromJsonWithValidData()
218218
],
219219
"npm": [
220220
"tailwindcss@^4.0.0",
221+
"@tailwindplus/elements",
221222
"@tailwindplus/elements@1"
222223
],
223224
"importmap": [
@@ -239,6 +240,7 @@ public function testFromJsonWithValidData()
239240
new PhpPackageDependency('tales-from-a-dev/twig-tailwind-extra', new ConstraintVersion('^1.0.0')),
240241
new PhpPackageDependency('symfony/ux-twig-component', new ConstraintVersion('^2.29')),
241242
new NpmPackageDependency('tailwindcss', new ConstraintVersion('^4.0.0')),
243+
new NpmPackageDependency('@tailwindplus/elements'),
242244
new NpmPackageDependency('@tailwindplus/elements', new ConstraintVersion('1')),
243245
new ImportmapPackageDependency('@hotwired/stimulus'),
244246
], $manifest->dependencies);

ux.symfony.com/assets/styles/app.scss

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,8 @@ $utilities: map-remove(
152152
@import "components/Terminal";
153153
@import "components/TerminalCommand";
154154
@import "components/ThemeSwitcher";
155-
@import "components/Toolkit_Tabs";
155+
@import "components/Toolkit";
156+
@import "components/Wysiwyg_Tabs";
156157
@import "components/Wysiwyg";
157158

158159
// Utilities
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
.Toolkit_Loader {
2+
width: 100%;
3+
display: flex;
4+
justify-content: center;
5+
align-items: center;
6+
gap: .2rem;
7+
position: absolute;
8+
9+
svg {
10+
animation: rotating 1s linear infinite;
11+
}
12+
}
13+
14+
.Toolkit_Preview {
15+
width: 100%;
16+
transition: opacity .250s linear;
17+
border-radius: .75rem;
18+
opacity: 1;
19+
20+
&.loading {
21+
opacity: 0;
22+
}
23+
}

ux.symfony.com/assets/styles/components/_Toolkit_Tabs.scss

Lines changed: 0 additions & 60 deletions
This file was deleted.

ux.symfony.com/assets/styles/components/_Wysiwyg.scss

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
margin-top: 1.5rem;
2323
}
2424

25-
a {
25+
a:not(.Terminal_title) {
2626
color: var(--bs-link-color);
2727
text-decoration: underline;
2828
}
@@ -36,4 +36,8 @@
3636
.table-responsive .table {
3737
margin-bottom: 0;
3838
}
39+
40+
.Terminal {
41+
margin-bottom: 1rem;
42+
}
3943
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
.Wysiwyg_Tabs {
2+
}
3+
4+
.Wysiwyg_TabHead {
5+
display: flex;
6+
flex-direction: row;
7+
margin-bottom: 1rem
8+
}
9+
10+
.Wysiwyg_TabControl {
11+
border-bottom: 3px solid transparent;
12+
color: var(--bs-primary-color);
13+
padding: 0 1rem;
14+
font-size: .9rem;
15+
line-height: 2;
16+
font-stretch: semi-condensed;
17+
transition: border-color 150ms ease-in-out;
18+
margin-bottom: -1px;
19+
}
20+
21+
.Wysiwyg_TabControl.active {
22+
border-color: var(--bs-secondary-color);
23+
}
24+
25+
.Wysiwyg_TabPanel {
26+
position: relative;
27+
}
28+
29+
.Wysiwyg_TabPanel:not(.active) {
30+
display: none;
31+
}
32+
33+
.Wysiwyg_TabPanel:has(.Toolkit_Preview) {
34+
border: 1px solid var(--bs-border-color);
35+
border-radius: .75rem
36+
}

ux.symfony.com/config/services.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ services:
2323
# add more service definitions when explicit configuration is needed
2424
# please note that last definitions always *replace* previous ones
2525
Tempest\Highlight\Highlighter:
26+
factory: ['App\Service\Tempest\Highlighter\HighlighterFactory', 'create']
2627
tags: ['twig.runtime']
2728

2829
ux_toolkit.registry.registry_factory:

ux.symfony.com/src/Service/CommonMark/ConverterFactory.php

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@
1111

1212
namespace App\Service\CommonMark;
1313

14-
use App\Service\CommonMark\Extension\CodeBlockRenderer\CodeBlockRenderer;
15-
use App\Service\Toolkit\ToolkitService;
14+
use App\Service\CommonMark\Extension\FencedCode\FencedCodeRenderer;
15+
use App\Service\CommonMark\Extension\Tabs\TabsExtension;
16+
use App\Service\CommonMark\Extension\ToolkitPreview\ToolkitPreviewExtension;
1617
use League\CommonMark\CommonMarkConverter;
1718
use League\CommonMark\Extension\CommonMark\Node\Block\FencedCode;
1819
use League\CommonMark\Extension\DefaultAttributes\DefaultAttributesExtension;
@@ -22,15 +23,20 @@
2223
use League\CommonMark\Extension\Table\Table;
2324
use League\CommonMark\Extension\Table\TableExtension;
2425
use Symfony\Component\DependencyInjection\Attribute\AsDecorator;
26+
use Symfony\Component\HttpFoundation\UriSigner;
27+
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
28+
use Symfony\UX\TwigComponent\ComponentRendererInterface;
2529

2630
/**
2731
* @author Kevin Bond <[email protected]>
2832
*/
2933
#[AsDecorator('twig.markdown.league_common_mark_converter_factory')]
30-
final class ConverterFactory
34+
final readonly class ConverterFactory
3135
{
3236
public function __construct(
33-
private readonly ToolkitService $toolkitService,
37+
private ComponentRendererInterface $componentRenderer,
38+
private UriSigner $uriSigner,
39+
private UrlGeneratorInterface $urlGenerator,
3440
) {
3541
}
3642

@@ -39,7 +45,7 @@ public function __invoke(): CommonMarkConverter
3945
$converter = new CommonMarkConverter([
4046
'default_attributes' => [
4147
Table::class => [
42-
'class' => 'table',
48+
'class' => 'table table-hover',
4349
],
4450
],
4551
'mentions' => [
@@ -72,7 +78,9 @@ public function __invoke(): CommonMarkConverter
7278
->addExtension(new MentionExtension())
7379
->addExtension(new FrontMatterExtension())
7480
->addExtension(new TableExtension())
75-
->addRenderer(FencedCode::class, new CodeBlockRenderer($this->toolkitService))
81+
->addExtension(new TabsExtension())
82+
->addExtension(new ToolkitPreviewExtension($this->uriSigner, $this->urlGenerator))
83+
->addRenderer(FencedCode::class, new FencedCodeRenderer($this->componentRenderer))
7684
;
7785

7886
return $converter;

ux.symfony.com/src/Service/CommonMark/Extension/CodeBlockRenderer/CodeBlockRenderer.php

Lines changed: 0 additions & 86 deletions
This file was deleted.

0 commit comments

Comments
 (0)