From 53630565ac154370b4fe4aa2cb8c7e3e2a0c8784 Mon Sep 17 00:00:00 2001
From: ManUtopiK <emmanuel.salomon@gmail.com>
Date: Wed, 22 Sep 2021 15:09:38 +0200
Subject: [PATCH] refactoring: rename page bottom to page edit

---
 components/page/PageContainer.vue             |   2 +-
 .../page/{PageBottom.vue => PageEdit.vue}     |   1 +
 components/page/PageFlatPlan.vue              | 174 ++++++++++++++++++
 pages/faq/index.vue                           |   2 +-
 4 files changed, 177 insertions(+), 2 deletions(-)
 rename components/page/{PageBottom.vue => PageEdit.vue} (98%)
 create mode 100644 components/page/PageFlatPlan.vue

diff --git a/components/page/PageContainer.vue b/components/page/PageContainer.vue
index edb93c04..e3a95d77 100644
--- a/components/page/PageContainer.vue
+++ b/components/page/PageContainer.vue
@@ -12,7 +12,7 @@
       >
         <slot name="sidebar" />
 
-        <PageBottom :document="document" class="w-full border-t my-10 pt-2" />
+        <PageEdit :document="document" class="w-full border-t my-10 pt-2" />
       </div>
     </div>
 
diff --git a/components/page/PageBottom.vue b/components/page/PageEdit.vue
similarity index 98%
rename from components/page/PageBottom.vue
rename to components/page/PageEdit.vue
index bc34dec2..8c3fba88 100644
--- a/components/page/PageBottom.vue
+++ b/components/page/PageEdit.vue
@@ -28,6 +28,7 @@
 
 <script>
 export default {
+  name: 'PageEdit',
   props: {
     document: {
       type: Object,
diff --git a/components/page/PageFlatPlan.vue b/components/page/PageFlatPlan.vue
new file mode 100644
index 00000000..e2682b40
--- /dev/null
+++ b/components/page/PageFlatPlan.vue
@@ -0,0 +1,174 @@
+<template>
+  <nav>
+    <nuxt-link
+      v-if="showNext && nextPage"
+      class="text-3xl pb-3 mb-3 block group"
+      :to="nextPage.to"
+    >
+      <span class="opacity-75">Page suivante</span>
+      <fa icon="arrow-right" class="mx-4"></fa>
+      <span class="font-semibold group-hover:underline">
+        {{ nextPage.title }}
+      </span>
+    </nuxt-link>
+
+    <section
+      class="section-flatplan gap-6 grid lg:grid-cols-4 md:grid-cols-2 group"
+    >
+      <nuxt-link
+        v-for="(section, i) in sections"
+        :key="i"
+        :to="section.to"
+        class="bg-blue-100 dark:bg-blue-900 px-4 py-4 pb-3 rounded transition hover:shadow-xl transform hover:-translate-y-0.5"
+        :class="
+          showNext &&
+          (nextPage && nextPage.to === section.to
+            ? 'ring-4 ring-blue-200 dark:ring-blue-800'
+            : 'bg-opacity-80 dark:bg-opacity-80 group-hover:bg-opacity-100')
+        "
+      >
+        <div class="flex items-center justify-between">
+          <h2 class="font-semibold text-lg">{{ section.title }}</h2>
+          <fa icon="arrow-right" class="ml-4"></fa>
+        </div>
+        <ul class="mt-1 font-light list-flatplan">
+          <li v-for="(item, ii) in section.children" :key="ii">
+            {{ item }}
+          </li>
+        </ul>
+      </nuxt-link>
+    </section>
+  </nav>
+</template>
+
+<script>
+export default {
+  name: 'PageFlatPlan',
+  props: {
+    plan: {
+      type: String,
+      required: true,
+    },
+    showNext: {
+      type: Boolean,
+      default: false,
+    },
+  },
+  data() {
+    return {
+      sections: [],
+    }
+  },
+  async fetch() {
+    const document = await this.$content(this.plan).fetch()
+
+    // This is ugly, but I don't found another way to extract title, link and li elements.
+    // It's work with 'content:file:beforeParse' nuxt-content hook. See in config.nuxt.js
+    this.sections = document.body.children
+      .filter((item) => item.tag === 'section')
+      .map((item) => {
+        const title = item.children.filter((item) => item.type === 'element')[0]
+          .children[1]
+        const children = item.children
+          .filter((item) => item.type === 'element')[1]
+          .children.filter((item) => item.type === 'element')
+          .map((li) => li.children[0].value)
+        return {
+          children,
+          title: title.children[0].value,
+          to: title.props.to,
+        }
+      })
+  },
+  computed: {
+    nextPage() {
+      const index = this.sections.findIndex(
+        (index) => index.to === this.$route.fullPath
+      )
+      return this.sections[index + 1] ? this.sections[index + 1] : null
+    },
+  },
+}
+</script>
+
+<style lang="postcss" scoped>
+.list-flatplan > li {
+  position: relative;
+  padding-left: 1.75em;
+  margin: 0.5em 0;
+  line-height: 1.2em;
+}
+.list-flatplan > li::before {
+  content: '';
+  position: absolute;
+  background-color: #3b82f6;
+  border-radius: 50%;
+  width: 0.375em;
+  height: 0.375em;
+  top: 0.375em;
+  left: 0.25em;
+}
+
+.section-flatplan .svg-inline--fa {
+  animation: shake 10s cubic-bezier(0.36, 0.07, 0.19, 0.97) infinite;
+  animation-delay: 5s;
+}
+.section-flatplan > a:nth-child(2) .svg-inline--fa {
+  animation-delay: 5.5s;
+}
+.section-flatplan > a:nth-child(3) .svg-inline--fa {
+  animation-delay: 6s;
+}
+.section-flatplan > a:nth-child(4) .svg-inline--fa {
+  animation-delay: 6.5s;
+}
+@keyframes shake {
+  0% {
+    -webkit-transform: translate(2px, 1px) rotate(0deg);
+  }
+
+  1% {
+    -webkit-transform: translate(-1px, -2px) rotate(-3deg);
+  }
+
+  2% {
+    -webkit-transform: translate(-3px, 0px) rotate(3deg);
+  }
+
+  3% {
+    -webkit-transform: translate(0px, 2px) rotate(0deg);
+  }
+
+  4% {
+    -webkit-transform: translate(1px, -1px) rotate(3deg);
+  }
+
+  5% {
+    -webkit-transform: translate(-1px, 2px) rotate(-3deg);
+  }
+
+  6% {
+    -webkit-transform: translate(-3px, 1px) rotate(0deg);
+  }
+
+  7% {
+    -webkit-transform: translate(2px, 1px) rotate(-3deg);
+  }
+
+  8% {
+    -webkit-transform: translate(-1px, -1px) rotate(3deg);
+  }
+
+  9% {
+    -webkit-transform: translate(2px, 2px) rotate(0deg);
+  }
+
+  10% {
+    -webkit-transform: translate(1px, -2px) rotate(-3deg);
+  }
+
+  11% {
+    transform: translate(0, 0) rotate(0deg);
+  }
+}
+</style>
diff --git a/pages/faq/index.vue b/pages/faq/index.vue
index 1acc76e8..c7ad314b 100644
--- a/pages/faq/index.vue
+++ b/pages/faq/index.vue
@@ -43,7 +43,7 @@
         />
       </div>
 
-      <PageBottom :document="documentFAQ" class="w-full border-t my-8 pt-2" />
+      <PageEdit :document="documentFAQ" class="w-full border-t my-8 pt-2" />
     </template>
   </SearchContainer>
 </template>
-- 
GitLab