From 00510820a2794efcadbc83f7f8b54318fe198ecb Mon Sep 17 00:00:00 2001
From: Zéro~Informatique
Date: Tue, 26 Jul 2022 08:44:34 +0200
Subject: viewer: migrate to vue 3, general refactoring and cleanup

Non-exhaustive list of fixes and improvements done at the same time:

- html default background to grey (avoids white flash during init)
- unified links behavior
- added more theme variables
- removed the flex-expand transition (it wasn't working) and replaced it
  with a slide
- fixed LdLoading not centered on the content
- title on removable tags
- fixed an issue with encoded URI from vue-router
- unified Item resource URLs
- removed the iframe for PlainTextViewer (it wasn't working properly)
  and replaced it with a pre
- fixed clear and search buttons tabindex
- fixed the information panel bumping up during the fade animation of
  tag's dropdown
- fixed some focus outlines not appearing correctly
- moved CSS variables to the :root context
- Code cleaning

GitHub: closes #217
GitHub: closes #300
GitHub: closes #297
GitHub: closes #105
GitHub: closes #267
GitHub: closes #275
GitHub: closes #228
GitHub: closes #215
GitHub: closes #112
---
 viewer/src/views/layout/top/LayoutBreadcrumb.vue | 130 +++++++++++++++++++++++
 1 file changed, 130 insertions(+)
 create mode 100644 viewer/src/views/layout/top/LayoutBreadcrumb.vue

(limited to 'viewer/src/views/layout/top/LayoutBreadcrumb.vue')

diff --git a/viewer/src/views/layout/top/LayoutBreadcrumb.vue b/viewer/src/views/layout/top/LayoutBreadcrumb.vue
new file mode 100644
index 0000000..2e70d66
--- /dev/null
+++ b/viewer/src/views/layout/top/LayoutBreadcrumb.vue
@@ -0,0 +1,130 @@
+<!-- ldgallery - A static generator which turns a collection of tagged
+--             pictures into a searchable web gallery.
+--
+-- Copyright (C) 2019-2022  Guillaume FOUET
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU Affero General Public License as
+-- published by the Free Software Foundation, either version 3 of the
+-- License, or (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU Affero General Public License for more details.
+--
+-- You should have received a copy of the GNU Affero General Public License
+-- along with this program.  If not, see <https://www.gnu.org/licenses/>.
+-->
+
+<template>
+  <div
+    ref="breadcrumb"
+    v-dragscroll.x
+    class="flex scrollbar"
+    :class="$style.ldBreadcrumb"
+  >
+    <div
+      v-show="!arrivedState.left"
+      :class="$style.ldBreadcrumbOverflowMask"
+    />
+    <ul>
+      <li
+        v-for="(item, idx) in currentItemPath"
+        :key="item.path"
+      >
+        <fa-icon
+          v-if="idx > 0"
+          :icon="faAngleRight"
+          class="disabled"
+        />
+        <LdLink
+          :to="item.path"
+        >
+          <fa-icon
+            :icon="navigation.getIcon(item)"
+            size="lg"
+          />
+          {{ item.title }}
+        </LdLink>
+      </li>
+      <li v-if="searchMode">
+        <fa-icon
+          :icon="faAngleRight"
+          class="disabled"
+        />
+        <fa-icon
+          :icon="faSearch"
+          size="lg"
+          class="disabled"
+        />
+      </li>
+    </ul>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { Item } from '@/@types/gallery';
+import LdLink from '@/components/LdLink.vue';
+import { useNavigation } from '@/services/navigation';
+import { faAngleRight, faSearch } from '@fortawesome/free-solid-svg-icons';
+import { useScroll } from '@vueuse/core';
+import { nextTick, onMounted, ref, watch } from 'vue';
+
+const props = defineProps({
+  currentItemPath: { type: Array<Item>, required: true },
+  searchMode: Boolean,
+});
+
+const breadcrumb = ref<HTMLDivElement>();
+
+const navigation = useNavigation();
+const { arrivedState } = useScroll(breadcrumb);
+
+onMounted(() =>
+  watch(() => props.currentItemPath, () => {
+    const div = breadcrumb.value;
+    if (div) nextTick(() => (div.scrollLeft = div.scrollWidth));
+  }, { immediate: true }));
+</script>
+
+<style lang="scss" module>
+@import "~@/assets/scss/theme";
+
+.ldBreadcrumbOverflowMask {
+  position: absolute;
+  width: 100%;
+  height: 100%;
+  background: linear-gradient(
+    to right,
+    rgba($panel-top-bgcolor, 1) $breadcrumb-margins,
+    rgba($panel-top-bgcolor, 0) $breadcrumb-overflow-mask-size
+  );
+  pointer-events: none;
+}
+
+.ldBreadcrumb {
+  ul {
+    display: flex;
+    white-space: nowrap;
+    list-style: none;
+    padding: 2px; // Necessary for the focus outline
+    align-items: center;
+    li {
+      > * {
+        margin-left: $breadcrumb-margins;
+      }
+      > a {
+        padding: $breadcrumb-margins 2px;
+      }
+    }
+  }
+  &:global(.scrollbar) {
+    overflow-y: hidden;
+    scrollbar-width: none;
+    &::-webkit-scrollbar {
+      height: 0;
+    }
+  }
+}
+</style>
-- 
cgit v1.2.3

