Răsfoiți Sursa

feat(docs): Incorporate landing page in docs website, styling

Michael Bromley 7 ani în urmă
părinte
comite
5270af78af

+ 1 - 0
.gitignore

@@ -394,3 +394,4 @@ server/dist
 server/test-emails
 server/src/email/preview/output
 docs/resources/_gen/*
+docs/static/main.js

+ 0 - 60
docs/assets/_markdown.scss

@@ -1,60 +0,0 @@
-@import 'variables';
-
-$block-border-radius: 0.15rem;
-
-.markdown {
-  line-height: 1.7;
-
-  > :first-child {
-    margin-top: 0;
-    line-height: 1em;
-  }
-
-  h1, h2, h3, h4, h5 {
-    font-weight: 400;
-    line-height: 1.25;
-  }
-
-  b, optgroup, strong {
-    font-weight: 700;
-  }
-  
-  a {
-    text-decoration: none;
-
-    &:hover {
-      text-decoration: underline;
-    }
-  }
-
-  code {
-    font-family: 'Oxygen Mono', monospace;
-  }
-
-  p code {
-    padding: 0 $padding-4;
-    background: $gray-100;
-    border-radius: $block-border-radius;
-  }
-
-  pre {
-    padding: $padding-16;
-    background: $gray-100;
-    border-radius: $block-border-radius;
-    font-size: $font-size-14;
-    overflow-x: auto;
-  }
-
-  blockquote {
-    border-left: $padding-1*2 solid $gray-300;
-    margin: 0;
-    padding: $padding-1 $padding-16;
-
-    :first-child { margin-top: 0; }
-    :last-child { margin-bottom: 0; }
-  }
-
-  table tr td {
-    padding: $padding-8;
-  }
-}

+ 0 - 49
docs/assets/_utils.scss

@@ -1,49 +0,0 @@
-.flex {
-  display: flex;
-}
-
-.justify-start {
-  justify-content: flex-start;
-}
-
-.justify-end {
-  justify-content: flex-end;
-}
-
-.justify-center {
-  justify-content: center;
-}
-
-.justify-between {
-  justify-content: space-between;
-}
-
-.align-center {
-  align-items: center;
-}
-
-.mx-auto {
-  margin: 0 auto;
-}
-
-.hide {
-  display: none;
-}
-
-@mixin fixed {
-  position: fixed;
-  top: 0;
-  bottom: 0;
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-
-@mixin dark-links {
-  a {
-    color: $nav-link-color;
-  }
-
-  a.active {
-    color: $color-link;
-  }
-}

+ 0 - 205
docs/assets/book.scss

@@ -1,205 +0,0 @@
-@import "variables";
-@import "markdown";
-@import "utils";
-
-html {
-  font-size: $font-size-base;
-  letter-spacing: 0.33px;
-  scroll-behavior: smooth;
-}
-
-html,
-body {
-  min-width: $body-min-width;
-  overflow-x: hidden;
-}
-
-body {
-  color: $body-font-color;
-  background: $body-background;
-
-  font-family: "Oxygen", sans-serif;
-  font-weight: $body-font-weight;
-
-  text-rendering: optimizeLegibility;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-
-  box-sizing: border-box;
-  * {
-    box-sizing: inherit;
-  }
-}
-
-h1,
-h2,
-h3,
-h4,
-h5 {
-  font-weight: 400;
-}
-
-a {
-  text-decoration: none;
-  color: $color-link;
-
-  &:visited {
-    color: $color-visited-link;
-  }
-}
-
-img {
-  vertical-align: middle;
-}
-
-aside nav ul {
-  padding: 0;
-  margin: 0;
-  list-style: none;
-
-  li {
-    margin: 1em 0;
-  }
-
-  a {
-    display: block;
-  }
-
-  a:hover {
-    opacity: .5;
-  }
-
-  ul {
-    padding-left: $padding-16;
-  }
-}
-
-ul.pagination {
-  display: flex;
-  justify-content: center;
-
-  .page-item a {
-    padding: $padding-16;
-  }
-}
-
-.container {
-  min-width: $container-min-width;
-  max-width: $container-max-width;
-  margin: 0 auto;
-}
-
-.book-brand {
-  margin-top: 0;
-}
-
-.book-menu {
-  flex: 0 0 $menu-width;
-  font-size: $font-size-14;
-
-  nav {
-    width: $menu-width;
-    padding: $padding-16;
-
-    @include fixed;
-  }
-
-  @include dark-links;
-}
-
-.book-page {
-  min-width: $body-min-width;
-  padding: $padding-16;
-}
-
-.book-header {
-  margin-bottom: $padding-16;
-  display: none;
-}
-
-.book-toc {
-  flex: 0 0 $toc-width;
-  font-size: $font-size-12;
-
-  nav {
-    width: $toc-width;
-    padding: $padding-16;
-
-    @include fixed;
-  }
-
-  nav > ul > li {
-    margin: 0;
-  }
-}
-
-.book-git-footer {
-  display: flex;
-  margin-top: $padding-16;
-  font-size: $font-size-14;
-  align-items: baseline;
-
-  img {
-    width: $font-size-14;
-    vertical-align: bottom;
-  }
-}
-
-.book-posts {
-  min-width: $body-min-width;
-  max-width: $sm-breakpoint;
-  padding: $padding-16;
-
-  article {
-    padding-bottom: $padding-16;
-  }
-}
-
-// Responsive styles
-aside nav,
-.book-page,
-.markdown {
-  transition: 0.2s ease-in-out;
-  transition-property: transform, margin-left, opacity;
-  will-change: transform, margin-left;
-}
-
-@media screen and (max-width: $md-breakpoint) {
-  .book-toc {
-    display: none;
-  }
-}
-
-@media screen and (max-width: $sm-breakpoint) {
-  .book-menu {
-    margin-left: -$menu-width;
-  }
-
-  .book-header {
-    display: flex;
-  }
-
-  #menu-control:checked + main {
-    .book-menu nav,
-    .book-page {
-      transform: translateX($menu-width);
-    }
-
-    .book-header label {
-      transform: rotate(90deg);
-    }
-
-    .markdown {
-      opacity: 0.25;
-    }
-  }
-}
-
-// Extra space for big screens
-@media screen and (min-width: $container-max-width) {
-  .book-page,
-  .book-menu nav,
-  .book-toc nav {
-    padding: $padding-16 * 2 $padding-16;
-  }
-}

+ 13 - 0
docs/assets/scripts/main.ts

@@ -0,0 +1,13 @@
+
+document.addEventListener('DOMContentLoaded', () => {
+    const topBar = document.querySelector('.top-bar');
+    if (topBar) {
+        window.addEventListener('scroll', (e) => {
+            if (window.scrollY === 0) {
+                topBar.classList.remove('floating');
+            } else {
+                topBar.classList.add('floating');
+            }
+        });
+    }
+}, false);

+ 160 - 0
docs/assets/styles/_landing-page.scss

@@ -0,0 +1,160 @@
+@import "variables";
+
+.hero a:link, .hero a:visited {
+  color: #d4f5ff;
+  text-decoration: none;
+}
+.hero a:hover {
+  color: #fafbff;
+}
+.hero {
+  padding: 10px;
+  text-align: center;
+  background: #1c1c1c;
+  background-image: url("/header-bg.png");
+  background-attachment: fixed;
+}
+.logo {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  img {
+    width: 100%;
+    max-width: 100px;
+    height: 100%;
+    margin-right: 30px;
+  }
+  h1 {
+    margin: 0;
+    color: $brand-color;
+    font-size: 3em;
+    margin-bottom: 15px;
+    font-family: 'Didact Gothic', sans-serif;
+  }
+}
+.subhead {
+  font-size: 1em;
+  color: #74aec3;
+  max-width: 800px;
+  margin: auto;
+}
+.top-header {
+  display: flex;
+  align-items: center;
+  flex-direction: column;
+}
+.content {
+  padding: 20px;
+  max-width: 800px;
+  margin: auto;
+  color: #393939;
+
+  a:link, a:visited {
+    color: darken($brand-color, 20%);
+  }
+  a:hover, a:active {
+    color: $brand-color;
+  }
+}
+
+a.status {
+  background-color: orange;
+  padding: 5px 10px;
+  border-radius: 3px;
+  font-size: 16px;
+  margin-left: 12px;
+  display: flex;
+  align-items: center;
+  text-decoration: none;
+  box-shadow: 0px 5px 5px -4px rgba(0,0,0,0.1);
+  transition: background-color 0.2s, box-shadow 0.2s;
+  clr-icon {
+    margin-right: 6px;
+  }
+
+  &:link, &:visited {
+    color: #444;
+  }
+  &:hover {
+    background-color: #ffb203;
+    box-shadow: 0px 5px 5px -4px rgba(0,0,0,0.3);
+  }
+}
+
+.section-2 {
+  background-color: #e5e5e5;
+}
+
+.section-video {
+  background-color: #212122;
+  box-shadow: inset 0px 0px 15px 8px rgba(0,0,0,0.75);
+
+  background-image: url("/header-bg.png");
+  background-attachment: fixed;
+  .content {
+    text-align: center;
+  }
+  iframe.video-embed {
+    max-width: 100%;
+  }
+}
+
+.features {
+  display: flex;
+  flex-direction: column;
+  .feature {
+    margin: 10px;
+    flex: 1;
+  }
+  .feature-icon {
+    text-align: center;
+    color: $brand-color;
+  }
+  h3 {
+    text-align: center;
+  }
+}
+
+.roadmap {
+  ul li {
+    margin: 12px 0;
+  }
+}
+
+.about {
+  margin-top: 64px;
+}
+
+.footer {
+  padding: 30px 10px;
+  background: #a1a1a1;
+  text-align: center;
+  color: #e5e5e5;
+
+  .gh-link {
+    margin-left: 12px;
+  }
+}
+.footer a:link, .footer a:visited {
+  color: #eee;
+}
+@media all and (min-width: 600px){
+  .hero {
+    padding: 100px;
+  }
+  .logo img {
+    max-width: 160px;
+  }
+  .logo h1 {
+    font-size: 5em;
+  }
+  .top-header {
+    flex-direction: row;
+  }
+  .subhead {
+    font-size: 2em;
+  }
+  .features {
+    flex-direction: row;
+  }
+}

+ 75 - 0
docs/assets/styles/_markdown.scss

@@ -0,0 +1,75 @@
+@import 'variables';
+
+$block-border-radius: 0.15rem;
+
+.markdown {
+    line-height: 1.7;
+
+    > :first-child {
+        margin-top: 0;
+        line-height: 1em;
+    }
+
+    h2 {
+        margin-top: 48px;
+    }
+
+    h1, h2, h3, h4, h5 {
+        font-weight: 400;
+        line-height: 1.25;
+
+        &[id]:target:before {
+            display: block;
+            content: " ";
+            margin-top: -75px; // Set the Appropriate Height
+            height: 75px; // Set the Appropriate Height
+            visibility: hidden;
+        }
+        &[id]:target {
+            text-decoration: underline;
+        }
+    }
+
+    b, optgroup, strong {
+        font-weight: 700;
+    }
+
+    a {
+        text-decoration: none;
+
+        &:hover {
+            text-decoration: underline;
+        }
+    }
+
+    code {
+        font-family: 'Oxygen Mono', monospace;
+    }
+
+    p code {
+        padding: 0 $padding-4;
+        background: $gray-100;
+        border-radius: $block-border-radius;
+    }
+
+    pre {
+        padding: $padding-16;
+        background: $gray-100;
+        border-radius: $block-border-radius;
+        font-size: $font-size-14;
+        overflow-x: auto;
+    }
+
+    blockquote {
+        border-left: $padding-1*2 solid $gray-300;
+        margin: 0;
+        padding: $padding-1 $padding-16;
+
+        :first-child { margin-top: 0; }
+        :last-child { margin-bottom: 0; }
+    }
+
+    table tr td {
+        padding: $padding-8;
+    }
+}

+ 36 - 0
docs/assets/styles/_top-bar.scss

@@ -0,0 +1,36 @@
+@import "variables";
+
+.top-bar {
+    position: fixed;
+    padding: 12px;
+    background-color: hsla(224, 14%, 15%, 0.0);
+    width: 100%;
+    top: 0;
+    height: $top-bar-height;
+    display: flex;
+    align-items: center;
+    transition: background-color 0.7s;
+
+    &.floating {
+        background-color: hsla(163, 100%, 100%, 0.9);
+    }
+
+    .flex-spacer {
+        flex: 1;
+    }
+
+    .logo {
+        img {
+            max-width: 32px;
+        }
+    }
+
+    .right {
+        a {
+            margin-left: 12px;
+            &:hover {
+                text-decoration: underline;
+            }
+        }
+    }
+}

+ 49 - 0
docs/assets/styles/_utils.scss

@@ -0,0 +1,49 @@
+.flex {
+    display: flex;
+}
+
+.justify-start {
+    justify-content: flex-start;
+}
+
+.justify-end {
+    justify-content: flex-end;
+}
+
+.justify-center {
+    justify-content: center;
+}
+
+.justify-between {
+    justify-content: space-between;
+}
+
+.align-center {
+    align-items: center;
+}
+
+.mx-auto {
+    margin: 0 auto;
+}
+
+.hide {
+    display: none;
+}
+
+@mixin fixed {
+    position: fixed;
+    top: $top-bar-height;
+    bottom: 0;
+    overflow-x: hidden;
+    overflow-y: auto;
+}
+
+@mixin dark-links {
+    a {
+        color: $nav-link-color;
+    }
+
+    a.active {
+        color: $color-link;
+    }
+}

+ 7 - 4
docs/assets/_variables.scss → docs/assets/styles/_variables.scss

@@ -21,14 +21,17 @@ $gray-800: #343a40;
 $gray-900: #212529;
 $black: #000;
 
-$color-link: #004ed0;
-$color-visited-link: #8440f1;
+$color-link: #087298;
+$color-visited-link: #1e6198;
+$brand-color: #13b7f3;
 
 $body-background: white;
 $body-font-color: $gray-800;
-$body-font-weight: 400;
+$body-font-weight: normal;
 $body-min-width: 25rem;
 
+$top-bar-height: 50px;
+
 $nav-background: $body-background;
 $nav-link-color: $gray-800;
 
@@ -40,4 +43,4 @@ $container-min-width: $body-min-width;
 $container-max-width: 80rem;
 
 $sm-breakpoint: $menu-width + $body-min-width;
-$md-breakpoint: $sm-breakpoint + $toc-width;
+$md-breakpoint: $sm-breakpoint + $toc-width;

+ 206 - 0
docs/assets/styles/main.scss

@@ -0,0 +1,206 @@
+@import "variables";
+@import "markdown";
+@import "utils";
+@import "landing-page";
+@import "top-bar";
+
+html {
+    font-size: $font-size-base;
+    letter-spacing: 0.33px;
+    scroll-behavior: smooth;
+}
+
+html,
+body {
+    min-width: $body-min-width;
+    overflow-x: hidden;
+}
+
+body {
+    color: $body-font-color;
+    background: $body-background;
+    font-family: 'Open Sans', sans-serif;
+    font-weight: $body-font-weight;
+
+    text-rendering: optimizeLegibility;
+    -webkit-font-smoothing: antialiased;
+    -moz-osx-font-smoothing: grayscale;
+
+    box-sizing: border-box;
+    * {
+        box-sizing: inherit;
+    }
+}
+
+h1,
+h2,
+h3,
+h4,
+h5 {
+    // font-weight: 400;
+}
+
+a {
+    text-decoration: none;
+    color: $color-link;
+
+    &:visited {
+        color: $color-visited-link;
+    }
+}
+
+img {
+    vertical-align: middle;
+}
+
+aside nav ul {
+    padding: 0;
+    margin: 0;
+    list-style: none;
+
+    li {
+        margin: 1em 0;
+    }
+
+    a {
+        display: block;
+    }
+
+    a:hover {
+        opacity: .5;
+    }
+
+    ul {
+        padding-left: $padding-16;
+    }
+}
+
+ul.pagination {
+    display: flex;
+    justify-content: center;
+
+    .page-item a {
+        padding: $padding-16;
+    }
+}
+
+.container {
+    min-width: $container-min-width;
+    max-width: $container-max-width;
+    margin: $top-bar-height auto 0;
+}
+
+.book-brand {
+    margin-top: 0;
+}
+
+.book-menu {
+    flex: 0 0 $menu-width;
+    font-size: $font-size-14;
+
+    nav {
+        width: $menu-width;
+        padding: $padding-16;
+
+        @include fixed;
+    }
+
+    @include dark-links;
+}
+
+.book-page {
+    min-width: $body-min-width;
+    padding: $padding-16;
+}
+
+.book-header {
+    margin-bottom: $padding-16;
+    display: none;
+}
+
+.book-toc {
+    flex: 0 0 $toc-width;
+    font-size: $font-size-12;
+
+    nav {
+        width: $toc-width;
+        padding: $padding-16;
+
+        @include fixed;
+    }
+
+    nav > ul > li {
+        margin: 0;
+    }
+}
+
+.book-git-footer {
+    display: flex;
+    margin-top: $padding-16;
+    font-size: $font-size-14;
+    align-items: baseline;
+
+    img {
+        width: $font-size-14;
+        vertical-align: bottom;
+    }
+}
+
+.book-posts {
+    min-width: $body-min-width;
+    max-width: $sm-breakpoint;
+    padding: $padding-16;
+
+    article {
+        padding-bottom: $padding-16;
+    }
+}
+
+// Responsive styles
+aside nav,
+.book-page,
+.markdown {
+    transition: 0.2s ease-in-out;
+    transition-property: transform, margin-left, opacity;
+    will-change: transform, margin-left;
+}
+
+@media screen and (max-width: $md-breakpoint) {
+    .book-toc {
+        display: none;
+    }
+}
+
+@media screen and (max-width: $sm-breakpoint) {
+    .book-menu {
+        margin-left: -$menu-width;
+    }
+
+    .book-header {
+        display: flex;
+    }
+
+    #menu-control:checked + main {
+        .book-menu nav,
+        .book-page {
+            transform: translateX($menu-width);
+        }
+
+        .book-header label {
+            transform: rotate(90deg);
+        }
+
+        .markdown {
+            opacity: 0.25;
+        }
+    }
+}
+
+// Extra space for big screens
+@media screen and (min-width: $container-max-width) {
+    .book-page,
+    .book-menu nav,
+    .book-toc nav {
+        padding: $padding-16 * 2 $padding-16;
+    }
+}

+ 1 - 0
docs/config.toml

@@ -2,6 +2,7 @@ baseURL = "http://example.org/"
 languageCode = "en-us"
 title = "Vendure Documenation"
 pygmentsCodeFences = true
+pygmentsStyle = "friendly"
 disableKinds = [
   "taxonomy",
   "taxonomyTerm"

+ 6 - 6
docs/content/docs/getting-started.md

@@ -12,24 +12,24 @@ weight: 1
  
 ## Installation
 
-```
+```bash
 $ npm install --save @vendure/core
 ```
 
 Vendure includes a CLI program which can generate the initial configuration and entry file for your server:
 
-```
+```bash
 $ npx vendure init
 ```
 
 The init command will ask a series of questions which allow the CLI to generate a configuration and index file.
 
-```
+```bash
 $ ts-node index
 ```
 
 or if using JavaScript:
-```
+```bash
 $ node index
 ```
 
@@ -45,7 +45,7 @@ bootstrap({
     apiPath: 'api',
     defaultChannelToken: 'default-channel'
     // ...
-})
+});
 ```
 
 ```TypeScript
@@ -60,5 +60,5 @@ fetch(
         body: '{"query":"mutation { login(username: \\"superadmin\\", password: \\"superadmin\\") { user { id } } }"}',
         method: 'POST',
     },
-)
+);
 ```

+ 150 - 3
docs/layouts/index.en.html

@@ -1,10 +1,157 @@
 <!DOCTYPE html>
 <html lang="en">
 <head>
-    <meta charset="UTF-8">
-    <title>Vendure</title>
+    {{ partial "docs/html-head" . }}
+    {{ partial "docs/inject/head" . }}
+    <link href="https://fonts.googleapis.com/css?family=Didact+Gothic|Open+Sans" rel="stylesheet">
+    <link rel="stylesheet" href="{{ "clr-icons.min.css" | absURL }}">
+    <script src="{{ "custom-elements.min.js" | absURL }}"></script>
+    <script src="{{ "clr-icons.min.js" | absURL }}"></script>
 </head>
 <body>
-<h1>This is tha docs innit!?</h1>
+{{ partial "top-bar" . }}
+<div class="hero">
+    <div class="logo">
+        <img src="{{ "logo.png" | absURL }}" />
+        <h1>vendure</h1>
+    </div>
+    <div class="subhead">
+        A modern, headless <a href="https://graphql.org/">GraphQL</a>-based ecommerce framework built with <a href="http://www.typescriptlang.org">TypeScript</a> & <a href="https://nodejs.org">Nodejs</a>
+    </div>
+</div>
+<div class="section-1">
+    <div class="content">
+        <h2 class="top-header">Ecommerce For The Modern Web
+            <a class="status" href="https://github.com/vendure-ecommerce/vendure/projects/1">
+            <clr-icon shape="info-standard" size="24"></clr-icon>
+                Status: pre-alpha
+            </a>
+        </h2>
+        <p>Vendure is a new ecommerce framework built for the developers who are building the modern web.</p>
+        <p>
+            The project is currently in the early stages of development.
+            <strong>The alpha release is coming in Q1 2019</strong>.
+            You can track progress on <a href="https://github.com/vendure-ecommerce/vendure/projects/1">GitHub</a>.</p>
+    </div>
+</div>
+<div class="section-2">
+    <div class="content">
+        <div class="features">
+
+            <div class="feature">
+                <div class="feature-icon">
+                    <clr-icon shape="data-cluster" size="64"></clr-icon>
+                </div>
+                <h3>De-coupled & Flexible</h3>
+                <p>
+                    Vendure is a headless framework, meaning that it delivers content through its <a href="https://graphql.org/">GraphQL API</a>, leaving you free to
+                    implement your store-front application(s) in the technologies of your choice.
+                </p>
+            </div>
+
+            <div class="feature">
+                <div class="feature-icon">
+                    <clr-icon shape="terminal" size="64"></clr-icon>
+                </div>
+                <h3>Built for Developers</h3>
+                <p>
+                    Vendure makes developer productivity a top priority. The framework is written in TypeScript and is
+                    built on the npm ecosystem.
+                </p>
+                <p>
+                    The combination of TypeScript and GraphQL enables end-to-end type safety.
+                </p>
+            </div>
+
+            <div class="feature">
+                <div class="feature-icon">
+                    <clr-icon shape="library" size="64"></clr-icon>
+                </div>
+                <h3>Open Source</h3>
+                <p>
+                    Vendure is available under the <a href="https://tldrlegal.com/license/mit-license">MIT license</a>.
+                </p>
+                <p>
+                    All development of the core framework is being done in the open on <a href="https://github.com/vendure-ecommerce/vendure">GitHub</a>.
+                </p>
+            </div>
+        </div>
+    </div>
+</div>
+<div class="section-video">
+    <div class="content">
+        <iframe class="video-embed"
+                src="https://player.vimeo.com/video/305117299"
+                width="640" height="360" frameborder="0"
+                webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>
+    </div>
+</div>
+<div class="section-3">
+    <div class="content">
+        <div class="roadmap">
+            <h2>Roadmap</h2>
+            <p>
+                Here's a partial list of some of the features which are planned for the initial release:
+            </p>
+            <ul>
+                <li>
+                    <strong>Built-in admin interface</strong> Vendure will ship with a fully-functional admin UI app.
+                </li>
+                <li>
+                    <strong>Full multi-language support</strong> Create and deliver content in any language.
+                </li>
+                <li>
+                    <strong>Guest checkouts</strong> Reduce friction by allowing purchases to be made without requiring
+                    a sign-up.
+                </li>
+                <li>
+                    <strong>Fully customizable models</strong> Adding domain-specific properties to your models (products,
+                    customers, orders etc.) can be done in just a few lines of configuration code.
+                </li>
+                <li>
+                    <strong>Faceted search</strong> Facets (e.g. "Brand", "Colour") enable efficient filtering and grouping
+                    of products.
+                </li>
+                <li>
+                    <strong>Flexible search integrations</strong> Product search is one of the most important aspects of a successful
+                    ecommerce experience. Vendure will feature a pluggable interface to allow you to use the search solution
+                    of your choice (e.g. Elastic, Algolia etc).
+                </li>
+                <li>
+                    <strong>Extensible business logic</strong> Need to apply custom shipping logic? Sophisticated promotions?
+                    Vendure will feature hooks at each point of the purchase journey which allow you to customise and extend
+                    the built-in behaviour.
+                </li>
+                <li>
+                    <strong>Blazing fast</strong> What feature list would be complete without these two magical words?
+                </li>
+            </ul>
+        </div>
+        <div class="about">
+            <h2>Who is building Vendure?</h2>
+            <p>
+                Vendure is being built full-time by <a href="https://www.michaelbromley.co.uk/">Michael Bromley</a>.
+            </p>
+            <p>
+                I've been working on custom ecommerce software on and off for the past 13 years. Over that time I've learned
+                a lot about how <em>not</em> to do things, and have developed a feel for what I as a developer would
+                really like to see in an ecommerce tool.
+            </p>
+            <p>
+                I also spent the past 3 years working on the core team of the <a href="https://getmesh.io/">Gentics Mesh</a> headless CMS.
+                During my time on that project I came to appreciate the power of the API-first approach.
+            </p>
+            <p>
+                Vendure is the culmination of my years in the trenches of yesterday's ecommerce development combined with
+                my passion for front-end development and my conviction that headless architecture - and GraphQL
+                in particular - are the way of the future.
+            </p>
+        </div>
+    </div>
+</div>
+<div class="footer">
+    &copy; 2018 <a href="https://www.michaelbromley.co.uk/">Michael Bromley</a>
+    <a href="https://github.com/vendure-ecommerce/vendure" class="gh-link">Vendure on GitHub</a>
+</div>
 </body>
 </html>

+ 4 - 3
docs/layouts/partials/docs/html-head.html

@@ -2,7 +2,8 @@
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>{{- template "title" . }} | {{ .Site.Title -}}</title>
 
-<link href="https://fonts.googleapis.com/css?family=Oxygen|Oxygen+Mono:300,400,700" rel="stylesheet">
+<link href="https://fonts.googleapis.com/css?family=Didact+Gothic|Open+Sans" rel="stylesheet">
 <link rel="stylesheet" href="{{ "normalize.min.css" | absURL }}">
-{{ $styles := resources.Get "book.scss" | resources.ToCSS | resources.Minify | resources.Fingerprint }}
-<link rel="stylesheet" href="{{ $styles.RelPermalink }}">
+{{ $styles := resources.Get "styles/main.scss" | resources.ToCSS | resources.Minify | resources.Fingerprint }}
+<link rel="stylesheet" href="{{ $styles.RelPermalink }}">
+<script src="{{ "main.js" | absURL }}"></script>

+ 1 - 0
docs/layouts/partials/docs/inject/body.html

@@ -0,0 +1 @@
+{{ partial "top-bar" . }}

+ 12 - 0
docs/layouts/partials/top-bar.html

@@ -0,0 +1,12 @@
+<div class="top-bar">
+    <div class="left">
+        <a class="logo" href="/">
+            <img src="{{ "logo.png" | absURL }}" />
+        </a>
+    </div>
+    <div class="flex-spacer"></div>
+    <div class="right">
+        <a href="/docs">Docs</a>
+        <a href="https://github.com/vendure-ecommerce/vendure">GitHub</a>
+    </div>
+</div>

Fișier diff suprimat deoarece este prea mare
+ 8 - 0
docs/static/clr-icons-lite.min.js


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
docs/static/clr-icons.min.css


Fișier diff suprimat deoarece este prea mare
+ 8 - 0
docs/static/clr-icons.min.js


+ 37 - 0
docs/static/custom-elements.min.js

@@ -0,0 +1,37 @@
+(function(){
+'use strict';var g=new function(){};var aa=new Set("annotation-xml color-profile font-face font-face-src font-face-uri font-face-format font-face-name missing-glyph".split(" "));function k(b){var a=aa.has(b);b=/^[a-z][.0-9_a-z]*-[\-.0-9_a-z]*$/.test(b);return!a&&b}function l(b){var a=b.isConnected;if(void 0!==a)return a;for(;b&&!(b.__CE_isImportDocument||b instanceof Document);)b=b.parentNode||(window.ShadowRoot&&b instanceof ShadowRoot?b.host:void 0);return!(!b||!(b.__CE_isImportDocument||b instanceof Document))}
+function m(b,a){for(;a&&a!==b&&!a.nextSibling;)a=a.parentNode;return a&&a!==b?a.nextSibling:null}
+function n(b,a,e){e=e?e:new Set;for(var c=b;c;){if(c.nodeType===Node.ELEMENT_NODE){var d=c;a(d);var h=d.localName;if("link"===h&&"import"===d.getAttribute("rel")){c=d.import;if(c instanceof Node&&!e.has(c))for(e.add(c),c=c.firstChild;c;c=c.nextSibling)n(c,a,e);c=m(b,d);continue}else if("template"===h){c=m(b,d);continue}if(d=d.__CE_shadowRoot)for(d=d.firstChild;d;d=d.nextSibling)n(d,a,e)}c=c.firstChild?c.firstChild:m(b,c)}}function q(b,a,e){b[a]=e};function r(){this.a=new Map;this.m=new Map;this.f=[];this.b=!1}function ba(b,a,e){b.a.set(a,e);b.m.set(e.constructor,e)}function t(b,a){b.b=!0;b.f.push(a)}function v(b,a){b.b&&n(a,function(a){return w(b,a)})}function w(b,a){if(b.b&&!a.__CE_patched){a.__CE_patched=!0;for(var e=0;e<b.f.length;e++)b.f[e](a)}}function x(b,a){var e=[];n(a,function(b){return e.push(b)});for(a=0;a<e.length;a++){var c=e[a];1===c.__CE_state?b.connectedCallback(c):y(b,c)}}
+function z(b,a){var e=[];n(a,function(b){return e.push(b)});for(a=0;a<e.length;a++){var c=e[a];1===c.__CE_state&&b.disconnectedCallback(c)}}
+function A(b,a,e){e=e?e:new Set;var c=[];n(a,function(d){if("link"===d.localName&&"import"===d.getAttribute("rel")){var a=d.import;a instanceof Node&&"complete"===a.readyState?(a.__CE_isImportDocument=!0,a.__CE_hasRegistry=!0):d.addEventListener("load",function(){var a=d.import;a.__CE_documentLoadHandled||(a.__CE_documentLoadHandled=!0,a.__CE_isImportDocument=!0,a.__CE_hasRegistry=!0,e.delete(a),A(b,a,e))})}else c.push(d)},e);if(b.b)for(a=0;a<c.length;a++)w(b,c[a]);for(a=0;a<c.length;a++)y(b,c[a])}
+function y(b,a){if(void 0===a.__CE_state){var e=b.a.get(a.localName);if(e){e.constructionStack.push(a);var c=e.constructor;try{try{if(new c!==a)throw Error("The custom element constructor did not produce the element being upgraded.");}finally{e.constructionStack.pop()}}catch(f){throw a.__CE_state=2,f;}a.__CE_state=1;a.__CE_definition=e;if(e.attributeChangedCallback)for(e=e.observedAttributes,c=0;c<e.length;c++){var d=e[c],h=a.getAttribute(d);null!==h&&b.attributeChangedCallback(a,d,null,h,null)}l(a)&&
+b.connectedCallback(a)}}}r.prototype.connectedCallback=function(b){var a=b.__CE_definition;a.connectedCallback&&a.connectedCallback.call(b)};r.prototype.disconnectedCallback=function(b){var a=b.__CE_definition;a.disconnectedCallback&&a.disconnectedCallback.call(b)};r.prototype.attributeChangedCallback=function(b,a,e,c,d){var h=b.__CE_definition;h.attributeChangedCallback&&-1<h.observedAttributes.indexOf(a)&&h.attributeChangedCallback.call(b,a,e,c,d)};function B(b,a){this.c=b;this.a=a;this.b=void 0;A(this.c,this.a);"loading"===this.a.readyState&&(this.b=new MutationObserver(this.f.bind(this)),this.b.observe(this.a,{childList:!0,subtree:!0}))}function C(b){b.b&&b.b.disconnect()}B.prototype.f=function(b){var a=this.a.readyState;"interactive"!==a&&"complete"!==a||C(this);for(a=0;a<b.length;a++)for(var e=b[a].addedNodes,c=0;c<e.length;c++)A(this.c,e[c])};function ca(){var b=this;this.b=this.a=void 0;this.f=new Promise(function(a){b.b=a;b.a&&a(b.a)})}function D(b){if(b.a)throw Error("Already resolved.");b.a=void 0;b.b&&b.b(void 0)};function E(b){this.i=!1;this.c=b;this.l=new Map;this.j=function(b){return b()};this.g=!1;this.h=[];this.s=new B(b,document)}
+E.prototype.define=function(b,a){var e=this;if(!(a instanceof Function))throw new TypeError("Custom element constructors must be functions.");if(!k(b))throw new SyntaxError("The element name '"+b+"' is not valid.");if(this.c.a.get(b))throw Error("A custom element with name '"+b+"' has already been defined.");if(this.i)throw Error("A custom element is already being defined.");this.i=!0;var c,d,h,f,u;try{var p=function(b){var a=P[b];if(void 0!==a&&!(a instanceof Function))throw Error("The '"+b+"' callback must be a function.");
+return a},P=a.prototype;if(!(P instanceof Object))throw new TypeError("The custom element constructor's prototype is not an object.");c=p("connectedCallback");d=p("disconnectedCallback");h=p("adoptedCallback");f=p("attributeChangedCallback");u=a.observedAttributes||[]}catch(ua){return}finally{this.i=!1}ba(this.c,b,{localName:b,constructor:a,connectedCallback:c,disconnectedCallback:d,adoptedCallback:h,attributeChangedCallback:f,observedAttributes:u,constructionStack:[]});this.h.push(b);this.g||(this.g=
+!0,this.j(function(){if(!1!==e.g)for(e.g=!1,A(e.c,document);0<e.h.length;){var b=e.h.shift();(b=e.l.get(b))&&D(b)}}))};E.prototype.get=function(b){if(b=this.c.a.get(b))return b.constructor};E.prototype.whenDefined=function(b){if(!k(b))return Promise.reject(new SyntaxError("'"+b+"' is not a valid custom element name."));var a=this.l.get(b);if(a)return a.f;a=new ca;this.l.set(b,a);this.c.a.get(b)&&-1===this.h.indexOf(b)&&D(a);return a.f};E.prototype.u=function(b){C(this.s);var a=this.j;this.j=function(e){return b(function(){return a(e)})}};
+window.CustomElementRegistry=E;E.prototype.define=E.prototype.define;E.prototype.get=E.prototype.get;E.prototype.whenDefined=E.prototype.whenDefined;E.prototype.polyfillWrapFlushCallback=E.prototype.u;var F=window.Document.prototype.createElement,da=window.Document.prototype.createElementNS,ea=window.Document.prototype.importNode,fa=window.Document.prototype.prepend,ga=window.Document.prototype.append,G=window.Node.prototype.cloneNode,H=window.Node.prototype.appendChild,I=window.Node.prototype.insertBefore,J=window.Node.prototype.removeChild,K=window.Node.prototype.replaceChild,L=Object.getOwnPropertyDescriptor(window.Node.prototype,"textContent"),M=window.Element.prototype.attachShadow,N=Object.getOwnPropertyDescriptor(window.Element.prototype,
+"innerHTML"),O=window.Element.prototype.getAttribute,Q=window.Element.prototype.setAttribute,R=window.Element.prototype.removeAttribute,S=window.Element.prototype.getAttributeNS,T=window.Element.prototype.setAttributeNS,U=window.Element.prototype.removeAttributeNS,V=window.Element.prototype.insertAdjacentElement,ha=window.Element.prototype.prepend,ia=window.Element.prototype.append,ja=window.Element.prototype.before,ka=window.Element.prototype.after,la=window.Element.prototype.replaceWith,ma=window.Element.prototype.remove,
+na=window.HTMLElement,W=Object.getOwnPropertyDescriptor(window.HTMLElement.prototype,"innerHTML"),X=window.HTMLElement.prototype.insertAdjacentElement;function oa(){var b=Y;window.HTMLElement=function(){function a(){var a=this.constructor,c=b.m.get(a);if(!c)throw Error("The custom element being constructed was not registered with `customElements`.");var d=c.constructionStack;if(!d.length)return d=F.call(document,c.localName),Object.setPrototypeOf(d,a.prototype),d.__CE_state=1,d.__CE_definition=c,w(b,d),d;var c=d.length-1,h=d[c];if(h===g)throw Error("The HTMLElement constructor was either called reentrantly for this constructor or called multiple times.");
+d[c]=g;Object.setPrototypeOf(h,a.prototype);w(b,h);return h}a.prototype=na.prototype;return a}()};function pa(b,a,e){a.prepend=function(a){for(var d=[],c=0;c<arguments.length;++c)d[c-0]=arguments[c];c=d.filter(function(b){return b instanceof Node&&l(b)});e.o.apply(this,d);for(var f=0;f<c.length;f++)z(b,c[f]);if(l(this))for(c=0;c<d.length;c++)f=d[c],f instanceof Element&&x(b,f)};a.append=function(a){for(var d=[],c=0;c<arguments.length;++c)d[c-0]=arguments[c];c=d.filter(function(b){return b instanceof Node&&l(b)});e.append.apply(this,d);for(var f=0;f<c.length;f++)z(b,c[f]);if(l(this))for(c=0;c<
+d.length;c++)f=d[c],f instanceof Element&&x(b,f)}};function qa(){var b=Y;q(Document.prototype,"createElement",function(a){if(this.__CE_hasRegistry){var e=b.a.get(a);if(e)return new e.constructor}a=F.call(this,a);w(b,a);return a});q(Document.prototype,"importNode",function(a,e){a=ea.call(this,a,e);this.__CE_hasRegistry?A(b,a):v(b,a);return a});q(Document.prototype,"createElementNS",function(a,e){if(this.__CE_hasRegistry&&(null===a||"http://www.w3.org/1999/xhtml"===a)){var c=b.a.get(e);if(c)return new c.constructor}a=da.call(this,a,e);w(b,a);return a});
+pa(b,Document.prototype,{o:fa,append:ga})};function ra(){var b=Y;function a(a,c){Object.defineProperty(a,"textContent",{enumerable:c.enumerable,configurable:!0,get:c.get,set:function(a){if(this.nodeType===Node.TEXT_NODE)c.set.call(this,a);else{var d=void 0;if(this.firstChild){var e=this.childNodes,u=e.length;if(0<u&&l(this))for(var d=Array(u),p=0;p<u;p++)d[p]=e[p]}c.set.call(this,a);if(d)for(a=0;a<d.length;a++)z(b,d[a])}}})}q(Node.prototype,"insertBefore",function(a,c){if(a instanceof DocumentFragment){var d=Array.prototype.slice.apply(a.childNodes);
+a=I.call(this,a,c);if(l(this))for(c=0;c<d.length;c++)x(b,d[c]);return a}d=l(a);c=I.call(this,a,c);d&&z(b,a);l(this)&&x(b,a);return c});q(Node.prototype,"appendChild",function(a){if(a instanceof DocumentFragment){var c=Array.prototype.slice.apply(a.childNodes);a=H.call(this,a);if(l(this))for(var d=0;d<c.length;d++)x(b,c[d]);return a}c=l(a);d=H.call(this,a);c&&z(b,a);l(this)&&x(b,a);return d});q(Node.prototype,"cloneNode",function(a){a=G.call(this,a);this.ownerDocument.__CE_hasRegistry?A(b,a):v(b,a);
+return a});q(Node.prototype,"removeChild",function(a){var c=l(a),d=J.call(this,a);c&&z(b,a);return d});q(Node.prototype,"replaceChild",function(a,c){if(a instanceof DocumentFragment){var d=Array.prototype.slice.apply(a.childNodes);a=K.call(this,a,c);if(l(this))for(z(b,c),c=0;c<d.length;c++)x(b,d[c]);return a}var d=l(a),e=K.call(this,a,c),f=l(this);f&&z(b,c);d&&z(b,a);f&&x(b,a);return e});L&&L.get?a(Node.prototype,L):t(b,function(b){a(b,{enumerable:!0,configurable:!0,get:function(){for(var a=[],b=
+0;b<this.childNodes.length;b++)a.push(this.childNodes[b].textContent);return a.join("")},set:function(a){for(;this.firstChild;)J.call(this,this.firstChild);H.call(this,document.createTextNode(a))}})})};function sa(b){var a=Element.prototype;a.before=function(a){for(var c=[],d=0;d<arguments.length;++d)c[d-0]=arguments[d];d=c.filter(function(a){return a instanceof Node&&l(a)});ja.apply(this,c);for(var e=0;e<d.length;e++)z(b,d[e]);if(l(this))for(d=0;d<c.length;d++)e=c[d],e instanceof Element&&x(b,e)};a.after=function(a){for(var c=[],d=0;d<arguments.length;++d)c[d-0]=arguments[d];d=c.filter(function(a){return a instanceof Node&&l(a)});ka.apply(this,c);for(var e=0;e<d.length;e++)z(b,d[e]);if(l(this))for(d=
+0;d<c.length;d++)e=c[d],e instanceof Element&&x(b,e)};a.replaceWith=function(a){for(var c=[],d=0;d<arguments.length;++d)c[d-0]=arguments[d];var d=c.filter(function(a){return a instanceof Node&&l(a)}),e=l(this);la.apply(this,c);for(var f=0;f<d.length;f++)z(b,d[f]);if(e)for(z(b,this),d=0;d<c.length;d++)e=c[d],e instanceof Element&&x(b,e)};a.remove=function(){var a=l(this);ma.call(this);a&&z(b,this)}};function ta(){var b=Y;function a(a,c){Object.defineProperty(a,"innerHTML",{enumerable:c.enumerable,configurable:!0,get:c.get,set:function(a){var d=this,e=void 0;l(this)&&(e=[],n(this,function(a){a!==d&&e.push(a)}));c.set.call(this,a);if(e)for(var f=0;f<e.length;f++){var h=e[f];1===h.__CE_state&&b.disconnectedCallback(h)}this.ownerDocument.__CE_hasRegistry?A(b,this):v(b,this);return a}})}function e(a,c){q(a,"insertAdjacentElement",function(a,d){var e=l(d);a=c.call(this,a,d);e&&z(b,d);l(a)&&x(b,d);
+return a})}M?q(Element.prototype,"attachShadow",function(a){return this.__CE_shadowRoot=a=M.call(this,a)}):console.warn("Custom Elements: `Element#attachShadow` was not patched.");if(N&&N.get)a(Element.prototype,N);else if(W&&W.get)a(HTMLElement.prototype,W);else{var c=F.call(document,"div");t(b,function(b){a(b,{enumerable:!0,configurable:!0,get:function(){return G.call(this,!0).innerHTML},set:function(a){var b="template"===this.localName?this.content:this;for(c.innerHTML=a;0<b.childNodes.length;)J.call(b,
+b.childNodes[0]);for(;0<c.childNodes.length;)H.call(b,c.childNodes[0])}})})}q(Element.prototype,"setAttribute",function(a,c){if(1!==this.__CE_state)return Q.call(this,a,c);var d=O.call(this,a);Q.call(this,a,c);c=O.call(this,a);b.attributeChangedCallback(this,a,d,c,null)});q(Element.prototype,"setAttributeNS",function(a,c,e){if(1!==this.__CE_state)return T.call(this,a,c,e);var d=S.call(this,a,c);T.call(this,a,c,e);e=S.call(this,a,c);b.attributeChangedCallback(this,c,d,e,a)});q(Element.prototype,"removeAttribute",
+function(a){if(1!==this.__CE_state)return R.call(this,a);var c=O.call(this,a);R.call(this,a);null!==c&&b.attributeChangedCallback(this,a,c,null,null)});q(Element.prototype,"removeAttributeNS",function(a,c){if(1!==this.__CE_state)return U.call(this,a,c);var d=S.call(this,a,c);U.call(this,a,c);var e=S.call(this,a,c);d!==e&&b.attributeChangedCallback(this,c,d,e,a)});X?e(HTMLElement.prototype,X):V?e(Element.prototype,V):console.warn("Custom Elements: `Element#insertAdjacentElement` was not patched.");
+pa(b,Element.prototype,{o:ha,append:ia});sa(b)};/*
+
+ Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
+ This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
+ The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
+ The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
+ Code distributed by Google as part of the polymer project is also
+ subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
+*/
+var Z=window.customElements;if(!Z||Z.forcePolyfill||"function"!=typeof Z.define||"function"!=typeof Z.get){var Y=new r;oa();qa();ra();ta();document.__CE_hasRegistry=!0;var customElements=new E(Y);Object.defineProperty(window,"customElements",{configurable:!0,enumerable:!0,value:customElements})};
+}).call(self);
+
+//# sourceMappingURL=custom-elements.min.js.map

BIN
docs/static/favicon.ico


BIN
docs/static/header-bg.png


BIN
docs/static/logo.png


+ 12 - 0
docs/tsconfig.json

@@ -0,0 +1,12 @@
+{
+  "extends": "../tsconfig",
+  "compilerOptions": {
+    "module": "None",
+    "lib": [
+      "es2017",
+      "dom",
+    ],
+    "target": "es5",
+    "outFile": "static/main.js"
+  }
+}

Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff