From d7c8603897a8d78b83a4420846581a2e80cb57dd Mon Sep 17 00:00:00 2001 From: Evan You Date: Wed, 2 Oct 2024 22:02:46 +0800 Subject: [PATCH] docs: home page redesign (#18257) Co-authored-by: Simon Le Marchant --- docs/.vitepress/config.ts | 27 +- .../theme/components/AsideSponsors.vue | 2 +- .../.vitepress/theme/components/BlogIndex.vue | 2 +- .../theme/components/HomeSponsors.vue | 70 -- .../landing/1. hero-section/HeroDiagram.vue | 821 ++++++++++++++++++ .../landing/1. hero-section/HeroSection.vue | 133 +++ .../svg-elements/SvgBlueIndicator.vue | 242 ++++++ .../svg-elements/SvgInputs.vue | 65 ++ .../svg-elements/SvgOutputs.vue | 56 ++ .../svg-elements/SvgPinkIndicator.vue | 253 ++++++ .../landing/2. feature-section/FeatureCI.vue | 503 +++++++++++ .../FeatureFlexiblePlugins.vue | 557 ++++++++++++ .../landing/2. feature-section/FeatureHMR.vue | 515 +++++++++++ .../FeatureInstantServerStart.vue | 425 +++++++++ .../FeatureOptimizedBuild.vue | 623 +++++++++++++ .../FeatureRichFeatures.vue | 281 ++++++ .../2. feature-section/FeatureSSRSupport.vue | 540 ++++++++++++ .../2. feature-section/FeatureSection.vue | 319 +++++++ .../2. feature-section/FeatureTypedAPI.vue | 240 +++++ .../2. feature-section/images/css3.svg | 16 + .../landing/2. feature-section/images/js.svg | 9 + .../2. feature-section/images/json.svg | 21 + .../2. feature-section/images/postcss.svg | 8 + .../landing/2. feature-section/images/ts.svg | 10 + .../landing/2. feature-section/images/wa.svg | 9 + .../3. frameworks-section/FrameworkCard.vue | 127 +++ .../FrameworksSection.vue | 411 +++++++++ .../3. frameworks-section/images/analog.svg | 28 + .../3. frameworks-section/images/angular.svg | 1 + .../3. frameworks-section/images/astro.svg | 11 + .../3. frameworks-section/images/laravel.svg | 1 + .../3. frameworks-section/images/marko.svg | 64 ++ .../3. frameworks-section/images/nuxt.svg | 10 + .../images/playwright.svg | 16 + .../3. frameworks-section/images/qwik.svg | 12 + .../3. frameworks-section/images/react.svg | 10 + .../3. frameworks-section/images/redwood.svg | 22 + .../3. frameworks-section/images/remix.svg | 11 + .../3. frameworks-section/images/solid.svg | 35 + .../images/storybook.svg | 16 + .../3. frameworks-section/images/svelte.svg | 11 + .../3. frameworks-section/images/vitest.svg | 12 + .../3. frameworks-section/images/vue.svg | 12 + .../4. community-section/CommunityCard.vue | 122 +++ .../4. community-section/CommunitySection.vue | 147 ++++ .../5. sponsor-section/SponsorSection.vue | 223 +++++ .../landing/5. sponsor-section/voidzero.svg | 11 + .../GetStartedSection.vue | 292 +++++++ .../components/landing/common/SvgNode.vue | 214 +++++ docs/.vitepress/theme/composables/sponsor.ts | 2 +- .../theme/composables/useCardAnimation.ts | 107 +++ .../theme/composables/useSlideIn.ts | 19 + docs/.vitepress/theme/index.ts | 3 +- docs/.vitepress/theme/styles/landing.css | 218 +++++ docs/.vitepress/theme/styles/vars.css | 32 - .../theme/components => _data}/blog.data.ts | 0 docs/images/community/placeholder.jpg | Bin 0 -> 1260 bytes docs/index.md | 91 +- docs/public/_redirects | 2 +- docs/public/github.svg | 5 + docs/public/heart.svg | 137 +++ docs/public/logo-home.svg | 46 + docs/public/noise.png | Bin 0 -> 17857 bytes package.json | 1 + pnpm-lock.yaml | 8 + 65 files changed, 8076 insertions(+), 161 deletions(-) delete mode 100644 docs/.vitepress/theme/components/HomeSponsors.vue create mode 100644 docs/.vitepress/theme/components/landing/1. hero-section/HeroDiagram.vue create mode 100644 docs/.vitepress/theme/components/landing/1. hero-section/HeroSection.vue create mode 100644 docs/.vitepress/theme/components/landing/1. hero-section/svg-elements/SvgBlueIndicator.vue create mode 100644 docs/.vitepress/theme/components/landing/1. hero-section/svg-elements/SvgInputs.vue create mode 100644 docs/.vitepress/theme/components/landing/1. hero-section/svg-elements/SvgOutputs.vue create mode 100644 docs/.vitepress/theme/components/landing/1. hero-section/svg-elements/SvgPinkIndicator.vue create mode 100644 docs/.vitepress/theme/components/landing/2. feature-section/FeatureCI.vue create mode 100644 docs/.vitepress/theme/components/landing/2. feature-section/FeatureFlexiblePlugins.vue create mode 100644 docs/.vitepress/theme/components/landing/2. feature-section/FeatureHMR.vue create mode 100644 docs/.vitepress/theme/components/landing/2. feature-section/FeatureInstantServerStart.vue create mode 100644 docs/.vitepress/theme/components/landing/2. feature-section/FeatureOptimizedBuild.vue create mode 100644 docs/.vitepress/theme/components/landing/2. feature-section/FeatureRichFeatures.vue create mode 100644 docs/.vitepress/theme/components/landing/2. feature-section/FeatureSSRSupport.vue create mode 100644 docs/.vitepress/theme/components/landing/2. feature-section/FeatureSection.vue create mode 100644 docs/.vitepress/theme/components/landing/2. feature-section/FeatureTypedAPI.vue create mode 100644 docs/.vitepress/theme/components/landing/2. feature-section/images/css3.svg create mode 100644 docs/.vitepress/theme/components/landing/2. feature-section/images/js.svg create mode 100644 docs/.vitepress/theme/components/landing/2. feature-section/images/json.svg create mode 100644 docs/.vitepress/theme/components/landing/2. feature-section/images/postcss.svg create mode 100644 docs/.vitepress/theme/components/landing/2. feature-section/images/ts.svg create mode 100644 docs/.vitepress/theme/components/landing/2. feature-section/images/wa.svg create mode 100644 docs/.vitepress/theme/components/landing/3. frameworks-section/FrameworkCard.vue create mode 100644 docs/.vitepress/theme/components/landing/3. frameworks-section/FrameworksSection.vue create mode 100644 docs/.vitepress/theme/components/landing/3. frameworks-section/images/analog.svg create mode 100644 docs/.vitepress/theme/components/landing/3. frameworks-section/images/angular.svg create mode 100644 docs/.vitepress/theme/components/landing/3. frameworks-section/images/astro.svg create mode 100644 docs/.vitepress/theme/components/landing/3. frameworks-section/images/laravel.svg create mode 100644 docs/.vitepress/theme/components/landing/3. frameworks-section/images/marko.svg create mode 100644 docs/.vitepress/theme/components/landing/3. frameworks-section/images/nuxt.svg create mode 100644 docs/.vitepress/theme/components/landing/3. frameworks-section/images/playwright.svg create mode 100644 docs/.vitepress/theme/components/landing/3. frameworks-section/images/qwik.svg create mode 100644 docs/.vitepress/theme/components/landing/3. frameworks-section/images/react.svg create mode 100644 docs/.vitepress/theme/components/landing/3. frameworks-section/images/redwood.svg create mode 100644 docs/.vitepress/theme/components/landing/3. frameworks-section/images/remix.svg create mode 100644 docs/.vitepress/theme/components/landing/3. frameworks-section/images/solid.svg create mode 100644 docs/.vitepress/theme/components/landing/3. frameworks-section/images/storybook.svg create mode 100644 docs/.vitepress/theme/components/landing/3. frameworks-section/images/svelte.svg create mode 100644 docs/.vitepress/theme/components/landing/3. frameworks-section/images/vitest.svg create mode 100644 docs/.vitepress/theme/components/landing/3. frameworks-section/images/vue.svg create mode 100644 docs/.vitepress/theme/components/landing/4. community-section/CommunityCard.vue create mode 100644 docs/.vitepress/theme/components/landing/4. community-section/CommunitySection.vue create mode 100644 docs/.vitepress/theme/components/landing/5. sponsor-section/SponsorSection.vue create mode 100644 docs/.vitepress/theme/components/landing/5. sponsor-section/voidzero.svg create mode 100644 docs/.vitepress/theme/components/landing/6. get-started-section/GetStartedSection.vue create mode 100644 docs/.vitepress/theme/components/landing/common/SvgNode.vue create mode 100644 docs/.vitepress/theme/composables/useCardAnimation.ts create mode 100644 docs/.vitepress/theme/composables/useSlideIn.ts create mode 100644 docs/.vitepress/theme/styles/landing.css rename docs/{.vitepress/theme/components => _data}/blog.data.ts (100%) create mode 100644 docs/images/community/placeholder.jpg create mode 100644 docs/public/github.svg create mode 100644 docs/public/heart.svg create mode 100644 docs/public/logo-home.svg create mode 100644 docs/public/noise.png diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index d3dd5054d..4a6dd49ae 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -77,6 +77,30 @@ export default defineConfig({ 'link', { rel: 'alternate', type: 'application/rss+xml', href: '/blog.rss' }, ], + ['link', { rel: 'preconnect', href: 'https://fonts.googleapis.com' }], + [ + 'link', + { + rel: 'preconnect', + href: 'https://fonts.gstatic.com', + crossorigin: 'true', + }, + ], + [ + 'link', + { + rel: 'preload', + href: 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Manrope:wght@600&family=IBM+Plex+Mono:wght@400&display=swap', + as: 'style', + }, + ], + [ + 'link', + { + rel: 'stylesheet', + href: 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=Manrope:wght@600&family=IBM+Plex+Mono:wght@400&display=swap', + }, + ], ['link', { rel: 'me', href: 'https://m.webtoo.ls/@vite' }], ['meta', { property: 'og:type', content: 'website' }], ['meta', { property: 'og:title', content: ogTitle }], @@ -139,7 +163,8 @@ export default defineConfig({ footer: { message: `Released under the MIT License. (${commitRef})`, - copyright: 'Copyright © 2019-present Evan You & Vite Contributors', + copyright: + 'Copyright © 2019-present Yuxi (Evan) You & Vite Contributors', }, nav: [ diff --git a/docs/.vitepress/theme/components/AsideSponsors.vue b/docs/.vitepress/theme/components/AsideSponsors.vue index 26b72345e..bf8d19653 100644 --- a/docs/.vitepress/theme/components/AsideSponsors.vue +++ b/docs/.vitepress/theme/components/AsideSponsors.vue @@ -23,7 +23,7 @@ const sponsors = computed(() => { href="https://viteconf.org/?utm=vite-sidebar" target="_blank" > - + ViteConf Logo

Building Together

ViteConf 24 - Oct 3

diff --git a/docs/.vitepress/theme/components/BlogIndex.vue b/docs/.vitepress/theme/components/BlogIndex.vue index cddd7c16e..5f77ee193 100644 --- a/docs/.vitepress/theme/components/BlogIndex.vue +++ b/docs/.vitepress/theme/components/BlogIndex.vue @@ -1,5 +1,5 @@ - - - - diff --git a/docs/.vitepress/theme/components/landing/1. hero-section/HeroDiagram.vue b/docs/.vitepress/theme/components/landing/1. hero-section/HeroDiagram.vue new file mode 100644 index 000000000..10bd32fa4 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/1. hero-section/HeroDiagram.vue @@ -0,0 +1,821 @@ + + + + + diff --git a/docs/.vitepress/theme/components/landing/1. hero-section/HeroSection.vue b/docs/.vitepress/theme/components/landing/1. hero-section/HeroSection.vue new file mode 100644 index 000000000..9892f25de --- /dev/null +++ b/docs/.vitepress/theme/components/landing/1. hero-section/HeroSection.vue @@ -0,0 +1,133 @@ + + + + + diff --git a/docs/.vitepress/theme/components/landing/1. hero-section/svg-elements/SvgBlueIndicator.vue b/docs/.vitepress/theme/components/landing/1. hero-section/svg-elements/SvgBlueIndicator.vue new file mode 100644 index 000000000..6f5854f7a --- /dev/null +++ b/docs/.vitepress/theme/components/landing/1. hero-section/svg-elements/SvgBlueIndicator.vue @@ -0,0 +1,242 @@ + + + + + diff --git a/docs/.vitepress/theme/components/landing/1. hero-section/svg-elements/SvgInputs.vue b/docs/.vitepress/theme/components/landing/1. hero-section/svg-elements/SvgInputs.vue new file mode 100644 index 000000000..c4fe4d323 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/1. hero-section/svg-elements/SvgInputs.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/docs/.vitepress/theme/components/landing/1. hero-section/svg-elements/SvgOutputs.vue b/docs/.vitepress/theme/components/landing/1. hero-section/svg-elements/SvgOutputs.vue new file mode 100644 index 000000000..320e99977 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/1. hero-section/svg-elements/SvgOutputs.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/docs/.vitepress/theme/components/landing/1. hero-section/svg-elements/SvgPinkIndicator.vue b/docs/.vitepress/theme/components/landing/1. hero-section/svg-elements/SvgPinkIndicator.vue new file mode 100644 index 000000000..063816b63 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/1. hero-section/svg-elements/SvgPinkIndicator.vue @@ -0,0 +1,253 @@ + + + + + diff --git a/docs/.vitepress/theme/components/landing/2. feature-section/FeatureCI.vue b/docs/.vitepress/theme/components/landing/2. feature-section/FeatureCI.vue new file mode 100644 index 000000000..0b02e148e --- /dev/null +++ b/docs/.vitepress/theme/components/landing/2. feature-section/FeatureCI.vue @@ -0,0 +1,503 @@ + + + + + diff --git a/docs/.vitepress/theme/components/landing/2. feature-section/FeatureFlexiblePlugins.vue b/docs/.vitepress/theme/components/landing/2. feature-section/FeatureFlexiblePlugins.vue new file mode 100644 index 000000000..e8a3e32ae --- /dev/null +++ b/docs/.vitepress/theme/components/landing/2. feature-section/FeatureFlexiblePlugins.vue @@ -0,0 +1,557 @@ + + + + + diff --git a/docs/.vitepress/theme/components/landing/2. feature-section/FeatureHMR.vue b/docs/.vitepress/theme/components/landing/2. feature-section/FeatureHMR.vue new file mode 100644 index 000000000..938060602 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/2. feature-section/FeatureHMR.vue @@ -0,0 +1,515 @@ + + + + + diff --git a/docs/.vitepress/theme/components/landing/2. feature-section/FeatureInstantServerStart.vue b/docs/.vitepress/theme/components/landing/2. feature-section/FeatureInstantServerStart.vue new file mode 100644 index 000000000..5e44b3bb7 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/2. feature-section/FeatureInstantServerStart.vue @@ -0,0 +1,425 @@ + + + + + diff --git a/docs/.vitepress/theme/components/landing/2. feature-section/FeatureOptimizedBuild.vue b/docs/.vitepress/theme/components/landing/2. feature-section/FeatureOptimizedBuild.vue new file mode 100644 index 000000000..fc38a432b --- /dev/null +++ b/docs/.vitepress/theme/components/landing/2. feature-section/FeatureOptimizedBuild.vue @@ -0,0 +1,623 @@ + + + + + diff --git a/docs/.vitepress/theme/components/landing/2. feature-section/FeatureRichFeatures.vue b/docs/.vitepress/theme/components/landing/2. feature-section/FeatureRichFeatures.vue new file mode 100644 index 000000000..b2d52f886 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/2. feature-section/FeatureRichFeatures.vue @@ -0,0 +1,281 @@ + + + + + diff --git a/docs/.vitepress/theme/components/landing/2. feature-section/FeatureSSRSupport.vue b/docs/.vitepress/theme/components/landing/2. feature-section/FeatureSSRSupport.vue new file mode 100644 index 000000000..8baaf18c8 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/2. feature-section/FeatureSSRSupport.vue @@ -0,0 +1,540 @@ + + + + + diff --git a/docs/.vitepress/theme/components/landing/2. feature-section/FeatureSection.vue b/docs/.vitepress/theme/components/landing/2. feature-section/FeatureSection.vue new file mode 100644 index 000000000..b503ba3e9 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/2. feature-section/FeatureSection.vue @@ -0,0 +1,319 @@ + + + + + diff --git a/docs/.vitepress/theme/components/landing/2. feature-section/FeatureTypedAPI.vue b/docs/.vitepress/theme/components/landing/2. feature-section/FeatureTypedAPI.vue new file mode 100644 index 000000000..308df28a6 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/2. feature-section/FeatureTypedAPI.vue @@ -0,0 +1,240 @@ + + + + + diff --git a/docs/.vitepress/theme/components/landing/2. feature-section/images/css3.svg b/docs/.vitepress/theme/components/landing/2. feature-section/images/css3.svg new file mode 100644 index 000000000..afa66d986 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/2. feature-section/images/css3.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/.vitepress/theme/components/landing/2. feature-section/images/js.svg b/docs/.vitepress/theme/components/landing/2. feature-section/images/js.svg new file mode 100644 index 000000000..59a037516 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/2. feature-section/images/js.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/.vitepress/theme/components/landing/2. feature-section/images/json.svg b/docs/.vitepress/theme/components/landing/2. feature-section/images/json.svg new file mode 100644 index 000000000..20d86ed7f --- /dev/null +++ b/docs/.vitepress/theme/components/landing/2. feature-section/images/json.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/.vitepress/theme/components/landing/2. feature-section/images/postcss.svg b/docs/.vitepress/theme/components/landing/2. feature-section/images/postcss.svg new file mode 100644 index 000000000..5251081b6 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/2. feature-section/images/postcss.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/.vitepress/theme/components/landing/2. feature-section/images/ts.svg b/docs/.vitepress/theme/components/landing/2. feature-section/images/ts.svg new file mode 100644 index 000000000..223587b2d --- /dev/null +++ b/docs/.vitepress/theme/components/landing/2. feature-section/images/ts.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/docs/.vitepress/theme/components/landing/2. feature-section/images/wa.svg b/docs/.vitepress/theme/components/landing/2. feature-section/images/wa.svg new file mode 100644 index 000000000..8e6f976d1 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/2. feature-section/images/wa.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/.vitepress/theme/components/landing/3. frameworks-section/FrameworkCard.vue b/docs/.vitepress/theme/components/landing/3. frameworks-section/FrameworkCard.vue new file mode 100644 index 000000000..f154f7abd --- /dev/null +++ b/docs/.vitepress/theme/components/landing/3. frameworks-section/FrameworkCard.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/docs/.vitepress/theme/components/landing/3. frameworks-section/FrameworksSection.vue b/docs/.vitepress/theme/components/landing/3. frameworks-section/FrameworksSection.vue new file mode 100644 index 000000000..8ddab8a1c --- /dev/null +++ b/docs/.vitepress/theme/components/landing/3. frameworks-section/FrameworksSection.vue @@ -0,0 +1,411 @@ + + + + + diff --git a/docs/.vitepress/theme/components/landing/3. frameworks-section/images/analog.svg b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/analog.svg new file mode 100644 index 000000000..2e7fe7d6c --- /dev/null +++ b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/analog.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/.vitepress/theme/components/landing/3. frameworks-section/images/angular.svg b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/angular.svg new file mode 100644 index 000000000..b6eb20ab8 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/angular.svg @@ -0,0 +1 @@ + diff --git a/docs/.vitepress/theme/components/landing/3. frameworks-section/images/astro.svg b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/astro.svg new file mode 100644 index 000000000..bbe512ed2 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/astro.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/.vitepress/theme/components/landing/3. frameworks-section/images/laravel.svg b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/laravel.svg new file mode 100644 index 000000000..a8d8fb19f --- /dev/null +++ b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/laravel.svg @@ -0,0 +1 @@ + diff --git a/docs/.vitepress/theme/components/landing/3. frameworks-section/images/marko.svg b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/marko.svg new file mode 100644 index 000000000..44c26273f --- /dev/null +++ b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/marko.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/.vitepress/theme/components/landing/3. frameworks-section/images/nuxt.svg b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/nuxt.svg new file mode 100644 index 000000000..fb2de2c62 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/nuxt.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/docs/.vitepress/theme/components/landing/3. frameworks-section/images/playwright.svg b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/playwright.svg new file mode 100644 index 000000000..63ef7c4c2 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/playwright.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/.vitepress/theme/components/landing/3. frameworks-section/images/qwik.svg b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/qwik.svg new file mode 100644 index 000000000..606a2b7c6 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/qwik.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/docs/.vitepress/theme/components/landing/3. frameworks-section/images/react.svg b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/react.svg new file mode 100644 index 000000000..c4fcecce0 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/react.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/docs/.vitepress/theme/components/landing/3. frameworks-section/images/redwood.svg b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/redwood.svg new file mode 100644 index 000000000..2d6117353 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/redwood.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/.vitepress/theme/components/landing/3. frameworks-section/images/remix.svg b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/remix.svg new file mode 100644 index 000000000..a94570619 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/remix.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/.vitepress/theme/components/landing/3. frameworks-section/images/solid.svg b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/solid.svg new file mode 100644 index 000000000..1cf619e56 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/solid.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/.vitepress/theme/components/landing/3. frameworks-section/images/storybook.svg b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/storybook.svg new file mode 100644 index 000000000..43176b924 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/storybook.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/docs/.vitepress/theme/components/landing/3. frameworks-section/images/svelte.svg b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/svelte.svg new file mode 100644 index 000000000..62309a1d1 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/svelte.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/.vitepress/theme/components/landing/3. frameworks-section/images/vitest.svg b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/vitest.svg new file mode 100644 index 000000000..c9d5fd3e7 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/vitest.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/docs/.vitepress/theme/components/landing/3. frameworks-section/images/vue.svg b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/vue.svg new file mode 100644 index 000000000..b29e1a423 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/3. frameworks-section/images/vue.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/docs/.vitepress/theme/components/landing/4. community-section/CommunityCard.vue b/docs/.vitepress/theme/components/landing/4. community-section/CommunityCard.vue new file mode 100644 index 000000000..161c9738e --- /dev/null +++ b/docs/.vitepress/theme/components/landing/4. community-section/CommunityCard.vue @@ -0,0 +1,122 @@ + + + + + diff --git a/docs/.vitepress/theme/components/landing/4. community-section/CommunitySection.vue b/docs/.vitepress/theme/components/landing/4. community-section/CommunitySection.vue new file mode 100644 index 000000000..5ca50f78a --- /dev/null +++ b/docs/.vitepress/theme/components/landing/4. community-section/CommunitySection.vue @@ -0,0 +1,147 @@ + + + + + diff --git a/docs/.vitepress/theme/components/landing/5. sponsor-section/SponsorSection.vue b/docs/.vitepress/theme/components/landing/5. sponsor-section/SponsorSection.vue new file mode 100644 index 000000000..5778ff16f --- /dev/null +++ b/docs/.vitepress/theme/components/landing/5. sponsor-section/SponsorSection.vue @@ -0,0 +1,223 @@ + + + + + diff --git a/docs/.vitepress/theme/components/landing/5. sponsor-section/voidzero.svg b/docs/.vitepress/theme/components/landing/5. sponsor-section/voidzero.svg new file mode 100644 index 000000000..99cb8182e --- /dev/null +++ b/docs/.vitepress/theme/components/landing/5. sponsor-section/voidzero.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs/.vitepress/theme/components/landing/6. get-started-section/GetStartedSection.vue b/docs/.vitepress/theme/components/landing/6. get-started-section/GetStartedSection.vue new file mode 100644 index 000000000..cca43da69 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/6. get-started-section/GetStartedSection.vue @@ -0,0 +1,292 @@ + + + diff --git a/docs/.vitepress/theme/components/landing/common/SvgNode.vue b/docs/.vitepress/theme/components/landing/common/SvgNode.vue new file mode 100644 index 000000000..8ac6c76b7 --- /dev/null +++ b/docs/.vitepress/theme/components/landing/common/SvgNode.vue @@ -0,0 +1,214 @@ + + + + + diff --git a/docs/.vitepress/theme/composables/sponsor.ts b/docs/.vitepress/theme/composables/sponsor.ts index aa31d46d1..3f3ab8694 100644 --- a/docs/.vitepress/theme/composables/sponsor.ts +++ b/docs/.vitepress/theme/composables/sponsor.ts @@ -99,7 +99,7 @@ export function useSponsor() { function mapSponsors(sponsors: Sponsors) { return [ { - tier: 'Special Sponsors', + tier: 'in partnership with', size: 'big', items: viteSponsors['special'], }, diff --git a/docs/.vitepress/theme/composables/useCardAnimation.ts b/docs/.vitepress/theme/composables/useCardAnimation.ts new file mode 100644 index 000000000..2a6c7c83c --- /dev/null +++ b/docs/.vitepress/theme/composables/useCardAnimation.ts @@ -0,0 +1,107 @@ +import { type Ref, onMounted, onUnmounted, ref } from 'vue' +import { gsap } from 'gsap' +import { ScrollTrigger } from 'gsap/dist/ScrollTrigger' + +gsap.registerPlugin(ScrollTrigger) + +/** + * A custom hook for animating a card element. + * + * @param {HTMLElement | string} el - The element or selector for the element to be animated + * @param {() => GSAPTimeline | null} animation - A function that returns a GSAP timeline for the animation + * @param {object} options - Options for the animation + */ +export function useCardAnimation( + el: HTMLElement | string, + animation: (() => GSAPTimeline) | undefined = undefined, + options?: { + /** + * A flag to indicate whether the animation should only run once, and not reset once complete. + */ + once?: boolean + }, +) { + /** + * The GSAP timeline for this animation. + */ + let timeline: GSAPTimeline | null + + /** + * A flag to indicate whether the card is currently active or not. + * May be inactive while the animation is still finishing up, due to CSS transitions. + */ + const isCardActive: Ref = ref(false) + + /** + * An internal flag to prevent multiple animations from running at the same time. + */ + const isAnimationRunning: Ref = ref(false) + + /** + * Starts the card's animation, managing the lifecycle internally to prevent multiple animations from running at the same time. + */ + const startAnimation = () => { + if (isAnimationRunning.value) { + return + } else { + isAnimationRunning.value = true + isCardActive.value = true + } + if (timeline) { + timeline.kill() + } + if (!animation) { + return + } + timeline = gsap.timeline({ + onComplete: () => { + if (!options?.once) { + isCardActive.value = false + setTimeout(() => { + isAnimationRunning.value = false + }, 3000) + } + }, + }) + timeline.add(animation()) + } + + /** + * The ScrollTrigger instance for this card. + */ + let scrollTriggerInstance: ScrollTrigger | null = null + + /** + * Trigger's the card's animation automatically on mobile devices (no hover method) + */ + onMounted(() => { + if (window.innerWidth < 768) { + scrollTriggerInstance = ScrollTrigger.create({ + trigger: el, + start: 'top 60%', + onEnter: () => { + startAnimation() + }, + }) + } + }) + + /** + * Remove the ScrollTrigger and GSAP timeline instances when the component is unmounted + */ + onUnmounted(() => { + if (scrollTriggerInstance) { + scrollTriggerInstance.kill() + scrollTriggerInstance = null + } + if (timeline) { + timeline.kill() + timeline = null + } + }) + + return { + startAnimation, + isCardActive, + } +} diff --git a/docs/.vitepress/theme/composables/useSlideIn.ts b/docs/.vitepress/theme/composables/useSlideIn.ts new file mode 100644 index 000000000..e41cd8983 --- /dev/null +++ b/docs/.vitepress/theme/composables/useSlideIn.ts @@ -0,0 +1,19 @@ +import { nextTick, onMounted } from 'vue' +import { gsap } from 'gsap' + +export function useSlideIn(el: HTMLElement | string) { + onMounted(async () => { + await nextTick(() => { + gsap.to(el, { + x: 0, + duration: 1, + ease: 'power3.out', + scrollTrigger: { + trigger: el, + start: 'top 100%', + once: true, + }, + }) + }) + }) +} diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index d2303b783..7ce4bafe5 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -4,7 +4,7 @@ import DefaultTheme from 'vitepress/theme' import TwoslashFloatingVue from '@shikijs/vitepress-twoslash/client' import '@shikijs/vitepress-twoslash/style.css' import './styles/vars.css' -import HomeSponsors from './components/HomeSponsors.vue' +import './styles/landing.css' import AsideSponsors from './components/AsideSponsors.vue' import SvgImage from './components/SvgImage.vue' import 'virtual:group-icons.css' @@ -13,7 +13,6 @@ export default { extends: DefaultTheme, Layout() { return h(DefaultTheme.Layout, null, { - 'home-features-after': () => h(HomeSponsors), 'aside-ads-before': () => h(AsideSponsors), }) }, diff --git a/docs/.vitepress/theme/styles/landing.css b/docs/.vitepress/theme/styles/landing.css new file mode 100644 index 000000000..c3582f209 --- /dev/null +++ b/docs/.vitepress/theme/styles/landing.css @@ -0,0 +1,218 @@ +/* /////////////////////// */ +/* Landing Page CSS Styles */ +/* /////////////////////// */ + +html:has(.landing) { + background-color: #101010; + --vp-c-bg: #101010; + + body { + background-color: #101010; + } +} + +.landing { + overflow-x: hidden; + background-color: #101010; + + * { + -webkit-font-smoothing: antialiased !important; + -moz-osx-font-smoothing: grayscale !important; + text-rendering: optimizeLegibility !important; + } + + /* /////////////////// */ + /* VitePress Overrides */ + /* /////////////////// */ + + .VPNavBar, + .VPNavBar:not(.top) { + background: transparent !important; + + @media (min-width: 768px) { + backdrop-filter: blur(10px); + background: rgba(15, 15, 15, 0.8) !important; + border-bottom: 1px solid #262626 !important; + } + + .content-body { + background: none !important; + } + } + + .VPFooter { + border-top: 1px solid #262626 !important; + background: radial-gradient(circle at top center, #0f151a 30%, #000000 80%); + } + + .VPHome { + padding-bottom: 0 !important; + margin-bottom: 0 !important; + } + + /* /////////////// */ + /* Force Dark Mode */ + /* /////////////// */ + + .VPNavBarAppearance { + display: none; + } + + .VPNavScreenAppearance { + visibility: hidden; + } + + .social-links::before { + margin-left: 0 !important; + } + + /* ////////// */ + /* Typography */ + /* ////////// */ + + h1 { + text-align: center; + font-family: 'Manrope', sans-serif; + font-style: normal; + font-weight: 600; + background: linear-gradient( + 180deg, + #fff 0%, + rgba(255, 255, 255, 0.31) 100% + ); + background-clip: text; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + text-wrap: balance; + cursor: default; + font-size: 44px; + line-height: 120%; + letter-spacing: -0.88px; + padding: 0 20px; + margin-bottom: 15px; + + @media (min-width: 768px) { + font-size: 64px; + line-height: 81px; + letter-spacing: -1.28px; + } + + @media (min-width: 1025px) { + font-size: 72px; + letter-spacing: -1.44px; + padding-bottom: 8px; /* Fix for hanging descender on "g" in "tooling" */ + } + } + + h2 { + display: block; + width: fit-content; + font-family: Manrope, sans-serif; + font-size: 32px; + font-style: normal; + font-weight: 600; + line-height: 120%; + letter-spacing: -0.64px; + cursor: default; + text-wrap: balance; + padding: 0 20px; + + @media (min-width: 768px) { + font-size: 44px; + letter-spacing: -0.88px; + } + } + + h3 { + color: #a9a9a9; + text-align: center; + font-family: Inter, sans-serif; + font-size: 20px; + font-style: normal; + font-weight: 400; + line-height: 150%; + letter-spacing: -0.4px; + max-width: 500px; + text-wrap: balance; + cursor: default; + margin-bottom: 25px; + padding: 0 20px; + } + + /* /////// */ + /* Buttons */ + /* /////// */ + + .btn { + display: flex; + padding: 10px 18px; + justify-content: center; + align-items: center; + gap: 8px; + border-radius: 8px; + color: #fff; + font-family: Inter, sans-serif; + font-size: 16px; + font-style: normal; + font-weight: 500; + line-height: 24px; + text-shadow: 0 0 2px rgba(0, 0, 0, 0.2); + transition: all 0.2s ease-in-out; + width: fit-content; + + &:hover { + transform: translate3d(0, -2px, 0); + } + + &.btn--primary { + position: relative; + background: radial-gradient( + 141.42% 141.42% at 100% 0%, + rgba(255, 255, 255, 0.4) 0%, + rgba(255, 255, 255, 0) 100% + ), + radial-gradient( + 140.35% 140.35% at 100% 94.74%, + #bd34fe 0%, + rgba(189, 52, 254, 0) 100% + ), + radial-gradient( + 89.94% 89.94% at 18.42% 15.79%, + #41d1ff 0%, + rgba(65, 209, 255, 0) 100% + ); + box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.75) inset; + + &:hover { + background: radial-gradient( + 141.42% 141.42% at 100% 0%, + rgba(255, 255, 255, 0.5) 0%, + rgba(255, 255, 255, 0) 100% + ), + radial-gradient( + 140.35% 140.35% at 100% 94.74%, + #bd34fe 0%, + rgba(189, 52, 254, 0) 100% + ), + radial-gradient( + 89.94% 89.94% at 18.42% 15.79%, + #41d1ff 0%, + rgba(65, 209, 255, 0) 100% + ); + box-shadow: 0 1.5px 0 0 rgba(255, 255, 255, 0.8) inset; + } + } + + &.btn--outline { + border: 1px solid rgba(255, 255, 255, 0.2); + + &:hover { + border: 1px solid rgba(255, 255, 255, 0.4); + } + } + + &.btn--rounded { + border-radius: 100px; + } + } +} diff --git a/docs/.vitepress/theme/styles/vars.css b/docs/.vitepress/theme/styles/vars.css index 645a1e922..189cf20cb 100644 --- a/docs/.vitepress/theme/styles/vars.css +++ b/docs/.vitepress/theme/styles/vars.css @@ -28,38 +28,6 @@ --vp-button-brand-active-bg: var(--vp-button-brand-bg); } -/** - * Component: Home - * -------------------------------------------------------------------------- */ - -:root { - --vp-home-hero-name-color: transparent; - --vp-home-hero-name-background: -webkit-linear-gradient( - 120deg, - #bd34fe 30%, - #41d1ff - ); - - --vp-home-hero-image-background-image: linear-gradient( - -45deg, - #bd34fe 50%, - #47caff 50% - ); - --vp-home-hero-image-filter: blur(40px); -} - -@media (min-width: 640px) { - :root { - --vp-home-hero-image-filter: blur(56px); - } -} - -@media (min-width: 960px) { - :root { - --vp-home-hero-image-filter: blur(72px); - } -} - /** * Component: Custom Block * -------------------------------------------------------------------------- */ diff --git a/docs/.vitepress/theme/components/blog.data.ts b/docs/_data/blog.data.ts similarity index 100% rename from docs/.vitepress/theme/components/blog.data.ts rename to docs/_data/blog.data.ts diff --git a/docs/images/community/placeholder.jpg b/docs/images/community/placeholder.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5bd0f69a12302af287bf525c072afb07e3a2c087 GIT binary patch literal 1260 zcmex=_1P|rX?qqI0P zFI~aY%U!`Mz|~!$%)&rZN1?DZF(URRSiuIkRgoh z?Ce||T*6#j!WvRyQW_+K{|6WZIT#EW444^}7?=bZnFSgDA7PMZU|?hgdKKhbC}3n_ z2D+D>gOiIJs9>uA0}~@NGZPClD=P~NP<1U(o`FS>RY=j$kxe)-kzJ`!#HexNLJno8 zjR!@8E`CrkPAY2R|V^&07y2J$~}^+4C1KUw!=a`ODXD-+%o41@ado12e>1aG#<1 zOAzQUCKeWE7Iu)o7@5j}m|2j8Rnd@5$T5&Tu~1masF6d&Y2w0-2RW6EgFc8R6K zQ!#m{`Vr(cu+NC|SQA-3gL@3&uUiZ}%#6UuV-{qvXZSUNC+OKEhuhMp57fw{FUx-3 zFIRE+s2y+T^Q&8{zg|hzeR`O8Pa4Z{pLa6rci2xgocFqRZDiz`i(YRo>4!Sb3H8nw zdU;(a_cKq*9Hzs~Ke~RVd;hqjpI-9OZeIKudy{XG&tEP7lfC;wjpKrNmw1Q0p9Obj zNKANDTee;KX8`+!>PCi@CzKT~w-(Q1+P!nnhfk(=j9gACE9Fbv*(1}R=kZ5-Nfblf zt3x06P0e0c5gxd4Uz6p-itgO{z!R2lFKvr?v`EKu0sl-JTeHS``)@iMZr`pHs`QxX zP;`7paF6io&_BKp3m3jpI(IC)f1}6IE3->;dmN6%2n6qBDVI2IDRp0R%UtI}Rd1rc z^)7kosFEH!WB%+y%VTD}%O#(y+ghyG%I~(sg8al+>A%wv89mcJg< znJ^x&xPJJ0oX-7kzjvy{E)Dej89KYc;ceH`lpm5yIj@Dxd-(JgTkPj^b>FXVvkG5Z z!F11xi}#qeUj3LgB3R<4=X9!`)p+>zNI#qt#{ec ze1?;;3wFLLaE;zIH@Rr--@AwJ@NM0mzhvoYlj?OzS~t#2WUzRCZO8m>VZG)hcl{ -import { onMounted } from 'vue' - -onMounted(() => { - const urlParams = new URLSearchParams(window.location.search) - if (urlParams.get('uwu') != null) { - const img = document.querySelector('.VPHero .VPImage.image-src') - img.src = '/logo-uwu.png' - img.alt = 'Vite Kawaii Logo by @icarusgkx' - } -}) +import Hero from '.vitepress/theme/components/landing/1. hero-section/HeroSection.vue' +import FeatureSection from './.vitepress/theme/components/landing/2. feature-section/FeatureSection.vue' +import FrameworksSection from './.vitepress/theme/components/landing/3. frameworks-section/FrameworksSection.vue' +import CommunitySection from './.vitepress/theme/components/landing/4. community-section/CommunitySection.vue' +import SponsorSection from './.vitepress/theme/components/landing/5. sponsor-section/SponsorSection.vue' +import GetStartedSection from '.vitepress/theme/components/landing/6. get-started-section/GetStartedSection.vue' +import FeatureInstantServerStart from './.vitepress/theme/components/landing/2. feature-section/FeatureInstantServerStart.vue' +import FeatureHMR from './.vitepress/theme/components/landing/2. feature-section/FeatureHMR.vue' +import FeatureRichFeatures from './.vitepress/theme/components/landing/2. feature-section/FeatureRichFeatures.vue' +import FeatureOptimizedBuild from './.vitepress/theme/components/landing/2. feature-section/FeatureOptimizedBuild.vue' +import FeatureFlexiblePlugins from './.vitepress/theme/components/landing/2. feature-section/FeatureFlexiblePlugins.vue' +import FeatureTypedAPI from './.vitepress/theme/components/landing/2. feature-section/FeatureTypedAPI.vue' +import FeatureSSRSupport from './.vitepress/theme/components/landing/2. feature-section/FeatureSSRSupport.vue' +import FeatureCI from './.vitepress/theme/components/landing/2. feature-section/FeatureCI.vue' + +
+ + + + + + + + + + + + + + + + + +
diff --git a/docs/public/_redirects b/docs/public/_redirects index 16bba13ba..4dc8a830e 100644 --- a/docs/public/_redirects +++ b/docs/public/_redirects @@ -1,5 +1,5 @@ # temporary, we'll flip this around some day -https://vite.dev/* https://vitejs.dev/:splat 302! +https://vitejs.dev/* https://vite.dev/:splat 301! /guide/api-vite-runtime /guide/api-environment 302 /guide/api-vite-runtime.html /guide/api-environment 302 diff --git a/docs/public/github.svg b/docs/public/github.svg new file mode 100644 index 000000000..a1e44f332 --- /dev/null +++ b/docs/public/github.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/public/heart.svg b/docs/public/heart.svg new file mode 100644 index 000000000..142e518c1 --- /dev/null +++ b/docs/public/heart.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/public/logo-home.svg b/docs/public/logo-home.svg new file mode 100644 index 000000000..0942f44db --- /dev/null +++ b/docs/public/logo-home.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/public/noise.png b/docs/public/noise.png new file mode 100644 index 0000000000000000000000000000000000000000..fd9a7cf224a8e55e7a446a25d87aca58ae908083 GIT binary patch literal 17857 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 literal 0 HcmV?d00001 diff --git a/package.json b/package.json index c69524176..feb60139d 100644 --- a/package.json +++ b/package.json @@ -63,6 +63,7 @@ "eslint-plugin-regexp": "^2.6.0", "execa": "^9.4.0", "globals": "^15.9.0", + "gsap": "^3.12.4", "lint-staged": "^15.2.10", "picocolors": "^1.1.0", "playwright-chromium": "^1.47.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3082a1256..6c6692690 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -94,6 +94,9 @@ importers: globals: specifier: ^15.9.0 version: 15.9.0 + gsap: + specifier: ^3.12.4 + version: 3.12.5 lint-staged: specifier: ^15.2.10 version: 15.2.10 @@ -5000,6 +5003,9 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + gsap@3.12.5: + resolution: {integrity: sha512-srBfnk4n+Oe/ZnMIOXt3gT605BX9x5+rh/prT2F1SsNJsU1XuMiP0E2aptW481OnonOGACZWBqseH5Z7csHxhQ==} + handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} engines: {node: '>=0.4.7'} @@ -10769,6 +10775,8 @@ snapshots: graphemer@1.4.0: {} + gsap@3.12.5: {} + handlebars@4.7.8: dependencies: minimist: 1.2.8