Skip to content

Commit 9410ee5

Browse files
committed
파트너 머지
merge merge
1 parent afb1798 commit 9410ee5

40 files changed

+228
-1189
lines changed

ko-KR/src/partners/components/PartnerCard.vue

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script setup lang="ts">
22
import { Partner } from './type'
3-
import { normalizeName, getHero, getLogo } from './utils'
3+
import { normalizeName, getHero, getLogo, track } from './utils'
44
import Location from './PartnerLocation.vue'
55
66
const { data, hero, page } = defineProps<{
@@ -9,7 +9,16 @@ const { data, hero, page } = defineProps<{
99
page?: boolean
1010
}>()
1111
12-
const { name, intro, region, logo, proficiencies, flipLogo } = data
12+
const {
13+
name,
14+
intro,
15+
region,
16+
logo,
17+
hero: heroImg,
18+
proficiencies,
19+
flipLogo,
20+
website
21+
} = data
1322
</script>
1423

1524
<template>
@@ -20,13 +29,15 @@ const { name, intro, region, logo, proficiencies, flipLogo } = data
2029
:href="'/partners/' + normalizeName(name) + '.html'"
2130
>
2231
<div class="info">
23-
<img
24-
class="logo dark"
25-
v-if="hero && flipLogo"
26-
:src="getLogo(logo, flipLogo)"
27-
/>
28-
<img class="logo" v-if="hero" :src="getLogo(logo)" />
29-
<h3 v-else>{{ name }}</h3>
32+
<a :href="website.url" target="_blank" @click="track">
33+
<img
34+
class="logo dark"
35+
v-if="hero && flipLogo"
36+
:src="getLogo(logo, flipLogo)"
37+
/>
38+
<img class="logo" v-if="hero" :src="getLogo(logo)" />
39+
<h3 v-else>{{ name }}</h3>
40+
</a>
3041

3142
<p class="region"><Location /> {{ region.join(', ') }}</p>
3243

@@ -37,7 +48,7 @@ const { name, intro, region, logo, proficiencies, flipLogo } = data
3748
<span class="proficiency" v-for="p in proficiencies">{{ p }}</span>
3849
</p>
3950
</div>
40-
<img class="big" :src="getHero(name)" :alt="name + ' hero'" />
51+
<img class="big" :src="getHero(heroImg, name)" :alt="name + ' hero'" />
4152
</component>
4253
</template>
4354

ko-KR/src/partners/components/PartnerHero.vue

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ const { title = 'Vue Partners' } = defineProps<{ title?: string }>()
66
<div class="PartnerHero">
77
<h1 class="title">{{ title }}</h1>
88
<p class="lead">
9-
Vue Partners are Vue-team endorsed angencies that provide first-class
10-
Vue consulting and development services. If your company is
11-
interested in being listed as a partner, please
9+
Vue 파트너는 Vue 팀이 승인한 에이전시로서 최고 수준의
10+
Vue 컨설팅 및 개발 서비스를 제공합니다. 귀사가
11+
파트너로 등록하는 데 관심이 있으시면
1212
<a href="https://airtable.com/shrCQhat57SApJI2l" target="_blank"
13-
>register your interest here</a
13+
>에서 관심을 등록하세요</a
1414
>.
1515
</p>
1616
</div>

ko-KR/src/partners/components/PartnerList.vue

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,54 @@
11
<script setup lang="ts">
2-
import partners from '../partners.json'
3-
import { computed } from 'vue'
2+
import partnersRaw from '../partners.json'
3+
import { computed, onMounted } from 'vue'
44
import PartnerCard from './PartnerCard.vue'
55
import { Partner } from './type'
66
77
const { filter } = defineProps<{
88
filter?: (p: Partner) => boolean | undefined
99
}>()
1010
11+
let mounted = $ref(false)
12+
let partners = $shallowRef(partnersRaw)
13+
1114
const filtered = computed(() =>
1215
filter ? (partners as Partner[]).filter(filter) : (partners as Partner[])
1316
)
17+
18+
onMounted(() => {
19+
mounted = true
20+
const platinum = partners.filter((p) => p.platinum)
21+
shuffle(platinum)
22+
const normal = partners.filter((p) => !p.platinum)
23+
shuffle(normal)
24+
partners = [...platinum, ...normal]
25+
})
26+
27+
function shuffle(array: Array<any>) {
28+
let currentIndex = array.length
29+
let temporaryValue
30+
let randomIndex
31+
32+
// while there remain elements to shuffle...
33+
while (currentIndex !== 0) {
34+
// pick a remaining element...
35+
randomIndex = Math.floor(Math.random() * currentIndex)
36+
currentIndex -= 1
37+
// and swap it with the current element.
38+
temporaryValue = array[currentIndex]
39+
array[currentIndex] = array[randomIndex]
40+
array[randomIndex] = temporaryValue
41+
}
42+
return array
43+
}
1444
</script>
1545

1646
<template>
17-
<div class="PartnerList">
18-
<PartnerCard v-for="p in filtered" :key="p.name" :data="p" />
47+
<div class="PartnerList" v-show="mounted">
48+
<!-- to skip SSG since the partners are shuffled -->
49+
<ClientOnly>
50+
<PartnerCard v-for="p in filtered" :key="p.name" :data="p" />
51+
</ClientOnly>
1952
</div>
2053
</template>
2154

ko-KR/src/partners/components/PartnerPage.vue

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<script setup lang="ts">
22
import data from '../partners.json'
33
import { Partner } from './type'
4-
import { normalizeName } from './utils'
4+
import { normalizeName, track } from './utils'
55
import PartnerCard from './PartnerCard.vue'
66
import { VTIconChevronLeft } from '@vue/theme'
77
@@ -13,6 +13,8 @@ const p = (data as Partner[]).find(
1313
(p) => normalizeName(p.name) === partner
1414
)!
1515
16+
const { name, description, hiring, contact, website } = p
17+
1618
function genMailLink(email: string) {
1719
return `mailto:${email}?subject=Looking for a Vue.js Partner`
1820
}
@@ -22,26 +24,32 @@ function genMailLink(email: string) {
2224
<div class="partner-page">
2325
<div class="back">
2426
<a href="/partners/all.html"
25-
><VTIconChevronLeft class="icon" />Back to all partners</a
27+
><VTIconChevronLeft class="icon" />모든 파트너로 돌아가기</a
2628
>
2729
</div>
2830

2931
<PartnerCard hero page :data="p" />
3032

3133
<div class="description">
32-
<h2>About {{ p.name }}</h2>
33-
<p v-for="desc in p.description" v-html="desc"></p>
34+
<h2>{{ name }}에 대하셔 </h2>
35+
<p v-for="desc in description" v-html="desc"></p>
3436
</div>
3537

3638
<div class="actions">
37-
<a :href="p.website.url" target="_blank">Visit Website</a>
38-
<a class="contact" :href="genMailLink(p.contact)" target="_blank"
39-
>Contact</a
39+
<a :href="website.url" target="_blank" @click="track"
40+
>웹사이트 방문하기</a
41+
>
42+
<a
43+
class="contact"
44+
:href="genMailLink(contact)"
45+
target="_blank"
46+
@click="track"
47+
>연락</a
4048
>
4149
</div>
4250

43-
<div class="hiring" v-if="p.hiring">
44-
<a :href="p.hiring">{{ p.name }} is hiring!</a>
51+
<div class="hiring" v-if="hiring">
52+
<a :href="hiring" @click="track">{{ name }}은 현재 구인중입니다!</a>
4553
</div>
4654
</div>
4755
</template>

ko-KR/src/partners/components/type.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
export interface Partner {
22
name: string
33
logo: string
4+
hero?: string
45
flipLogo?: boolean
56
intro: string
67
description: string[]

ko-KR/src/partners/components/utils.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
1+
export function track() {
2+
fathom.trackGoal('TTDUIE6G', 0)
3+
}
4+
15
export function normalizeName(name: string) {
26
return name.toLowerCase().replace(/\s+/g, '')
37
}
48

5-
export function getHero(name: string) {
6-
return `/images/partners/${normalizeName(name)}-hero.jpg`
9+
export function getHero(img: string | undefined, name: string) {
10+
return `/images/partners/${img || `${normalizeName(name)}-hero.jpg`}`
711
}
812

913
export function getLogo(img: string, flip = false) {

ko-KR/src/partners/dreamonkey.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
page: true
3+
footer: false
4+
---
5+
6+
<script setup>
7+
import Page from './components/PartnerPage.vue'
8+
</script>
9+
10+
<Page partner="dreamonkey" />

ko-KR/src/partners/epicmax.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
page: true
3+
footer: false
4+
---
5+
6+
<script setup>
7+
import Page from './components/PartnerPage.vue'
8+
</script>
9+
10+
<Page partner="epicmax" />

ko-KR/src/partners/jump24.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
page: true
3+
footer: false
4+
---
5+
6+
<script setup>
7+
import Page from './components/PartnerPage.vue'
8+
</script>
9+
10+
<Page partner="jump24" />

ko-KR/src/partners/partners.json

Lines changed: 79 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"url": "https://www.vehikl.com?utm_source=vue_partners_page"
2626
},
2727
"contact": "[email protected]",
28-
"hiring": "www.vehikl.com/jobs/developer",
28+
"hiring": "https://vehikl.com/jobs/developer/",
2929
"platinum": true
3030
},
3131
{
@@ -76,7 +76,7 @@
7676
"region": ["Europe"],
7777
"website": {
7878
"text": "www.monterail.com",
79-
"url": "https://www.monterail.com/?utm_source=vuejs.org&utm_medium=referral&utm_campaign=partners"
79+
"url": "https://www.monterail.com/services/vue-js-development/?utm_source=vuejs.org"
8080
},
8181
"contact": "[email protected]",
8282
"hiring": "https://www.monterail.com/careers?utm_source=vuejs.org&utm_medium=referral&utm_campaign=partner-hiring-link",
@@ -100,24 +100,6 @@
100100
"hiring": "https://www.curotec.com/careers?source=vuejs-partner",
101101
"platinum": true
102102
},
103-
{
104-
"name": "64 Robots",
105-
"logo": "64robots.svg",
106-
"intro": "We're a team of Vue / Nuxt experts creating beautifully designed, cutting edge modern applications. Whether building something new, refactoring an existing project or moving to Vue/Nuxt 3, we'll give you a personal and thoughtful approach to development.",
107-
"description": [
108-
"We specialize in building Laravel APIs, Vue.js 2/3 SPAs, Nuxt.js 2/3 SSR applications, and Flutter mobile applications.",
109-
"We love working with companies of all sizes. We've guided early-stage, funded startups to a successful launch and helped large international companies refactor and rebuild existing products to scale into the future. Whatever your needs, we'll help you make the right technology decisions and build a polished product that will put you on the path to success.",
110-
"We set ourselves apart by our level of involvement in your product. Think of us as an extension of your team. Whether augmenting an existing team or stepping in as de facto CTO to make the technical decisions, we're there for you. We're selective in the products that we take on, as we truly want to believe in our work and do everything we can to make them successful. Your success is our success."
111-
],
112-
"region": ["North America", "Europe", "Africa"],
113-
"proficiencies": ["Vue", "Nuxt", "Laravel", "Flutter", "Node.js"],
114-
"website": {
115-
"text": "64robots.com",
116-
"url": "https://64robots.com/"
117-
},
118-
"contact": "[email protected]",
119-
"platinum": true
120-
},
121103
{
122104
"name": "DevSquad",
123105
"logo": "devsquad.png",
@@ -186,7 +168,7 @@
186168
"logo": "webreinvent.png",
187169
"intro": "WebReinvent is a software development company that provides a range of end-to-end software products, real-time apps, multi-tenant SaaS applications, low latency API & mobile app development services. We have delivered MVP to enterprise-level software globally from startup to MNC. Email us, and let's build your software product.",
188170
"description": [
189-
"WebReinvent is a process-oriented software development company that provides a range of end-to-end software products, real-time apps, multi-tenant SaaS applications, low latency API & mobile apps development services. Our team is well versed with VueJs and its ecosystem. We have delivered MVP to enterprise-level software from startup to MNC. Not only client projects we have developed multiple open-source products which are based on VueJs. We are proud to mention that we are one of the few official Laravel & NuxtJS partners too.",
171+
"WebReinvent is a process-oriented software development company that provides a range of end-to-end software products, real-time apps, multi-tenant SaaS applications, low latency API & mobile apps development services. Our team is well versed with VueJs and its ecosystem. We have delivered MVP to enterprise-level software from startup to MNC. Not only client projects we have developed multiple open-source products which are based on VueJs. We are proud to mention that we are one of the few official Laravel & Nuxt partners too.",
190172
"Our team loves to follow the industry standards, some of which are managing git repo, code review, release deployments via CI/CD (DevOps), automated software testing, maintaining detailed technical documentation, application performance monitoring, etc.",
191173
"Email us, and let's build your software product."
192174
],
@@ -198,5 +180,81 @@
198180
},
199181
"contact": "[email protected]",
200182
"hiring": "https://webreinvent.com/career?utm_source=vuejs.org&utm_medium=website&utm_campaign=partner-hiring-link"
183+
},
184+
{
185+
"name": "Dreamonkey",
186+
"logo": "dreamonkey.png",
187+
"hero": "dreamonkey-hero.png",
188+
"intro": "We are an Italian software house, including international team collaborators, with 8 years of experience in software design and development. We build software from scratch or re-design it and support other companies’ teams, especially for industrial IoT, delivery, finance, medical, automotive and supply chain, working mostly for American and Canadian clients. We are proud sponsors of the Quasar framework and members of its core team.",
189+
"description": [
190+
"Our stack includes Vue, Quasar, Laravel and, when requested, Angular too. We strive to produce high quality, clean and well-documented code, making it rock-solid by means of automatic tests. Our frontend follows the main guidelines of Google Material Design.",
191+
"We are able to lead projects from the very start to their deployment, including requirements analysis, UX/UI design, design assets hand-off, development and setup of CI/CD pipelines on AWS. We can merge with the client’s agile methodology and, when requested, we can take care of project management too with a dedicated professional.",
192+
"We have experience with different project complexity, from startup to enterprise-level. We can provide static UIs, working MPVs, fully operative SPA or mobile apps. We also split our team in order to provide the client just with the specific expertise that is needed, be it development, design or just a feasibility analysis.",
193+
"If you need to integrate new skills in your team, we can structure a training program focusing on development or design topics of your interest and help your employees progress with dedicated lessons."
194+
],
195+
"proficiencies": [
196+
"Vue",
197+
"Quasar",
198+
"Angular",
199+
"Capacitor",
200+
"Laravel",
201+
"Node.js",
202+
"NestJS",
203+
"UX Design",
204+
"AWS"
205+
],
206+
"region": ["Europe", "North America"],
207+
"website": {
208+
"text": "dreamonkey.com",
209+
"url": "https://dreamonkey.com/en/vue-partner"
210+
},
211+
"contact": "[email protected]",
212+
"hiring": "https://dreamonkey.com/en/work-with-us"
213+
},
214+
{
215+
"name": "Jump24",
216+
"logo": "jump24.svg",
217+
"flipLogo": true,
218+
"hero": "jump24-hero.jpg",
219+
"intro": "Hand crafted software, delivered. We work alongside start-ups, enterprises and tech teams creating bespoke web software solutions that will help them grow. Honing our skills since 2013, our strength is our people. We design and build custom applications to the highest standard, so you can reap the benefits.",
220+
"description": [
221+
"Jump24 is a full-circle development studio that brings ideas to life. From our base in the UK, we’ve worked closely over the years with clients in Europe and the United States, including Jamie Oliver, Admiral, InPost and Buffer. With a team of 16 developers, you’ll be in safe hands with us.",
222+
"Long-lasting relationships are our speciality. Whether you’re a startup, enterprise or agency, your story is important to us. We focus on the minute details to help create something that reflects you and your business.",
223+
"We’re a talkative bunch, so to find out even more about us, head to our Twitter and LinkedIn."
224+
],
225+
"proficiencies": ["Vue", "Laravel", "Tailwind", "Inertia", "React"],
226+
"region": ["Europe"],
227+
"website": {
228+
"text": "jump24.co.uk",
229+
"url": "https://jump24.co.uk/vue-specialist/"
230+
},
231+
"contact": "[email protected]",
232+
"hiring": "jump24.co.uk/careers"
233+
},
234+
{
235+
"name": "Epicmax",
236+
"logo": "epicmax.svg",
237+
"hero": "epicmax.png",
238+
"intro": "Epicmax is a team of Vue.js experts with 6 years of experience in building Vue.js interfaces. We bring Vue.js knowledge in front-end development across industries and geographies, serving businesses of different sizes. We have more than 55 completed projects, 45 clients worldwide and 3 Open Source products in our portfolio.",
239+
"description": [
240+
"Epicmax is a Vue.js software development company with over 55 successfully completed projects all over the world and 3 widely acclaimed Open Source products.",
241+
"Since 2017, we’ve helped international clients in over 15 industries, both startups and larger companies, build everything from e-commerce through social media platforms to real-time analytics products.",
242+
"We bring deep Vue.js knowledge necessary to help clients solve the most complex issues for their business: from building Vue.js applications to consulting, code auditing and migration to Vue. We move fast and smoothly integrate into a client’s team for agile and collaborative processes.",
243+
"Epicmax is built around Open Source software - it is a part of our culture and everyone on the team is an active contributor. We’ve created and are maintaining Vuestic UI, Vuestic Admin and Epic Spinners libraries which are completely free for everyone and available on GitHub."
244+
],
245+
"proficiencies": [
246+
"Vue",
247+
"Nuxt",
248+
"TypeScript",
249+
"Tailwind",
250+
"Vuetify",
251+
"Quasar"
252+
],
253+
"region": ["Europe"],
254+
"website": {
255+
"text": "epicmax.co",
256+
"url": "https://epicmax.co/"
257+
},
258+
"contact": "[email protected]"
201259
}
202260
]

0 commit comments

Comments
 (0)