@ulu/frontend-vue 0.1.0-beta.34 → 0.1.0-beta.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,15 +1,15 @@
1
1
  <template>
2
2
  <div
3
- class="CollapsibleRegion"
3
+ class="collapsible-region"
4
4
  @keydown.esc="handleEscape"
5
5
  :class="{
6
- 'CollapsibleRegion--open' : isOpen,
7
- 'CollapsibleRegion--closed' : !isOpen,
8
- 'CollapsibleRegion--transitioning' : isTransitioning
6
+ 'collapsible-region--open' : isOpen,
7
+ 'collapsible-region--closed' : !isOpen,
8
+ 'collapsible-region--transitioning' : isTransitioning
9
9
  }"
10
10
  >
11
11
  <button
12
- class="CollapsibleRegion__toggle"
12
+ class="collapsible-region__toggle"
13
13
  :id="toggleId"
14
14
  :aria-controls="contentId"
15
15
  :aria-expanded="isOpen"
@@ -20,7 +20,7 @@
20
20
  </slot>
21
21
  </button>
22
22
  <div
23
- class="CollapsibleRegion__content"
23
+ class="collapsible-region__content"
24
24
  tabindex="-1"
25
25
  ref="content"
26
26
  :id="contentId"
@@ -34,7 +34,7 @@
34
34
  as they interfere with getting accurate measurements of the content
35
35
  when it's hidden (scrollHeight)
36
36
  -->
37
- <div class="CollapsibleRegion__content-inner">
37
+ <div class="collapsible-region__content-inner">
38
38
  <slot/>
39
39
  </div>
40
40
  </div>
@@ -1,10 +1,10 @@
1
1
  <template>
2
2
  <div class="UluFacetsFilters">
3
3
  <UluCollapsibleRegion
4
- class="UluFacets__group"
4
+ class="ulu-facets__group"
5
5
  :class="classes.group"
6
- :classToggle="['UluFacets__group-toggle', classes.groupToggle]"
7
- :classContent="['UluFacets__group-content', classes.groupContent]"
6
+ :classToggle="['ulu-facets__group-toggle', classes.groupToggle]"
7
+ :classContent="['ulu-facets__group-content', classes.groupContent]"
8
8
  v-for="group in facets"
9
9
  :key="group.uid"
10
10
  :group="group"
@@ -29,7 +29,7 @@
29
29
  />
30
30
  <UluCollapsibleRegion
31
31
  v-if="group.children.length > maxVisible"
32
- class="UluFacets__more-facets"
32
+ class="ulu-facets__more-facets"
33
33
  :class="classes.moreFacets"
34
34
  :clickOutsideCloses="false"
35
35
  :closeOnEscape="false"
@@ -1,16 +1,16 @@
1
1
  <template>
2
- <div class="UluFacetsDropdownFilters">
2
+ <div class="facets-dropdown-filters">
3
3
  <div
4
- class="UluFacetsDropdownFilters__group"
4
+ class="facets-dropdown-filters__group"
5
5
  v-for="group in facets"
6
6
  :key="group.uid"
7
7
  >
8
- <label :for="`facet-dropdown-${group.uid}`" class="UluFacetsDropdownFilters__label">
8
+ <label :for="`facet-dropdown-${group.uid}`" class="facets-dropdown-filters__label">
9
9
  {{ group.name }}
10
10
  </label>
11
11
  <select
12
12
  :id="`facet-dropdown-${group.uid}`"
13
- class="UluFacetsDropdownFilters__select"
13
+ class="facets-dropdown-filters__select"
14
14
  @change="onFilterChange(group, $event)"
15
15
  >
16
16
  <option value="">All {{ group.name }}s</option>
@@ -57,13 +57,13 @@ function onFilterChange(group, event) {
57
57
  </script>
58
58
 
59
59
  <style lang="scss">
60
- .UluFacetsDropdownFilters {
60
+ .facets-dropdown-filters {
61
61
  display: flex;
62
62
  gap: 1rem;
63
63
  align-items: center;
64
64
  flex-wrap: wrap;
65
65
  }
66
- .UluFacetsDropdownFilters__group {
66
+ .facets-dropdown-filters__group {
67
67
  display: flex;
68
68
  gap: 0.5rem;
69
69
  align-items: center;
@@ -1,9 +1,9 @@
1
1
  <template>
2
- <div class="UluFacetsHeaderLayout">
3
- <div class="UluFacetsHeaderLayout__header">
2
+ <div class="facets-header-layout">
3
+ <div class="facets-header-layout__header">
4
4
  <slot name="header"></slot>
5
5
  </div>
6
- <div class="UluFacetsHeaderLayout__main">
6
+ <div class="facets-header-layout__main">
7
7
  <slot name="main"></slot>
8
8
  </div>
9
9
  </div>
@@ -14,7 +14,7 @@
14
14
  </script>
15
15
 
16
16
  <style lang="scss">
17
- .UluFacetsHeaderLayout__header {
17
+ .facets-header-layout__header {
18
18
  display: flex;
19
19
  gap: 1rem;
20
20
  align-items: center;
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <UluSelectableMenu
3
- class="UluFacets__facet-list"
3
+ class="ulu-facets__facet-list"
4
4
  :legend="groupUid"
5
5
  :type="type"
6
6
  :options="menuOptions"
@@ -1,14 +1,14 @@
1
1
  <template>
2
- <div class="UluFacetsResults">
2
+ <div class="facets-results">
3
3
  <transition-group
4
4
  v-if="items.length"
5
5
  :tag="tag"
6
6
  :name="transitionName"
7
- class="UluFacetsResults__list"
7
+ class="facets-results__list"
8
8
  :class="classes.list"
9
9
  >
10
10
  <li
11
- class="UluFacetsResults__item"
11
+ class="facets-results__item"
12
12
  :class="classes.item"
13
13
  v-for="(item, index) in items"
14
14
  :key="item.id || index"
@@ -16,7 +16,7 @@
16
16
  <slot name="item" :item="item" :index="index"></slot>
17
17
  </li>
18
18
  </transition-group>
19
- <div v-else class="UluFacetsResults__empty">
19
+ <div v-else class="facets-results__empty">
20
20
  <slot name="empty">
21
21
  <p>No matching items found.</p>
22
22
  </slot>
@@ -36,7 +36,7 @@
36
36
  },
37
37
  transitionName: {
38
38
  type: String,
39
- default: 'UluFacetsFade'
39
+ default: 'facets-fade'
40
40
  },
41
41
  classes: {
42
42
  type: Object,
@@ -46,18 +46,18 @@
46
46
  </script>
47
47
 
48
48
  <style lang="scss">
49
- .UluFacetsResults__list {
49
+ .facets-results__list {
50
50
  list-style: none;
51
51
  padding: 0;
52
52
  }
53
53
 
54
- .UluFacetsFade-enter-active,
55
- .UluFacetsFade-leave-active {
54
+ .facets-fade-enter-active,
55
+ .facets-fade-leave-active {
56
56
  transition: opacity 0.25s ease;
57
57
  }
58
58
 
59
- .UluFacetsFade-enter-from,
60
- .UluFacetsFade-leave-to {
59
+ .facets-fade-enter-from,
60
+ .facets-fade-leave-to {
61
61
  opacity: 0;
62
62
  }
63
63
  </style>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="UluFacets__keyword-search">
2
+ <div class="ulu-facets__keyword-search">
3
3
  <label :class="classes.searchLabel" :for="id">
4
4
  <strong>Search</strong>
5
5
  </label>
@@ -1,31 +1,70 @@
1
1
  <template>
2
- <div class="UluFacetsSidebarLayout">
3
- <div class="UluFacetsSidebarLayout__header">
2
+ <div
3
+ class="facets-sidebar-layout"
4
+ :class="{ 'facets-sidebar-layout--filters-hidden' : isMobile }"
5
+ >
6
+ <div class="facets-sidebar-layout__header">
4
7
  <slot name="header"></slot>
5
8
  </div>
6
- <div class="UluFacetsSidebarLayout__body">
7
- <div class="UluFacetsSidebarLayout__sidebar">
8
- <slot name="sidebar"></slot>
9
- </div>
10
- <div class="UluFacetsSidebarLayout__main">
9
+
10
+ <div v-show="isMobile" class="facets-sidebar-layout__mobile-controls">
11
+ <button class="button" @click="showMobileFilters = true">Filters & Sort</button>
12
+ </div>
13
+
14
+ <div class="facets-sidebar-layout__body">
15
+ <!-- Desktop container for the sidebar -->
16
+ <div v-show="!isMobile" class="facets-sidebar-layout__sidebar" ref="desktopTarget"></div>
17
+
18
+ <div class="facets-sidebar-layout__main">
11
19
  <slot name="main"></slot>
12
20
  </div>
13
21
  </div>
22
+
23
+ <UluModal
24
+ v-if="isMobile"
25
+ v-model="showMobileFilters"
26
+ position="right"
27
+ title="Filters & Sort"
28
+ allowResize
29
+ >
30
+ <!-- Mobile container for the sidebar -->
31
+ <div class="facets-sidebar-layout__sidebar" ref="mobileTarget"></div>
32
+ </UluModal>
33
+
34
+ <teleport :to="teleportTarget" v-if="teleportTarget">
35
+ <slot name="sidebar"></slot>
36
+ </teleport>
14
37
  </div>
15
38
  </template>
16
39
 
17
40
  <script setup>
18
- // This component is purely for layout, no logic needed.
41
+ import { ref, inject, computed } from 'vue';
42
+ import UluModal from '../../collapsible/UluModal.vue';
43
+
44
+ const showMobileFilters = ref(false);
45
+ const isMobile = inject("uluIsMobile");
46
+
47
+ const desktopTarget = ref(null);
48
+ const mobileTarget = ref(null);
49
+
50
+ const teleportTarget = computed(() => {
51
+ if (isMobile.value) {
52
+ return mobileTarget.value;
53
+ } else {
54
+ return desktopTarget.value;
55
+ }
56
+ });
19
57
  </script>
20
58
 
21
59
  <style lang="scss">
22
- .UluFacetsSidebarLayout__body {
23
- display: grid;
24
- grid-template-columns: 1fr;
25
- gap: 2rem;
26
-
27
- @media (min-width: 768px) {
60
+ .facets-sidebar-layout__body {
61
+ display: grid;
28
62
  grid-template-columns: 250px 1fr;
63
+ gap: 2rem;
64
+ }
65
+ .facets-sidebar-layout--filters-hidden {
66
+ .facets-sidebar-layout__body {
67
+ grid-template-columns: 1fr;
68
+ }
29
69
  }
30
- }
31
- </style>
70
+ </style>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="UluFacetsSort" :class="classes.sortForm">
2
+ <div class="facets-sort" :class="classes.sortForm">
3
3
  <label
4
4
  :for="sortId"
5
5
  :class="classes.sortFormLabel"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ulu/frontend-vue",
3
- "version": "0.1.0-beta.34",
3
+ "version": "0.1.0-beta.35",
4
4
  "description": "A modular and tree-shakeable Vue 3 component library for the Ulu frontend",
5
5
  "type": "module",
6
6
  "files": [