@icvdeveloper/common-module 0.0.75 → 0.0.78

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 (41) hide show
  1. package/dist/module.json +1 -1
  2. package/dist/module.mjs +5 -0
  3. package/dist/runtime/@types/components.d.ts +89 -1
  4. package/dist/runtime/components/agenda/AgendaList.vue +149 -19
  5. package/dist/runtime/components/agenda/AgendaTabbed.vue +9 -0
  6. package/dist/runtime/components/agenda/components/AgendaListAccordion.vue +31 -4
  7. package/dist/runtime/components/agenda/components/Calendar.vue +89 -0
  8. package/dist/runtime/components/media/PlayerAndContentContainer.vue +170 -0
  9. package/dist/runtime/components/media/WebcastVideoPlayer.vue +167 -0
  10. package/dist/runtime/components/media/components/AgendaPanel.vue +53 -0
  11. package/dist/runtime/components/media/components/CeCreditNotification.vue +99 -0
  12. package/dist/runtime/components/media/components/CeCreditNotification.vue.d.ts +28 -0
  13. package/dist/runtime/components/media/components/ContentAccordion.vue +65 -0
  14. package/dist/runtime/components/media/components/ContentAccordion.vue.d.ts +29 -0
  15. package/dist/runtime/components/media/components/ContentArea.vue +175 -0
  16. package/dist/runtime/components/media/components/ContentTabs.vue +263 -0
  17. package/dist/runtime/components/media/components/DocumentsPanel.vue +52 -0
  18. package/dist/runtime/components/media/components/DocumentsPanel.vue.d.ts +7 -0
  19. package/dist/runtime/components/media/components/JsonApi.vue +33 -0
  20. package/dist/runtime/components/media/components/JsonApi.vue.d.ts +16 -0
  21. package/dist/runtime/components/media/components/MediaContainer.vue +104 -0
  22. package/dist/runtime/components/media/components/OverviewPanel.vue +51 -0
  23. package/dist/runtime/components/media/components/PresentersPanel.vue +65 -0
  24. package/dist/runtime/components/media/components/PresentersPanel.vue.d.ts +32 -0
  25. package/dist/runtime/components/media/components/SessionReporting.vue +96 -0
  26. package/dist/runtime/components/media/components/SessionReporting.vue.d.ts +35 -0
  27. package/dist/runtime/components/media/components/SponsorsPanel.vue +85 -0
  28. package/dist/runtime/components/media/components/SponsorsPanel.vue.d.ts +27 -0
  29. package/dist/runtime/components/media/components/WindowContent.vue +118 -0
  30. package/dist/runtime/components/media/components/WindowContent.vue.d.ts +50 -0
  31. package/dist/runtime/components/media/components/WindowSlide.vue +92 -0
  32. package/dist/runtime/components/media/components/WindowSlide.vue.d.ts +36 -0
  33. package/dist/runtime/composables/useStream.d.ts +15 -0
  34. package/dist/runtime/composables/useStream.mjs +89 -0
  35. package/dist/runtime/enums/general.d.ts +7 -0
  36. package/dist/runtime/enums/general.mjs +8 -0
  37. package/dist/runtime/models/conference.d.ts +17 -0
  38. package/dist/runtime/models/pagesConfig.d.ts +2 -0
  39. package/dist/runtime/store/presentations.d.ts +11 -0
  40. package/dist/runtime/store/presentations.mjs +10 -0
  41. package/package.json +3 -1
package/dist/module.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "v3plus-common-module",
3
3
  "configKey": "v3plusCommonModule",
4
- "version": "0.0.75"
4
+ "version": "0.0.78"
5
5
  }
package/dist/module.mjs CHANGED
@@ -155,6 +155,11 @@ const module = defineNuxtModule({
155
155
  extensions: ["vue"],
156
156
  prefix: "Common"
157
157
  });
158
+ addComponentsDir({
159
+ path: join(runtimeDir, "components/media"),
160
+ extensions: ["vue"],
161
+ prefix: "Common"
162
+ });
158
163
  nuxt.hook("app:resolve", async (nuxt2) => {
159
164
  let index = 0;
160
165
  const piniaRuntime = nuxt2.plugins.find((object, i) => {
@@ -102,7 +102,7 @@ export type presenterModalClassObj = {
102
102
  export type uccClassObj = {
103
103
  container?: string | null;
104
104
  };
105
- export type accordionCompObj<svgIconClassObj> = {
105
+ export type accordionCompObj = {
106
106
  svgIcon?: svgIconClassObj;
107
107
  };
108
108
  export type accordionClassObj = {
@@ -121,3 +121,91 @@ export type faqAccordionClassObj = {
121
121
  container?: string | null;
122
122
  components?: faqAccordionCompObj;
123
123
  };
124
+ export type AgendaListAccordionClassObj = {
125
+ container?: string | null;
126
+ headerContainer?: string | null;
127
+ headerButton?: string | null;
128
+ dropdownContainer?: string | null;
129
+ };
130
+ export type AgendaListCompObj = {
131
+ agendaListAccordion?: AgendaListAccordionClassObj;
132
+ };
133
+ export type AgendaListClassObj = {
134
+ container?: string | null;
135
+ accordionContainer?: string | null;
136
+ titleContainer?: string | null;
137
+ timeElement?: string | null;
138
+ iconContainer?: string | null;
139
+ dropdownContainer?: string | null;
140
+ marginElement?: string | null;
141
+ presentersContainer?: string | null;
142
+ presentersHeader?: string | null;
143
+ presenterListContainer?: string | null;
144
+ presenterElement: string | null;
145
+ presenterName?: string | null;
146
+ components?: AgendaListCompObj;
147
+ };
148
+ export type AgendaPanelCompObj = {
149
+ agendaList?: AgendaListClassObj;
150
+ };
151
+ export type AgendaPanelClassObj = {
152
+ container?: string | null;
153
+ components?: AgendaPanelCompObj;
154
+ };
155
+ export type OverviewPanelClassObj = {
156
+ container?: string | null;
157
+ htmlElement?: string | null;
158
+ noOverviewElement?: string | null;
159
+ };
160
+ export type ContentTabsClassObj = {
161
+ container?: string | null;
162
+ fullContainer?: string | null;
163
+ mobileContainer?: string | null;
164
+ mobileButtonContainer?: string | null;
165
+ dropdownContainer?: string | null;
166
+ tabList?: string | null;
167
+ tabItem?: string | null;
168
+ tabLink?: string | null;
169
+ selectedTab?: string | null;
170
+ mobileTabList?: string | null;
171
+ mobileTabItem?: string | null;
172
+ mobileTabLink?: string | null;
173
+ };
174
+ export type WebcastPlayerClassObj = {
175
+ container?: string | null;
176
+ playerElement?: string | null;
177
+ embedElement?: string | null;
178
+ };
179
+ export type MediaContainerCompObj = {
180
+ webcastPlayer?: WebcastPlayerClassObj;
181
+ };
182
+ export type MediaContainerClassObj = {
183
+ container?: string | null;
184
+ components?: MediaContainerCompObj;
185
+ };
186
+ export type ContentAreaCompObj = {
187
+ overviewPanel?: OverviewPanelClassObj;
188
+ agendaPanel?: AgendaPanelClassObj;
189
+ };
190
+ export type ContentAreaClassObj = {
191
+ container?: string | null;
192
+ htmlElement?: string | null;
193
+ trackHtmlElement?: string | null;
194
+ noTrackHtmlElement?: string | null;
195
+ noTrackHtmlText?: string | null;
196
+ components?: ContentAreaCompObj;
197
+ };
198
+ export type PlayerAndContentCompObj = {
199
+ contentTabs?: ContentTabsClassObj;
200
+ contentArea?: ContentAreaClassObj;
201
+ mediaContainer?: MediaContainerClassObj;
202
+ };
203
+ export type PlayerAndContentClassObj = {
204
+ container?: string | null;
205
+ noTabsContainer?: string | null;
206
+ noTabsChild?: string | null;
207
+ withTabsContainer?: string | null;
208
+ withTabsChild?: string | null;
209
+ mediaTabsContainer?: string | null;
210
+ components?: PlayerAndContentCompObj;
211
+ };
@@ -1,24 +1,52 @@
1
1
  <script lang="ts" setup>
2
- import { toRefs, computed, onBeforeMount, reactive } from "vue";
2
+ import { toRefs } from "vue";
3
3
  import { add } from "date-fns";
4
- import { e } from "ofetch/dist/error-8a55452d";
5
4
  import type { Conference } from "../../models/conference";
6
5
  import { useAgenda } from "../../composables/useAgenda";
7
6
  import { useDateFormat } from "../../composables/useDateFormat";
8
7
  import { usePresenter } from "../../composables/usePresenter";
8
+ import { useClassBinding } from "../../composables/useClassBinding";
9
9
  import { Presenter } from "../../models/conference";
10
+ import {
11
+ AgendaListClassObj,
12
+ AgendaListCompObj,
13
+ AgendaListAccordionClassObj,
14
+ } from "../../@types/components";
10
15
  import AgendaAccordion from "./components/AgendaListAccordion.vue";
16
+ import Calendar from "./components/Calendar.vue";
11
17
 
12
18
  type Props = {
13
19
  conference: Conference;
20
+ classObject?: AgendaListClassObj;
14
21
  };
15
22
 
16
- const props = defineProps<Props>();
23
+ const props = withDefaults(defineProps<Props>(), {
24
+ classObject: () => {
25
+ return {
26
+ container: "",
27
+ accordionContainer: "",
28
+ titleContainer: "",
29
+ timeElement: "",
30
+ iconContainer: "",
31
+ dropdownContainer: "",
32
+ marginElement: "",
33
+ presentersContainer: "",
34
+ presentersHeader: "",
35
+ presenterListContainer: "",
36
+ presenterElement: "",
37
+ presenterName: "",
38
+ components: ref<AgendaListCompObj>({
39
+ agendaListAccordion: ref<AgendaListAccordionClassObj>({}),
40
+ }),
41
+ };
42
+ },
43
+ });
17
44
 
18
45
  const { conference } = toRefs(props);
19
46
 
20
47
  const { days, getCombinedTrackList } = useAgenda(conference);
21
48
  const { formatTimezoneToLocal } = useDateFormat();
49
+ const { classBinding } = useClassBinding();
22
50
 
23
51
  const presentersToComposables = (presenters: Presenter[]) => {
24
52
  const data = [];
@@ -35,14 +63,40 @@ const presentersToComposables = (presenters: Presenter[]) => {
35
63
  </script>
36
64
 
37
65
  <template>
38
- <div class="flex flex-col space-y-5 text-neutral-700">
66
+ <div
67
+ :class="
68
+ classBinding(
69
+ classObject,
70
+ 'container',
71
+ 'flex flex-col space-y-5 text-neutral-700'
72
+ )
73
+ "
74
+ >
39
75
  <template v-for="day in days">
40
76
  <template v-for="track in getCombinedTrackList(day)">
41
- <div v-for="presentation in track.presentations" :key="presentation.id">
42
- <AgendaAccordion>
77
+ <div
78
+ v-for="presentation in track.presentations"
79
+ :key="presentation.id"
80
+ :class="classBinding(classObject, 'accordionContainer', '')"
81
+ >
82
+ <AgendaAccordion
83
+ :class-object="classObject.components.agendaListAccordion"
84
+ >
43
85
  <template #header="isExpanded">
44
- <div class="text-left text-xl flex-col md:flex-row flex">
45
- <span class="time-width">
86
+ <div
87
+ :class="
88
+ classBinding(
89
+ classObject,
90
+ 'titleContainer',
91
+ 'text-left text-xl flex-col md:flex-row flex'
92
+ )
93
+ "
94
+ >
95
+ <span
96
+ :class="
97
+ classBinding(classObject, 'timeElement', 'time-width')
98
+ "
99
+ >
46
100
  {{
47
101
  formatTimezoneToLocal(
48
102
  presentation.date,
@@ -61,7 +115,15 @@ const presentersToComposables = (presenters: Presenter[]) => {
61
115
  )
62
116
  }}
63
117
  </span>
64
- <span class="flex flex-row md:ml-5">
118
+ <span
119
+ :class="
120
+ classBinding(
121
+ classObject,
122
+ 'iconContainer',
123
+ 'flex flex-row md:ml-5'
124
+ )
125
+ "
126
+ >
65
127
  <CommonSvgIcon
66
128
  :class-object="{ svgElement: 'fill-neutral-700' }"
67
129
  class="mr-1 pt-1"
@@ -72,23 +134,91 @@ const presentersToComposables = (presenters: Presenter[]) => {
72
134
  </div>
73
135
  </template>
74
136
  <template #body>
75
- <div class="flex flex-row">
137
+ <div
138
+ :class="
139
+ classBinding(
140
+ classObject,
141
+ 'dropdownContainer',
142
+ 'flex flex-row'
143
+ )
144
+ "
145
+ >
76
146
  <!-- left margin element -->
77
- <span class="text-lg hidden md:block md:flex-initial time-width md:mr-8" />
78
-
79
- <div class="flex-1 my-3">
80
- <h3 class="font-bold text-lg">Presenters</h3>
81
- <div class="flex flex-col space-y-3">
147
+ <span
148
+ :class="
149
+ classBinding(
150
+ classObject,
151
+ 'marginElement',
152
+ 'text-lg hidden md:block md:flex-initial time-width md:mr-8'
153
+ )
154
+ "
155
+ />
156
+ <div
157
+ :class="
158
+ classBinding(
159
+ classObject,
160
+ 'presentersContainer',
161
+ 'flex-1 my-3'
162
+ )
163
+ "
164
+ >
165
+ <!-- ADD TO CALENDAR -->
166
+ <calendar
167
+ :key="conference.id"
168
+ class="mb-3"
169
+ :presentation="presentation"
170
+ :conference="conference"
171
+ />
172
+ <h3
173
+ :class="
174
+ classBinding(
175
+ classObject,
176
+ 'presentersHeader',
177
+ 'font-bold text-lg'
178
+ )
179
+ "
180
+ >
181
+ Presenters
182
+ </h3>
183
+ <div
184
+ :class="
185
+ classBinding(
186
+ classObject,
187
+ 'presenterListContainer',
188
+ 'flex flex-col space-y-3'
189
+ )
190
+ "
191
+ >
82
192
  <div
83
193
  v-for="presenter in presentersToComposables(
84
194
  presentation.presenters
85
195
  )"
86
196
  :key="presenter.presenter.id"
197
+ :class="classBinding(classObject, 'presenterElement', '')"
87
198
  >
88
- <p class="text-lg pb-0 mb-0">{{ presenter.fullName.value }}</p>
89
- <p v-if="presenter.titleCompany.value" class="text-sm pt-0 mb-1">
90
- {{ presenter.titleCompany.value }}
91
- </p>
199
+ <p
200
+ :class="
201
+ classBinding(
202
+ classObject,
203
+ 'presenterName',
204
+ 'text-lg pb-0 mb-0'
205
+ )
206
+ "
207
+ >
208
+ {{ presenter.fullName.value }}
209
+ </p>
210
+ <p
211
+ v-if="presenter.titleCompany.value"
212
+ :class="
213
+ classBinding(
214
+ classObject,
215
+ 'presenterName',
216
+ 'text-sm pt-0 mb-1'
217
+ )
218
+ "
219
+ >
220
+ {{ presenter.titleCompany.value }}
221
+ </p>
92
222
  </div>
93
223
  </div>
94
224
  </div>
@@ -9,6 +9,7 @@ import { usePresenters } from "../../composables/usePresenters";
9
9
  import CommonAccordion from "../layouts/Accordion.vue";
10
10
  import Sponsor from "./components/Sponsor.vue";
11
11
  import PresentationLink from "./components/PresentationLink.vue";
12
+ import Calendar from "./components/Calendar.vue";
12
13
 
13
14
  type Props = {
14
15
  conference: Conference;
@@ -246,6 +247,14 @@ const presentersContainer = computed(() => {
246
247
  ></presentation-link>
247
248
  </div>
248
249
 
250
+ <!-- ADD TO CALENDAR -->
251
+ <calendar
252
+ :key="conference.id"
253
+ class="mb-3"
254
+ :presentation="presentation"
255
+ :conference="conference"
256
+ />
257
+
249
258
  <!-- PRESENTERS LIST (ACCORDION OR STANDARD/DIV) -->
250
259
  <component
251
260
  :is="presentersContainer"
@@ -1,5 +1,24 @@
1
1
  <script lang="ts" setup>
2
2
  import { ref } from "vue";
3
+ import { useClassBinding } from "../../../composables/useClassBinding";
4
+ import { AgendaListAccordionClassObj } from "../../../@types/components";
5
+
6
+ type Props = {
7
+ classObject?: AgendaListAccordionClassObj;
8
+ };
9
+
10
+ const props = withDefaults(defineProps<Props>(), {
11
+ classObject: () => {
12
+ return {
13
+ container: "",
14
+ headerContainer: "",
15
+ headerButton: "",
16
+ dropdownContainer: "",
17
+ };
18
+ },
19
+ });
20
+
21
+ const { classBinding } = useClassBinding();
3
22
 
4
23
  const expanded = ref<boolean>(false);
5
24
 
@@ -10,15 +29,23 @@ const toggle = () => {
10
29
  </script>
11
30
 
12
31
  <template>
13
- <div>
14
- <div class="font-bold mt-2">
15
- <button class="outline-none" @click="toggle">
32
+ <div :class="classBinding(classObject, 'container', '')">
33
+ <div
34
+ :class="classBinding(classObject, 'headerContainer', 'font-bold mt-2')"
35
+ >
36
+ <button
37
+ :class="classBinding(classObject, 'headerButton', 'outline-none')"
38
+ @click="toggle"
39
+ >
16
40
  <slot name="header"></slot>
17
41
  </button>
18
42
  </div>
19
43
 
20
44
  <transition name="slide" mode="out-in">
21
- <div v-show="expanded">
45
+ <div
46
+ v-show="expanded"
47
+ :class="classBinding(classObject, 'dropdownContainer', '')"
48
+ >
22
49
  <slot name="body" />
23
50
  </div>
24
51
  </transition>
@@ -0,0 +1,89 @@
1
+ <script lang="ts" setup>
2
+ import { ref, toRefs, computed } from "vue";
3
+ import { storeToRefs } from "pinia";
4
+ import { get } from "lodash-es";
5
+ import { DateTime } from 'luxon';
6
+ import { useTemplateConfigsStore } from "../../../store";
7
+ import 'add-to-calendar-button';
8
+ import { Conference } from "../../../models/conference";
9
+ import { Presentation } from "../../../models/conference";
10
+
11
+ type Props = {
12
+ conference: Conference;
13
+ presentation: Presentation;
14
+ };
15
+
16
+ const props = defineProps<Props>();
17
+
18
+ const { conference, presentation } = toRefs(props);
19
+
20
+ const { pagesConfigValue } = storeToRefs(useTemplateConfigsStore());
21
+
22
+ // Computed
23
+ const showAddToGoogleCalendar = computed((): boolean => {
24
+ return pagesConfigValue.value("agenda.add_to_google_calendar", false);
25
+ });
26
+
27
+ const showAddToMicrosoftCalendar = computed((): boolean => {
28
+ return pagesConfigValue.value("agenda.add_to_microsoft_calendar", false);
29
+ });
30
+
31
+ const presStartDate = computed((): string => {
32
+ return DateTime.fromSQL(
33
+ presentation.value.date,
34
+ { zone: conference.timezone }
35
+ ).toFormat("yyyy-MM-dd");
36
+ });
37
+
38
+ const presStartTime = computed((): string => {
39
+ return DateTime.fromSQL(
40
+ presentation.value.date,
41
+ { zone: conference.timezone }
42
+ ).toFormat("HH:mm");
43
+ });
44
+
45
+ const presEndTime = computed((): string => {
46
+ let duration: number = get(presentation.value, "duration", 3600) // default to 60 min
47
+ return DateTime.fromSQL(
48
+ presentation.value.date,
49
+ { zone: conference.timezone }
50
+ ).plus(duration * 1000).toFormat("HH:mm");
51
+ });
52
+
53
+ const calendarOptions = computed((): string => {
54
+ let opts = [];
55
+ if (showAddToGoogleCalendar) { opts.push('Google'); }
56
+ if (showAddToMicrosoftCalendar) { opts.push('iCal'); }
57
+ let optsQuoted = opts.map(opt => `'${opt}'`);
58
+ return optsQuoted.join(',');
59
+ });
60
+
61
+ const cssPath = computed((): string => {
62
+ // atcb.css required in template/playground public folder
63
+ return window.location.origin + "/atcb.css";
64
+ });
65
+
66
+ </script>
67
+
68
+ <template>
69
+ <div>
70
+ <add-to-calendar-button
71
+ :name="presentation.name"
72
+ :description="presentation.description"
73
+ :startDate="presStartDate"
74
+ :startTime="presStartTime"
75
+ :endTime="presEndTime"
76
+ :timeZone="conference.timezone"
77
+ :location="conference.location"
78
+ listStyle="dropdown"
79
+ trigger="click"
80
+ lightMode="bodyScheme"
81
+ buttonStyle="custom"
82
+ :customCss="cssPath"
83
+ hideIconButton
84
+ hideBackground
85
+ hideCheckmark
86
+ :options="calendarOptions"
87
+ ></add-to-calendar-button>
88
+ </div>
89
+ </template>
@@ -0,0 +1,170 @@
1
+ <script lang="ts" setup>
2
+ import { toRefs } from "vue";
3
+ import { storeToRefs } from "pinia";
4
+ import { useRoute } from "vue-router";
5
+ import { useClassBinding } from "../../composables/useClassBinding";
6
+ import { Conference, Presentation } from "../../models/conference";
7
+ import { SelectedContent } from "../../enums/general";
8
+ import {
9
+ PlayerAndContentClassObj,
10
+ PlayerAndContentCompObj,
11
+ ContentTabsClassObj,
12
+ ContentAreaClassObj,
13
+ MediaContainerClassObj,
14
+ } from "../../@types/components";
15
+
16
+ type Props = {
17
+ conference: Conference;
18
+ presentation: Presentation;
19
+ tabs?: Array<{ label: string; type: SelectedContent; content: string }>;
20
+ classObject?: PlayerAndContentClassObj;
21
+ };
22
+
23
+ const props = withDefaults(defineProps<Props>(), {
24
+ tabs: () => {
25
+ return [
26
+ { label: "Overview", type: SelectedContent.OVERVIEW, content: "string" },
27
+ ];
28
+ },
29
+ classObject: () => {
30
+ return {
31
+ container: "",
32
+ noTabsContainer: "",
33
+ noTabsChild: "",
34
+ withTabsContainer: "",
35
+ withTabsChild: "",
36
+ mediaTabsContainer: "",
37
+ components: ref<PlayerAndContentCompObj>({
38
+ contentTabs: ref<ContentTabsClassObj>({}),
39
+ contentArea: ref<ContentAreaClassObj>({}),
40
+ mediaContainer: ref<MediaContainerClassObj>({}),
41
+ }),
42
+ };
43
+ },
44
+ });
45
+
46
+ const { conference, presentation } = toRefs(props);
47
+
48
+ const route = ref(useRoute());
49
+
50
+ const { classBinding } = useClassBinding();
51
+
52
+ const { selectedContent } = storeToRefs(usePresentationsStore());
53
+ const { isLoggedIn } = storeToRefs(useAuthStore());
54
+
55
+ // computed
56
+
57
+ const isStreamTest = computed((): boolean => {
58
+ return String(route.value.name).includes("stream-test");
59
+ });
60
+
61
+ const hasAccess = computed((): boolean => {
62
+ return isLoggedIn.value && conference.value.access;
63
+ });
64
+ </script>
65
+
66
+ <template>
67
+ <div :class="classBinding(classObject, 'container', 'flex flex-col w-full')">
68
+ <!-- NO TABS -->
69
+ <div
70
+ v-if="isStreamTest || (hasAccess && !tabs.length)"
71
+ :class="
72
+ classBinding(
73
+ classObject,
74
+ 'noTabsContainer',
75
+ 'container mx-auto flex flex-col text-center pt-6'
76
+ )
77
+ "
78
+ >
79
+ <div :class="classBinding(classObject, 'noTabsChild', 'flex-1')">
80
+ <CommonComponentsMediaContainer
81
+ :class="
82
+ classBinding(
83
+ classObject,
84
+ 'classObject.components.mediaContainer.container',
85
+ 'flex-1 aspect-video'
86
+ )
87
+ "
88
+ :webcast-conference="conference"
89
+ :class-object="classObject.components.mediaContainer"
90
+ />
91
+ </div>
92
+ </div>
93
+
94
+ <!-- TABS -->
95
+ <div v-else :class="classBinding(classObject, 'withTabsContainer', '')">
96
+ <CommonComponentsContentTabs
97
+ :class="
98
+ classBinding(
99
+ classObject,
100
+ 'classObject.components.contentTabs.container',
101
+ 'hidden md:block'
102
+ )
103
+ "
104
+ :webcast-conference="conference"
105
+ :items="tabs"
106
+ :class-object="classObject.components.contentTabs"
107
+ />
108
+ <div
109
+ :class="
110
+ classBinding(
111
+ classObject,
112
+ 'withTabsChild',
113
+ 'flex-1 grid grid-cols-7 grid-rows-2 gap-y-4'
114
+ )
115
+ "
116
+ >
117
+ <div
118
+ :class="
119
+ classBinding(
120
+ classObject,
121
+ 'MediaTabsContainer',
122
+ 'col-span-7 row-span-1 md:col-span-4 lg:col-span-5 aspect-video'
123
+ )
124
+ "
125
+ >
126
+ <CommonComponentsMediaContainer
127
+ class="w-full"
128
+ :webcast-conference="conference"
129
+ :class-object="classObject.components.mediaContainer"
130
+ />
131
+ <CommonComponentsContentTabs
132
+ class="block md:hidden"
133
+ :webcast-conference="conference"
134
+ :items="tabs"
135
+ :class-object="classObject.components.contentTabs"
136
+ />
137
+ </div>
138
+ <CommonComponentsContentArea
139
+ class="col-span-7 row-span-1 md:col-span-3 lg:col-span-2 border ml-0 md:ml-6"
140
+ :selected-content="selectedContent"
141
+ :webcast-conference="conference"
142
+ :presentation="presentation"
143
+ :class-object="classObject.components.contentArea"
144
+ />
145
+ <!-- sponsor -->
146
+ <figure
147
+ class="col-span-7 md:col-start-5 md:col-span-3 lg:col-start-6 lg:col-span-6 row-span-1 flex flex-col p-6 text-center"
148
+ >
149
+ <h3
150
+ v-if="conference.affiliates.length > 0"
151
+ class="allsmallcaps text-sm pb-4 text-neutral-400 scala"
152
+ >
153
+ Sponsored by:
154
+ </h3>
155
+ <template v-for="affiliate in conference.affiliates">
156
+ <CommonComponentsSponsor
157
+ v-if="affiliate.role == 'sponsor'"
158
+ :key="affiliate.id"
159
+ :sponsor="affiliate"
160
+ :class-object="{
161
+ labelImageContainer: 'block',
162
+ sponsorContainer: 'img-mx-auto',
163
+ }"
164
+ />
165
+ </template>
166
+ </figure>
167
+ </div>
168
+ </div>
169
+ </div>
170
+ </template>