@paris-ias/list 1.0.4 → 1.0.5

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.
Files changed (99) hide show
  1. package/example/.env.example +3 -0
  2. package/example/nuxt.config.ts +19 -0
  3. package/example/pages/index.vue +27 -0
  4. package/package.json +3 -3
  5. package/src/module.ts +119 -0
  6. package/src/runtime/components/events/Badges.vue +73 -0
  7. package/src/runtime/components/events/DateTimePlace.vue +77 -0
  8. package/src/runtime/components/events/DenseItem.vue +40 -0
  9. package/src/runtime/components/events/ExpandedItem.vue +11 -0
  10. package/src/runtime/components/events/ListContainer.vue +41 -0
  11. package/src/runtime/components/events/RegisterModal.vue +51 -0
  12. package/src/runtime/components/events/RelatedItem.vue +44 -0
  13. package/src/runtime/components/events/RowsItem.vue +114 -0
  14. package/src/runtime/components/events/View.vue +333 -0
  15. package/src/runtime/components/fellowships/Badges.vue +48 -0
  16. package/src/runtime/components/fellowships/DenseItem.vue +39 -0
  17. package/src/runtime/components/fellowships/ExpandedItem.vue +7 -0
  18. package/src/runtime/components/fellowships/RegisterModal.vue +41 -0
  19. package/src/runtime/components/fellowships/RowsItem.vue +61 -0
  20. package/src/runtime/components/fellowships/View.vue +210 -0
  21. package/src/runtime/components/list/atoms/FiltersMenu.vue +46 -0
  22. package/src/runtime/components/list/atoms/SearchInput.vue +129 -0
  23. package/src/runtime/components/list/atoms/SearchItem.vue +59 -0
  24. package/src/runtime/components/list/atoms/SearchString.vue +161 -0
  25. package/src/runtime/components/list/atoms/SortMenu.vue +97 -0
  26. package/src/runtime/components/list/atoms/ViewMenu.vue +71 -0
  27. package/src/runtime/components/list/inputs/AutoComplete.vue +22 -0
  28. package/src/runtime/components/list/inputs/BooleanSwitch.vue +18 -0
  29. package/src/runtime/components/list/inputs/Checkbox.vue +21 -0
  30. package/src/runtime/components/list/inputs/Select.vue +25 -0
  31. package/src/runtime/components/list/molecules/Filters.vue +97 -0
  32. package/src/runtime/components/list/molecules/Header.vue +47 -0
  33. package/src/runtime/components/list/molecules/Pagination.vue +243 -0
  34. package/src/runtime/components/list/organisms/List.vue +92 -0
  35. package/src/runtime/components/list/views/Dense.vue +25 -0
  36. package/src/runtime/components/list/views/Expanded.vue +10 -0
  37. package/src/runtime/components/list/views/Grid.vue +13 -0
  38. package/src/runtime/components/list/views/Rows.vue +13 -0
  39. package/src/runtime/components/list/views/Table.vue +13 -0
  40. package/src/runtime/components/misc/atoms/CountUp.vue +198 -0
  41. package/src/runtime/components/misc/atoms/DateStamp.vue +104 -0
  42. package/src/runtime/components/misc/atoms/ImageContainer.vue +105 -0
  43. package/src/runtime/components/misc/atoms/ShareMenu.vue +60 -0
  44. package/src/runtime/components/misc/atoms/Socials.vue +127 -0
  45. package/src/runtime/components/misc/molecules/ChipContainer.vue +35 -0
  46. package/src/runtime/components/misc/molecules/Related.vue +41 -0
  47. package/src/runtime/components/misc/molecules/RelatedItems.vue +29 -0
  48. package/src/runtime/components/misc/molecules/SearchItem.vue +26 -0
  49. package/src/runtime/components/news/DenseItem.vue +62 -0
  50. package/src/runtime/components/news/ExpandedItem.vue +153 -0
  51. package/src/runtime/components/news/Header.vue +9 -0
  52. package/src/runtime/components/news/RelatedItem.vue +44 -0
  53. package/src/runtime/components/news/RowsItem.vue +160 -0
  54. package/src/runtime/components/news/View.vue +190 -0
  55. package/src/runtime/components/people/DenseItem.vue +37 -0
  56. package/src/runtime/components/people/ExpandedItem.vue +16 -0
  57. package/src/runtime/components/people/GroupBadges.vue +56 -0
  58. package/src/runtime/components/people/RelatedItem.vue +41 -0
  59. package/src/runtime/components/people/RowsItem.vue +95 -0
  60. package/src/runtime/components/people/View.vue +162 -0
  61. package/src/runtime/components/projects/ExpandedItem.vue +14 -0
  62. package/src/runtime/components/projects/RelatedItem.vue +44 -0
  63. package/src/runtime/components/projects/RowsItem.vue +106 -0
  64. package/src/runtime/components/projects/View.vue +131 -0
  65. package/src/runtime/components/publications/RelatedItem.vue +44 -0
  66. package/src/runtime/components/publications/RowsItem.vue +105 -0
  67. package/src/runtime/components/publications/View.vue +139 -0
  68. package/src/runtime/composables/useFetchItem.ts +64 -0
  69. package/src/runtime/composables/useIcons.ts +30 -0
  70. package/src/runtime/composables/useUtils.ts +75 -0
  71. package/src/runtime/graphql/queries/buildFiltersValues.gql +35 -0
  72. package/src/runtime/graphql/queries/item/action.gql +0 -0
  73. package/src/runtime/graphql/queries/item/apps.gql +0 -0
  74. package/src/runtime/graphql/queries/item/events.gql +120 -0
  75. package/src/runtime/graphql/queries/item/fellowships.gql +164 -0
  76. package/src/runtime/graphql/queries/item/news.gql +129 -0
  77. package/src/runtime/graphql/queries/item/people.gql +174 -0
  78. package/src/runtime/graphql/queries/item/projects.gql +171 -0
  79. package/src/runtime/graphql/queries/item/publications.gql +169 -0
  80. package/src/runtime/graphql/queries/item/users.gql +0 -0
  81. package/src/runtime/graphql/queries/list/action.gql +0 -0
  82. package/src/runtime/graphql/queries/list/apps.gql +32 -0
  83. package/src/runtime/graphql/queries/list/events.gql +44 -0
  84. package/src/runtime/graphql/queries/list/fellowships.gql +53 -0
  85. package/src/runtime/graphql/queries/list/news.gql +39 -0
  86. package/src/runtime/graphql/queries/list/people.gql +49 -0
  87. package/src/runtime/graphql/queries/list/projects.gql +37 -0
  88. package/src/runtime/graphql/queries/list/publications.gql +37 -0
  89. package/src/runtime/graphql/queries/list/search.gql +148 -0
  90. package/src/runtime/graphql/queries/list/users.gql +32 -0
  91. package/src/runtime/graphql/queries/login.gql +0 -0
  92. package/src/runtime/plugins/pinia.ts +88 -0
  93. package/src/runtime/plugins/vuetify.js +21 -0
  94. package/src/runtime/stores/factory.ts +18 -0
  95. package/src/runtime/stores/root.ts +353 -0
  96. package/src/runtime/translations/en.json +436 -0
  97. package/src/runtime/translations/fr.json +429 -0
  98. package/src/runtime/types/imports.d.ts +13 -0
  99. package/src/runtime/types/stores.d.ts +11 -0
@@ -0,0 +1,29 @@
1
+ <template>
2
+ <div class="pa-6 border-thin w-100">
3
+ <div class="text-overline">{{ $t("related." + type) }}</div>
4
+ <component
5
+ :is="capitalize(type) + 'RelatedItem'"
6
+ v-for="item in items"
7
+ :key="item.id || item.slug || item.name"
8
+ :item="item"
9
+ />
10
+ </div>
11
+ </template>
12
+
13
+ <script setup>
14
+ import { useRootStore } from "../../../stores/root"
15
+ import { capitalize } from "../../../composables/useUtils"
16
+ const rootStore = useRootStore()
17
+ const props = defineProps({
18
+ type: {
19
+ type: String,
20
+ required: true,
21
+ },
22
+ items: {
23
+ type: Array,
24
+ required: true,
25
+ },
26
+ })
27
+ </script>
28
+
29
+ <style></style>
@@ -0,0 +1,26 @@
1
+ <template>
2
+ <v-card class="mx-auto" variant="flat">
3
+ <v-row>
4
+ <v-col cols="12" md="2">
5
+ <MiscAtomsImageContainer
6
+ cover
7
+ :loading="rootStore.loading"
8
+ :src="item.image"
9
+ :ratio="1 / 1"
10
+ />
11
+ </v-col>
12
+ <v-col cols="12" md="10">
13
+ <div class="text-body-1">{{ item.name }}</div>
14
+ <div>
15
+ <span class="text-primary text-body-2"> {{ item.name }}</span> &mdash;
16
+ <span class="text-body-2"> {{ item.subtitle }}</span>
17
+ </div>
18
+ </v-col>
19
+ </v-row>
20
+ </v-card>
21
+ </template>
22
+
23
+ <script setup>
24
+ import { useRootStore } from "../../../stores/root"
25
+ const rootStore = useRootStore()
26
+ </script>
@@ -0,0 +1,62 @@
1
+ <template>
2
+ <v-row
3
+ v-ripple
4
+ class="cursor-pointer highlight-on-hover"
5
+ @click="$router.push(localePath('/news/' + item.slug[locale]))"
6
+ >
7
+ <v-col align-self="center" cols="7" class="text-h6 dense">
8
+ <v-skeleton-loader
9
+ v-if="rootStore.loading || $stores[type].loading"
10
+ type="heading"
11
+ />
12
+ <template v-else>
13
+ {{ item.name }}
14
+ </template>
15
+ </v-col>
16
+
17
+ <v-col align-self="center" cols="5" class="dense">
18
+ <v-skeleton-loader
19
+ v-if="rootStore.loading || $stores[type].loading"
20
+ :type="
21
+ ['chip', 'chip@2', 'chip@3', 'chip@4', 'chip@4', 'chip@4'][
22
+ ['xs', 'sm', 'md', 'lg', 'xl', 'xxl'].indexOf(name || 'md')
23
+ ]
24
+ "
25
+ />
26
+
27
+ <template v-else>
28
+ <v-chip class="ma-2" style="background-color: white; color: black">{{
29
+ $t(eventCategory)
30
+ }}</v-chip>
31
+ <MiscMoleculesChipContainer :items="item.tags" size="small" />
32
+ </template>
33
+ </v-col>
34
+ </v-row>
35
+ </template>
36
+ <script setup>
37
+ import { useDisplay } from "vuetify"
38
+ import { useRootStore } from "../../stores/root"
39
+ const { $stores } = useNuxtApp()
40
+ const { name } = useDisplay()
41
+ const localePath = useLocalePath()
42
+ const { locale } = useI18n()
43
+
44
+ const rootStore = useRootStore()
45
+ const props = defineProps({
46
+ item: {
47
+ type: Object,
48
+ required: true,
49
+ },
50
+ index: {
51
+ type: Number,
52
+ required: true,
53
+ },
54
+ })
55
+ const eventCategory = computed(() => {
56
+ if (props.item.category) {
57
+ return "list.filters.news.category." + props.item.category
58
+ } else {
59
+ return "list.filters.news.category.others"
60
+ }
61
+ })
62
+ </script>
@@ -0,0 +1,153 @@
1
+ <template>
2
+ <v-row
3
+ v-ripple
4
+ class="expanded-item my-6 cursor-pointer"
5
+ :class="expanded ? 'expanded' : 'collapsed'"
6
+ @click="expanded = !expanded"
7
+ >
8
+ <v-col
9
+ cols="12"
10
+ :md="expanded ? '4' : '2'"
11
+ class="animated-col"
12
+ @click.prevent="
13
+ expanded
14
+ ? router.push(
15
+ localePath({
16
+ name: 'news-slug',
17
+ params: { slug: item.slug[locale] },
18
+ })
19
+ )
20
+ : null
21
+ "
22
+ >
23
+ <MiscAtomsImageContainer
24
+ cover
25
+ :loading="rootStore.loading"
26
+ :src="item.image"
27
+ :ratio="1 / 1"
28
+ />
29
+ </v-col>
30
+ <v-col class="text-h5" cols="12" :md="expanded ? '8' : '9'">
31
+ <div
32
+ :class="expanded ? 'text-h4' : 'text-h5'"
33
+ @click.prevent="
34
+ expanded
35
+ ? router.push(
36
+ localePath({
37
+ name: 'news-slug',
38
+ params: { slug: item.slug[locale] },
39
+ })
40
+ )
41
+ : null
42
+ "
43
+ >
44
+ <MDC v-if="item.name" :value="item.name" />
45
+ </div>
46
+ <v-expand-transition v-if="lgAndUp">
47
+ <div v-show="expanded">
48
+ <MiscMoleculesChipContainer :items="item.tags" />
49
+ </div>
50
+ </v-expand-transition>
51
+ <MDC
52
+ v-if="item.summary"
53
+ class="text-body-1 text-wrap clamped-text"
54
+ :style="
55
+ '-webkit-line-clamp:' +
56
+ (expanded ? [5, 5, 3, 6, 9, 11] : [5, 5, 2, 4, 6, 8])[
57
+ ['xs', 'sm', 'md', 'lg', 'xl', 'xxl'].indexOf(name || 'md')
58
+ ]
59
+ "
60
+ :value="item.summary"
61
+ />
62
+
63
+ <v-expand-transition>
64
+ <v-btn
65
+ v-show="expanded"
66
+ class="mt-4"
67
+ variant="outlined"
68
+ tile
69
+ @click.prevent="
70
+ router.push(
71
+ localePath({
72
+ name: 'news-slug',
73
+ params: { slug: item.slug[locale] },
74
+ })
75
+ )
76
+ "
77
+ >
78
+ {{ $t("read-more") }}
79
+ </v-btn>
80
+ </v-expand-transition>
81
+ </v-col>
82
+ </v-row>
83
+ </template>
84
+
85
+ <script setup>
86
+ import { useDisplay } from "vuetify"
87
+ import { useRootStore } from "../../stores/root"
88
+ const router = useRouter()
89
+ const rootStore = useRootStore()
90
+ const expanded = ref(false)
91
+ const { name, lgAndUp } = useDisplay()
92
+ const { locale } = useI18n()
93
+ const props = defineProps({
94
+ item: {
95
+ type: Object,
96
+ required: true,
97
+ },
98
+ index: {
99
+ type: Number,
100
+ required: true,
101
+ },
102
+ })
103
+ </script>
104
+
105
+ <style lang="scss" scoped>
106
+ .expanded-item {
107
+ overflow: hidden;
108
+ transition: all 0.3s ease-in-out;
109
+
110
+ &.expanded {
111
+ .v-col:first-child {
112
+ flex: 0 0 33.333%;
113
+ max-width: 33.333%;
114
+ }
115
+
116
+ .v-col:last-child {
117
+ flex: 0 0 66.666%;
118
+ max-width: 66.666%;
119
+ }
120
+ }
121
+
122
+ &.collapsed {
123
+ .v-col:first-child {
124
+ flex: 0 0 16.666%;
125
+ max-width: 16.666%;
126
+ }
127
+
128
+ .v-col:last-child {
129
+ flex: 0 0 83.333%;
130
+ max-width: 83.333%;
131
+ }
132
+ }
133
+
134
+ .animated-col {
135
+ transition: flex 0.3s ease-in-out, max-width 0.3s ease-in-out;
136
+ }
137
+ }
138
+
139
+ .fade-in {
140
+ animation: fadeIn 1s ease-in-out;
141
+
142
+ @keyframes fadeIn {
143
+ from {
144
+ opacity: 0;
145
+ transform: scale(0.9);
146
+ }
147
+ to {
148
+ opacity: 1;
149
+ transform: scale(1);
150
+ }
151
+ }
152
+ }
153
+ </style>
@@ -0,0 +1,9 @@
1
+ <template>
2
+ <v-row> <v-col cols="12" /> </v-row>
3
+ </template>
4
+ <script setup lang="ts">
5
+ // import { useDisplay } from "vuetify"
6
+ // const { smAndUp } = useDisplay()
7
+ // const localePath = useLocalePath()
8
+ </script>
9
+ <style lang="scss"></style>
@@ -0,0 +1,44 @@
1
+ <template>
2
+ <v-sheet
3
+ :to="
4
+ localePath({
5
+ name: 'news-slug',
6
+ params: { slug: item.name },
7
+ })
8
+ "
9
+ >
10
+ <v-row>
11
+ <v-col v-if="lgAndUp" cols="3">
12
+ <MiscAtomsImageContainer
13
+ cover
14
+ :src="item.image"
15
+ :loading="rootStore.loading"
16
+ :ratio="1 / 1"
17
+ :link="item.name"
18
+ name="news-slug"
19
+ />
20
+ </v-col>
21
+ <v-col cols="12" lg="9">
22
+ <v-skeleton-loader v-if="rootStore.loading" type="heading, text@3" />
23
+ <template v-else>
24
+ <div class="text-h6">
25
+ {{ item.name }}
26
+ </div>
27
+ <div class="text-body-1">
28
+ {{ item.description }}
29
+ </div>
30
+ </template>
31
+ </v-col></v-row
32
+ ></v-sheet
33
+ >
34
+ </template>
35
+
36
+ <script setup>
37
+ import { useDisplay } from "vuetify"
38
+ import { useRootStore } from "../../stores/root"
39
+ const localePath = useLocalePath()
40
+ const rootStore = useRootStore()
41
+ const { lgAndUp } = useDisplay()
42
+
43
+ const props = defineProps({ item: { type: Object, required: true } })
44
+ </script>
@@ -0,0 +1,160 @@
1
+ <template>
2
+ <v-divider v-if="index > 0" />
3
+ <v-row class="my-4 mx-2 mx-md-0 highlight-on-hover">
4
+ <v-col v-if="mdAndUp" cols="12" md="4" lg="3" class="pr-md-0">
5
+ <MiscAtomsImageContainer
6
+ cover
7
+ :src="item.image.url ? item.image : '/default.png'"
8
+ :ratio="1 / 1"
9
+ :loading="$stores.news.loading"
10
+ link="news-slug"
11
+ :slug="item._path && item._path.split('/').pop()"
12
+ >
13
+ <v-chip class="ma-2" style="background-color: white; color: black">{{
14
+ $t(eventCategory)
15
+ }}</v-chip></MiscAtomsImageContainer
16
+ >
17
+ </v-col>
18
+ <v-col cols="12" md="8" lg="4" class="pl-md-6">
19
+ <v-skeleton-loader
20
+ v-if="rootStore.loading || $stores.news.loading"
21
+ :type="
22
+ [
23
+ 'heading, subtitle, text@5, ossein, button',
24
+ 'heading, subtitle, text@5, ossein, button',
25
+ 'heading, subtitle, text@3, ossein, button',
26
+ 'heading@2, subtitle',
27
+ 'heading@2, subtitle',
28
+ 'heading@2, subtitle',
29
+ ][['xs', 'sm', 'md', 'lg', 'xl', 'xxl'].indexOf(name || 'md')]
30
+ "
31
+ />
32
+
33
+ <template v-else>
34
+ <template v-if="smAndDown && item.category">
35
+ <v-chip class="mb-4">{{
36
+ $t("list.filters.news.category." + item.category)
37
+ }}</v-chip>
38
+ <br
39
+ /></template>
40
+
41
+ <NuxtLink
42
+ :to="
43
+ localePath({
44
+ name: 'news-slug',
45
+ params: { slug: item.slug[locale] },
46
+ })
47
+ "
48
+ class="text-wrap text-h5 text-md-h4 text-black"
49
+ >
50
+ {{ item.name }}
51
+ </NuxtLink>
52
+ <div class="tex-overline mt-3">
53
+ {{ formatDateValue(item.date, locale) }}
54
+ </div>
55
+ <MiscMoleculesChipContainer
56
+ v-if="item.tags && item.tags.length"
57
+ :items="item.tags"
58
+ class="mt-4"
59
+ />
60
+ <template v-if="mdAndDown">
61
+ <MDC
62
+ v-if="item.summary"
63
+ :value="item.summary"
64
+ class="text-body-1 text-wrap clamped-text"
65
+ :style="
66
+ '-webkit-line-clamp:' +
67
+ [5, 5, 3, 6, 10, 10][
68
+ ['xs', 'sm', 'md', 'lg', 'xl', 'xxl'].indexOf(name || 'md')
69
+ ]
70
+ "
71
+ />
72
+ <v-btn
73
+ class="mt-4"
74
+ variant="outlined"
75
+ tile
76
+ size="small"
77
+ :to="
78
+ localePath({
79
+ name: 'news-slug',
80
+ params: { slug: item.slug[locale] },
81
+ })
82
+ "
83
+ >
84
+ {{ $t("read-more") }}
85
+ </v-btn>
86
+ </template>
87
+ </template>
88
+ </v-col>
89
+
90
+ <v-col v-if="lgAndUp" cols="12" lg="5">
91
+ <v-skeleton-loader
92
+ v-if="rootStore.loading || $stores.news.loading"
93
+ type="text@8, ossein, button"
94
+ />
95
+
96
+ <template v-else>
97
+ <MDC
98
+ v-if="item.summary"
99
+ :value="item.summary"
100
+ class="text-body-1 text-wrap clamped-text"
101
+ :style="
102
+ '-webkit-line-clamp:' +
103
+ [5, 5, 4, 7, 8, 10][
104
+ ['xs', 'sm', 'md', 'lg', 'xl', 'xxl'].indexOf(name || 'md')
105
+ ]
106
+ "
107
+ />
108
+ <p v-else />
109
+ <v-btn
110
+ class="mt-4"
111
+ variant="outlined"
112
+ tile
113
+ :to="
114
+ localePath({
115
+ name: 'news-slug',
116
+ params: { slug: item.slug[locale] },
117
+ })
118
+ "
119
+ :size="
120
+ ['small', 'small', 'small', 'default', 'default', 'large'][
121
+ ['xs', 'sm', 'md', 'lg', 'xl', 'xxl'].indexOf(name || 'md')
122
+ ]
123
+ "
124
+ >
125
+ {{ $t("read-more") }}
126
+ </v-btn>
127
+ </template>
128
+ </v-col>
129
+ </v-row>
130
+ <!-- <MiscMoleculesSearchItem></MiscMoleculesSearchItem> -->
131
+ </template>
132
+
133
+ <script setup>
134
+ import { useRootStore } from "../../stores/root"
135
+ import { useDisplay } from "vuetify"
136
+ const { $stores } = useNuxtApp()
137
+ const { locale } = useI18n()
138
+ const localePath = useLocalePath()
139
+ const rootStore = useRootStore()
140
+ const { name, smAndDown, mdAndDown, mdAndUp, lgAndUp } = useDisplay()
141
+ const eventCategory = computed(() => {
142
+ if (props.item.category) {
143
+ return "list.filters.news.category." + props.item.category
144
+ } else {
145
+ return "list.filters.news.category.others"
146
+ }
147
+ })
148
+ const props = defineProps({
149
+ item: {
150
+ type: Object,
151
+ required: true,
152
+ },
153
+ index: {
154
+ type: Number,
155
+ required: true,
156
+ },
157
+ })
158
+ </script>
159
+
160
+ <style></style>
@@ -0,0 +1,190 @@
1
+ <template>
2
+ <v-row>
3
+ <v-col
4
+ v-if="smAndDown"
5
+ cols="12"
6
+ class="text-wrap text-h4 text-black mx-sm-6"
7
+ >
8
+ <v-skeleton-loader
9
+ v-if="loading"
10
+ :type="['heading', 'heading'][['xs', 'sm'].indexOf(name || 'sm')]"
11
+ />
12
+ <template v-else>
13
+ <v-chip v-if="item && item.category && item.name" class="mb-4">{{
14
+ $t("list.filters.news.category." + item.category)
15
+ }}</v-chip>
16
+ <br />
17
+ {{ item.name }}
18
+ </template>
19
+ </v-col>
20
+ <v-col cols="12" md="4" class="pb-0">
21
+ <v-skeleton-loader v-if="loading" height="100%" type="image" />
22
+
23
+ <div v-else class="mx-sm-6">
24
+ <MiscAtomsImageContainer
25
+ v-if="item && item.image"
26
+ cover
27
+ :loading="loading"
28
+ :src="item.image.url ? item.image : '/default.png'"
29
+ :ratio="1 / 1"
30
+ />
31
+ </div>
32
+ </v-col>
33
+
34
+ <v-col cols="12" md="8" class="pl-0 pb-0 d-flex flex-column justify-md-end">
35
+ <v-skeleton-loader
36
+ v-if="loading"
37
+ :type="
38
+ [
39
+ 'text, chip@4',
40
+ 'text, chip@4',
41
+ 'heading, text',
42
+ 'heading, text',
43
+ 'heading, text',
44
+ 'heading',
45
+ ][['xs', 'sm', 'md', 'lg', 'xl', 'xxl'].indexOf(name || 'md')]
46
+ "
47
+ />
48
+
49
+ <div v-else class="mx-4 mx-md-0 justify-md-end">
50
+ <v-chip v-if="item && item.category && mdAndUp" class="mb-4">{{
51
+ $t("list.filters.news.category." + item.category)
52
+ }}</v-chip>
53
+ <div
54
+ v-if="item && item.name && mdAndUp"
55
+ class="d-flex text-wrap text-h4 text-black"
56
+ >
57
+ {{ item.name }}
58
+ </div>
59
+
60
+ <div
61
+ v-if="renderedDescription && mdAndUp"
62
+ class="d-flex text-wrap text-h6 text-black mt-3"
63
+ >
64
+ <MDC
65
+ v-if="item.description"
66
+ :value="item.description"
67
+ class="mt-md-n2 mx-4 mx-sm-8 mx-md-0"
68
+ />
69
+ </div>
70
+ <div
71
+ class="d-flex flex-column flex-md-row align-md-center mt-6 mx-sm-4 mx-md-6"
72
+ >
73
+ <div class="ml-md-n6">
74
+ <div
75
+ v-if="item && item.authors && item.authors[0]"
76
+ class="text-body-2 text-lg-body-1 text-black"
77
+ >
78
+ <!-- TODO use a proper & conditional formatting of names (depending on number of authors) -->
79
+ {{
80
+ $t("by-author", [
81
+ item.authors[0].firstname + " " + item.authors[0].firstname,
82
+ ])
83
+ }}
84
+ </div>
85
+ <div v-if="smAndDown" class="">
86
+ <MiscMoleculesChipContainer
87
+ v-if="item && item.tags"
88
+ :items="item.tags"
89
+ class="mt-4"
90
+ />
91
+ </div>
92
+ </div>
93
+ </div>
94
+ </div>
95
+ </v-col>
96
+ </v-row>
97
+
98
+ <v-row class="mt-12">
99
+ <v-col cols="12" md="4" :order="mdAndUp ? 'first' : 'last'" class="pt-0">
100
+ <v-skeleton-loader
101
+ v-if="loading"
102
+ :type="
103
+ ['chip@2', 'chip@3', 'chip@4', 'chip@5'][
104
+ ['md', 'lg', 'xl', 'xxl'].indexOf(name || 'md')
105
+ ]
106
+ "
107
+ />
108
+ <template v-else>
109
+ <div v-if="mdAndUp" class="mt-2 mx-sm-6">
110
+ <MiscMoleculesChipContainer
111
+ v-if="item && item.tags"
112
+ :items="item.tags"
113
+ class="mt-4"
114
+ />
115
+ </div>
116
+ </template>
117
+ </v-col>
118
+ <v-col cols="12" md="8" class="pl-0 pt-0">
119
+ <v-skeleton-loader
120
+ v-if="loading"
121
+ :type="
122
+ ['text@50', 'text@50', 'text@50', 'text@50', 'text@50', 'text@50'][
123
+ ['xs', 'sm', 'md', 'lg', 'xl', 'xxl'].indexOf(name || 'md')
124
+ ]
125
+ "
126
+ />
127
+ <MDC
128
+ v-if="item.description"
129
+ :value="item.description"
130
+ class="mt-md-n2 mx-4 mx-sm-8 mx-md-0"
131
+ />
132
+ </v-col>
133
+ </v-row>
134
+
135
+ <!-- DIVIDERS -->
136
+ <v-responsive class="mx-auto my-9" width="120">
137
+ <v-divider class="mb-1" />
138
+ <v-divider />
139
+ </v-responsive>
140
+ <!-- <MiscAtomsSlidingCarousel
141
+ v-if="item && item.gallery && item.gallery.length"
142
+ ref="MiscAtomsImage"
143
+ key="MiscAtomsImage"
144
+ :items="item.gallery"
145
+ type="MiscAtomsImage"
146
+ :loading="false"
147
+ :more="false"
148
+ >
149
+ <div :class="mdAndUp ? 'text-h5' : 'text-h6'">
150
+ {{ $t("gallery") }}
151
+ </div>
152
+ </MiscAtomsSlidingCarousel> -->
153
+ <!-- DIVIDERS -->
154
+ <v-responsive class="mx-auto my-9" width="120">
155
+ <v-divider class="mb-1" />
156
+ <v-divider />
157
+ </v-responsive>
158
+
159
+ <MiscMoleculesRelated v-if="item && item.related" :related="item.related" />
160
+ </template>
161
+
162
+ <script setup>
163
+ import { useDisplay } from "vuetify"
164
+ const { $stores } = useNuxtApp()
165
+ const { name, mdAndUp, smAndDown } = useDisplay()
166
+ const props = defineProps({
167
+ item: {
168
+ type: Object,
169
+ required: true,
170
+ },
171
+ loading: {
172
+ type: Boolean,
173
+ required: false,
174
+ default: false,
175
+ },
176
+ })
177
+
178
+ const today = new Date()
179
+ /*const academicYear = ref(
180
+ today.getMonth() > 6
181
+ ? today.getFullYear() + "-" + (today.getFullYear() + 1)
182
+ : today.getFullYear() - 1 + "-" + today.getFullYear()
183
+ )
184
+ const { data: action } = await useAsyncData("actions", () =>
185
+ queryContent("/actions/" + locale.value)
186
+ .limit(1)
187
+ .find()
188
+ ) */
189
+ $stores.news.loading = false
190
+ </script>