Skip to content

Commit 36d29bb

Browse files
committed
[Vue] UX Vue.js example for ux.symfony.com
1 parent 8db995c commit 36d29bb

19 files changed

+823
-398
lines changed

ux.symfony.com/assets/app.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { registerReactControllerComponents } from '@symfony/ux-react';
2-
2+
import {registerVueControllerComponents} from "@symfony/ux-vue";
33

44
// any CSS you import will output into a single css file (app.css in this case)
55
import './styles/app.scss';
@@ -14,3 +14,4 @@ import Tab from 'bootstrap/js/dist/tab';
1414

1515
// initialize symfony/ux-react
1616
registerReactControllerComponents(require.context('./react/controllers', true, /\.(j|t)sx?$/));
17+
registerVueControllerComponents(require.context('./vue/controllers', true, /\.vue?$/));

ux.symfony.com/assets/controllers.json

+6
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,12 @@
8484
"enabled": true,
8585
"fetch": "eager"
8686
}
87+
},
88+
"@symfony/ux-vue": {
89+
"vue": {
90+
"enabled": true,
91+
"fetch": "eager"
92+
}
8793
}
8894
},
8995
"entrypoints": []

ux.symfony.com/assets/images/vue.png

12.9 KB
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<template>
2+
<div v-if="packages.length === 0" class="alert alert-info">Sad trombone... we haven't built any components that
3+
match this search yet!
4+
</div>
5+
6+
<div v-else class="row">
7+
<a
8+
v-for="uxPackage in packages"
9+
:href="uxPackage.url"
10+
class="col-12 col-md-4 col-lg-3 mb-2"
11+
>
12+
<div class="components-container p-2">
13+
<div class="d-flex">
14+
<div
15+
class="live-component-img d-flex justify-content-center align-items-center"
16+
:style="{background: uxPackage.gradient}">
17+
<img width="17" height="17"
18+
:src="uxPackage.imageUrl"
19+
:alt="`Image for the ${uxPackage.humanName} UX package`"
20+
/>
21+
</div>
22+
<h4 class="ubuntu-title ps-2 align-self-center">
23+
{{ uxPackage.humanName }}
24+
</h4>
25+
</div>
26+
</div>
27+
</a>
28+
</div>
29+
</template>
30+
31+
<script setup>
32+
defineProps({
33+
packages: Array,
34+
});
35+
</script>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<template>
2+
<div>
3+
<input
4+
v-model="search"
5+
class="form-control"
6+
type="search"
7+
placeholder="This search is built in Vue!"
8+
/>
9+
10+
<div class="mt-3">
11+
<PackageList :packages="filteredPackages" />
12+
</div>
13+
</div>
14+
</template>
15+
16+
<script setup>
17+
import { computed, ref } from 'vue';
18+
import PackageList from "../components/PackageList";
19+
20+
const props = defineProps({
21+
packages: Array,
22+
});
23+
24+
const search = ref('');
25+
26+
const filteredPackages = computed(() => {
27+
return props.packages.filter(
28+
uxPackage => uxPackage.humanName.toLowerCase().includes(search.value.toLowerCase())
29+
);
30+
});
31+
</script>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<template>
2+
<div>
3+
<input v-model="search" />
4+
5+
<div class="row">
6+
<a v-for="uxPackage in filteredPackages" :href="uxPackage.url">
7+
<img :src="uxPackage.imageUrl" />
8+
<h4>{{ uxPackage.humanName }}</h4>
9+
</a>
10+
</div>
11+
</div>
12+
</template>
13+
14+
<script setup>
15+
import { computed, ref } from 'vue';
16+
17+
const props = defineProps({
18+
packages: Array,
19+
});
20+
21+
const search = ref('');
22+
23+
const filteredPackages = computed(() => {
24+
return props.packages.filter(
25+
uxPackage => uxPackage.humanName.includes(search.value)
26+
);
27+
});
28+
</script>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{#
2+
"PackageSearch" mounts assets/vue/controllers/PackageSearch.vue.
3+
4+
"packagesData" is dynamic data, which becomes the "packages" prop!
5+
#}
6+
7+
<div {{ vue_component('PackageSearch', {
8+
packages: packagesData
9+
}) }}>
10+
Loading... <i class="fas fa-cog fa-spin fa-3x"></i>
11+
</div>

ux.symfony.com/composer.json

+11
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
"symfony/ux-turbo-mercure": "2.x-dev",
4242
"symfony/ux-twig-component": "2.x-dev",
4343
"symfony/ux-typed": "2.x-dev",
44+
"symfony/ux-vue": "*",
4445
"symfony/validator": "6.0.*",
4546
"symfony/webpack-encore-bundle": "^1.14",
4647
"symfony/yaml": "6.0.*",
@@ -78,6 +79,16 @@
7879
"symfony/polyfill-php74": "*",
7980
"symfony/polyfill-php80": "*"
8081
},
82+
"repositories": [{
83+
"type": "path",
84+
"url": "../src/Vue",
85+
"options": {
86+
"versions": {
87+
"symfony/ux-vue": "1.0"
88+
}
89+
}
90+
}
91+
],
8192
"scripts": {
8293
"auto-scripts": {
8394
"cache:clear": "symfony-cmd",

0 commit comments

Comments
 (0)