@icvdeveloper/common-module 0.0.49 → 0.0.51

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 (71) hide show
  1. package/README.md +6 -6
  2. package/dist/module.json +1 -1
  3. package/dist/module.mjs +1 -1
  4. package/dist/runtime/@types/components.d.ts +19 -0
  5. package/dist/runtime/assets/svg/answer.svg +14 -14
  6. package/dist/runtime/assets/svg/avatar.svg +1 -1
  7. package/dist/runtime/assets/svg/bell-icon.svg +3 -3
  8. package/dist/runtime/assets/svg/checkmark-icon.svg +1 -1
  9. package/dist/runtime/assets/svg/close-icon.svg +1 -1
  10. package/dist/runtime/assets/svg/icon-avatar.svg +1 -1
  11. package/dist/runtime/assets/svg/icon-chevron.svg +4 -0
  12. package/dist/runtime/assets/svg/icon-close.svg +1 -1
  13. package/dist/runtime/assets/svg/icon-info.svg +2 -2
  14. package/dist/runtime/assets/svg/icon-new-window.svg +11 -11
  15. package/dist/runtime/assets/svg/icon-offline.svg +3 -3
  16. package/dist/runtime/assets/svg/icon-online.svg +3 -3
  17. package/dist/runtime/assets/svg/icon-person.svg +2 -2
  18. package/dist/runtime/assets/svg/icon-play.svg +2 -2
  19. package/dist/runtime/assets/svg/icon-star-filled.svg +29 -29
  20. package/dist/runtime/assets/svg/icon-star.svg +24 -24
  21. package/dist/runtime/assets/svg/icon-video-chat.svg +14 -14
  22. package/dist/runtime/assets/svg/icon-website.svg +2 -2
  23. package/dist/runtime/assets/svg/icon-zoom.svg +10 -10
  24. package/dist/runtime/assets/svg/notification-icon.svg +32 -32
  25. package/dist/runtime/assets/svg/offline-icon.svg +1 -1
  26. package/dist/runtime/assets/svg/online-icon.svg +3 -3
  27. package/dist/runtime/assets/svg/peer2peer.svg +3 -3
  28. package/dist/runtime/assets/svg/phone.svg +1 -1
  29. package/dist/runtime/assets/svg/plus-icon.svg +1 -1
  30. package/dist/runtime/assets/svg/red-icon.svg +3 -3
  31. package/dist/runtime/assets/svg/reject.svg +14 -14
  32. package/dist/runtime/assets/svg/search-icon.svg +3 -3
  33. package/dist/runtime/components/affiliates/AffiliatePage.vue +17 -17
  34. package/dist/runtime/components/agenda/AgendaTabbed.vue +300 -300
  35. package/dist/runtime/components/agenda/components/InfoLink.vue +56 -56
  36. package/dist/runtime/components/agenda/components/PlayIcon.vue +49 -49
  37. package/dist/runtime/components/agenda/components/PresentationLink.vue +137 -137
  38. package/dist/runtime/components/agenda/components/Sponsor.vue +132 -132
  39. package/dist/runtime/components/auth/LoginFullWidth.vue +78 -78
  40. package/dist/runtime/components/auth/PasswordReset.vue +60 -60
  41. package/dist/runtime/components/auth/Registration.vue +27 -27
  42. package/dist/runtime/components/auth/Ucc.vue +52 -52
  43. package/dist/runtime/components/core/Accordion.vue +98 -40
  44. package/dist/runtime/components/core/CountdownTimer.vue +308 -308
  45. package/dist/runtime/components/core/DynamicHtml.vue +1 -1
  46. package/dist/runtime/components/core/Modal.vue +111 -111
  47. package/dist/runtime/components/core/Navbar.vue +154 -154
  48. package/dist/runtime/components/core/SvgIcon.vue +145 -139
  49. package/dist/runtime/components/core/ZoomModal.vue +37 -37
  50. package/dist/runtime/components/events/EventHeader.vue +133 -133
  51. package/dist/runtime/components/events/ListEvents.vue +477 -477
  52. package/dist/runtime/components/forms/AlertBox.vue +21 -21
  53. package/dist/runtime/components/forms/ErrorField.vue +17 -17
  54. package/dist/runtime/components/forms/Message.vue +27 -27
  55. package/dist/runtime/components/forms/SearchInput.vue +38 -38
  56. package/dist/runtime/components/forms/SupportForm.vue +112 -112
  57. package/dist/runtime/components/forms/SwitchInput.vue +42 -42
  58. package/dist/runtime/components/forms/TextArea.vue +26 -26
  59. package/dist/runtime/components/forms/TextInput.vue +28 -28
  60. package/dist/runtime/components/layouts/Accordion.vue +78 -78
  61. package/dist/runtime/components/presenters/PresenterListing.vue +164 -164
  62. package/dist/runtime/components/presenters/PresenterModal.vue +225 -225
  63. package/dist/runtime/components/profile/Profile.vue +149 -149
  64. package/dist/runtime/components/profile/components/Sidebar.vue +27 -27
  65. package/dist/runtime/components/profile/components/SidebarNavItem.vue +39 -39
  66. package/dist/runtime/components/profile/tabs/Favorites.vue +21 -21
  67. package/dist/runtime/components/profile/tabs/GeneralInformation.vue +122 -122
  68. package/dist/runtime/components/profile/tabs/ProfileImage.vue +75 -75
  69. package/dist/runtime/components/support/FAQAccordion.vue +137 -247
  70. package/dist/runtime/models/icons.d.ts +1 -0
  71. package/package.json +1 -1
@@ -1,139 +1,145 @@
1
- <script lang="ts" setup>
2
- import { find, get } from "lodash-es";
3
- import { toRefs, computed, defineAsyncComponent } from "vue";
4
- import { Icon, Icons } from "../../models/icons";
5
- import { svgIconClassObj } from "../../@types/components";
6
- import { useClassBinding } from "../../composables/useClassBinding";
7
-
8
- /**
9
- * Delay importing only the icon file that we need
10
- */
11
- const icons: Icons = {
12
- person: {
13
- color: "#333",
14
- component: defineAsyncComponent(
15
- () => import("../../assets/svg/icon-person.svg")
16
- ),
17
- },
18
- info: {
19
- color: "#4286f4",
20
- component: defineAsyncComponent(
21
- () => import("../../assets/svg/icon-info.svg")
22
- ),
23
- },
24
- twitter: {
25
- color: "#1CB7EB",
26
- component: defineAsyncComponent(
27
- () => import("../../assets/svg/icon-twitter.svg")
28
- ),
29
- },
30
- facebook: {
31
- color: "#4E71A8",
32
- component: defineAsyncComponent(
33
- () => import("../../assets/svg/icon-facebook.svg")
34
- ),
35
- },
36
- linkedin: {
37
- color: "#4E71A8",
38
- component: defineAsyncComponent(
39
- () => import("../../assets/svg/icon-linkedin.svg")
40
- ),
41
- },
42
- youtube: {
43
- color: "#CA3737",
44
- component: defineAsyncComponent(
45
- () => import("../../assets/svg/icon-youtube.svg")
46
- ),
47
- },
48
- website: {
49
- color: "#4286f4",
50
- component: defineAsyncComponent(
51
- () => import("../../assets/svg/icon-website.svg")
52
- ),
53
- },
54
- newwindow: {
55
- color: "#333",
56
- component: defineAsyncComponent(
57
- () => import("../../assets/svg/icon-new-window.svg")
58
- ),
59
- },
60
- playarrow: {
61
- color: "#CA3737",
62
- component: defineAsyncComponent(
63
- () => import("../../assets/svg/icon-play.svg")
64
- ),
65
- },
66
- zoom: {
67
- color: "#333",
68
- component: defineAsyncComponent(
69
- () => import("../../assets/svg/icon-zoom.svg")
70
- ),
71
- },
72
- downarrow: {
73
- color: "#333",
74
- component: defineAsyncComponent(
75
- () => import("../../assets/svg/icon-down-arrow.svg")
76
- ),
77
- },
78
- close: {
79
- color: "#000",
80
- component: defineAsyncComponent(
81
- () => import("../../assets/svg/icon-close.svg")
82
- ),
83
- },
84
- };
85
-
86
- type Props = {
87
- icon?: keyof Icons;
88
- grayScale?: boolean;
89
- width?: string;
90
- classObject?: svgIconClassObj;
91
- };
92
-
93
- const props = withDefaults(defineProps<Props>(), {
94
- icon: "info",
95
- grayScale: false,
96
- width: "20px",
97
- classObject: () => {
98
- return {
99
- container: "",
100
- svgElement: "",
101
- };
102
- },
103
- });
104
-
105
- const { icon, grayScale, width } = toRefs(props);
106
- const { classBinding } = useClassBinding();
107
-
108
- // computed
109
- const iconDims = computed(() => ({
110
- width: width.value,
111
- height: width.value,
112
- }));
113
-
114
- const iconStyle = computed(() => {
115
- if (!grayScale.value) {
116
- return {
117
- fill: icons[icon.value].color,
118
- };
119
- }
120
-
121
- return {
122
- fill: "#666",
123
- };
124
- });
125
-
126
- const iconComponent = computed(() => {
127
- return icons[icon.value].component;
128
- });
129
- </script>
130
-
131
- <template>
132
- <div :style="iconDims">
133
- <component
134
- :is="iconComponent"
135
- :style="iconStyle"
136
- :class="classBinding(classObject, 'svgElement', '')"
137
- />
138
- </div>
139
- </template>
1
+ <script lang="ts" setup>
2
+ import { find, get } from "lodash-es";
3
+ import { toRefs, computed, defineAsyncComponent } from "vue";
4
+ import { Icon, Icons } from "../../models/icons";
5
+ import { svgIconClassObj } from "../../@types/components";
6
+ import { useClassBinding } from "../../composables/useClassBinding";
7
+
8
+ /**
9
+ * Delay importing only the icon file that we need
10
+ */
11
+ const icons: Icons = {
12
+ person: {
13
+ color: "#333",
14
+ component: defineAsyncComponent(
15
+ () => import("../../assets/svg/icon-person.svg")
16
+ ),
17
+ },
18
+ info: {
19
+ color: "#4286f4",
20
+ component: defineAsyncComponent(
21
+ () => import("../../assets/svg/icon-info.svg")
22
+ ),
23
+ },
24
+ twitter: {
25
+ color: "#1CB7EB",
26
+ component: defineAsyncComponent(
27
+ () => import("../../assets/svg/icon-twitter.svg")
28
+ ),
29
+ },
30
+ facebook: {
31
+ color: "#4E71A8",
32
+ component: defineAsyncComponent(
33
+ () => import("../../assets/svg/icon-facebook.svg")
34
+ ),
35
+ },
36
+ linkedin: {
37
+ color: "#4E71A8",
38
+ component: defineAsyncComponent(
39
+ () => import("../../assets/svg/icon-linkedin.svg")
40
+ ),
41
+ },
42
+ youtube: {
43
+ color: "#CA3737",
44
+ component: defineAsyncComponent(
45
+ () => import("../../assets/svg/icon-youtube.svg")
46
+ ),
47
+ },
48
+ website: {
49
+ color: "#4286f4",
50
+ component: defineAsyncComponent(
51
+ () => import("../../assets/svg/icon-website.svg")
52
+ ),
53
+ },
54
+ newwindow: {
55
+ color: "#333",
56
+ component: defineAsyncComponent(
57
+ () => import("../../assets/svg/icon-new-window.svg")
58
+ ),
59
+ },
60
+ playarrow: {
61
+ color: "#CA3737",
62
+ component: defineAsyncComponent(
63
+ () => import("../../assets/svg/icon-play.svg")
64
+ ),
65
+ },
66
+ zoom: {
67
+ color: "#333",
68
+ component: defineAsyncComponent(
69
+ () => import("../../assets/svg/icon-zoom.svg")
70
+ ),
71
+ },
72
+ downarrow: {
73
+ color: "#333",
74
+ component: defineAsyncComponent(
75
+ () => import("../../assets/svg/icon-down-arrow.svg")
76
+ ),
77
+ },
78
+ close: {
79
+ color: "#000",
80
+ component: defineAsyncComponent(
81
+ () => import("../../assets/svg/icon-close.svg")
82
+ ),
83
+ },
84
+ chevron: {
85
+ color: "#000",
86
+ component: defineAsyncComponent(
87
+ () => import("../../assets/svg/icon-chevron.svg")
88
+ ),
89
+ },
90
+ };
91
+
92
+ type Props = {
93
+ icon?: keyof Icons;
94
+ grayScale?: boolean;
95
+ width?: string;
96
+ classObject?: svgIconClassObj;
97
+ };
98
+
99
+ const props = withDefaults(defineProps<Props>(), {
100
+ icon: "info",
101
+ grayScale: false,
102
+ width: "20px",
103
+ classObject: () => {
104
+ return {
105
+ container: "",
106
+ svgElement: "",
107
+ };
108
+ },
109
+ });
110
+
111
+ const { icon, grayScale, width } = toRefs(props);
112
+ const { classBinding } = useClassBinding();
113
+
114
+ // computed
115
+ const iconDims = computed(() => ({
116
+ width: width.value,
117
+ height: width.value,
118
+ }));
119
+
120
+ const iconStyle = computed(() => {
121
+ if (!grayScale.value) {
122
+ return {
123
+ fill: icons[icon.value].color,
124
+ };
125
+ }
126
+
127
+ return {
128
+ fill: "#666",
129
+ };
130
+ });
131
+
132
+ const iconComponent = computed(() => {
133
+ return icons[icon.value].component;
134
+ });
135
+ </script>
136
+
137
+ <template>
138
+ <div :style="iconDims">
139
+ <component
140
+ :is="iconComponent"
141
+ :style="iconStyle"
142
+ :class="classBinding(classObject, 'svgElement', '')"
143
+ />
144
+ </div>
145
+ </template>
@@ -1,37 +1,37 @@
1
- <script lang="ts" setup>
2
- import { ref, toRefs, computed } from "vue";
3
-
4
- interface Props {
5
- presentationId: number | string;
6
- modalSize?: string;
7
- }
8
-
9
- const props = withDefaults(defineProps<Props>(), {
10
- modalSize: "full",
11
- });
12
-
13
- const { modalSize, presentationId } = toRefs(props);
14
-
15
- const showModal = ref<boolean>(false);
16
-
17
- const zoomUrl = computed(() => {
18
- return `/zoom/${presentationId.value}/meeting`;
19
- });
20
- </script>
21
-
22
- <template>
23
- <span>
24
- <CommonModal
25
- :visible="showModal"
26
- :modal-size="modalSize"
27
- @trigger="showModal = false"
28
- >
29
- <template #modal-body>
30
- <iframe :src="zoomUrl" class="w-full h-full"></iframe>
31
- </template>
32
- </CommonModal>
33
- <a class="no-underline" href="javascript:null" @click="showModal = true">
34
- <slot name="modal-link"></slot>
35
- </a>
36
- </span>
37
- </template>
1
+ <script lang="ts" setup>
2
+ import { ref, toRefs, computed } from "vue";
3
+
4
+ interface Props {
5
+ presentationId: number | string;
6
+ modalSize?: string;
7
+ }
8
+
9
+ const props = withDefaults(defineProps<Props>(), {
10
+ modalSize: "full",
11
+ });
12
+
13
+ const { modalSize, presentationId } = toRefs(props);
14
+
15
+ const showModal = ref<boolean>(false);
16
+
17
+ const zoomUrl = computed(() => {
18
+ return `/zoom/${presentationId.value}/meeting`;
19
+ });
20
+ </script>
21
+
22
+ <template>
23
+ <span>
24
+ <CommonModal
25
+ :visible="showModal"
26
+ :modal-size="modalSize"
27
+ @trigger="showModal = false"
28
+ >
29
+ <template #modal-body>
30
+ <iframe :src="zoomUrl" class="w-full h-full"></iframe>
31
+ </template>
32
+ </CommonModal>
33
+ <a class="no-underline" href="javascript:null" @click="showModal = true">
34
+ <slot name="modal-link"></slot>
35
+ </a>
36
+ </span>
37
+ </template>
@@ -1,133 +1,133 @@
1
- <script lang="ts" setup>
2
- import { toRefs, computed } from "vue";
3
- import { Conference } from "../../models/conference";
4
- import { useTemplateConfigsStore } from "../../store/templateConfigs";
5
- import { useConferencesStore } from "../../store/conferences";
6
- import { useConferenceHelpers } from "../../composables/useConferenceHelpers";
7
-
8
- interface Props {
9
- conference?: Conference | null;
10
- useEventText?: boolean;
11
- }
12
-
13
- // Component Props
14
- const props = withDefaults(defineProps<Props>(), {
15
- useEventText: () =>
16
- useTemplateConfigsStore().pagesConfigValue("main.use_event_text"),
17
- conference: () => useConferencesStore().currentConference,
18
- });
19
-
20
- // stores
21
- const conferenceStore = useConferencesStore();
22
- const { globalConfigValue, pagesConfigValue } = useTemplateConfigsStore();
23
-
24
- // reactive data
25
- const { useEventText, conference } = toRefs(props);
26
-
27
- // helper functions
28
- const {
29
- getConferenceDisplayDate,
30
- showConferenceWebcastButton,
31
- getConferenceWebcastUrl,
32
- getConferenceWebcastButtonText,
33
- showViewArchiveButton,
34
- getViewArchiveUrl,
35
- getViewArchiveButtonText,
36
- showConferenceRegButton,
37
- getConferenceRegUrl,
38
- getConferenceRegText,
39
- } = useConferenceHelpers(conference);
40
-
41
- // computed properties
42
- const mainStyles = computed(() => {
43
- if (useEventText.value) {
44
- return {
45
- "background-image": `url(${conference.value.photo_large})`,
46
- "background-repeat": "no-repeat",
47
- "background-size": "cover",
48
- "background-position": "center",
49
- };
50
- } else {
51
- return {};
52
- }
53
- });
54
-
55
- const mutedHeaderStyle = computed(() => {
56
- const muted = globalConfigValue("muted_photo_headers");
57
- if (muted === "lighten") return "background-color: rgb(255, 255, 255, .4)";
58
- if (muted === "darken") return "background-color: rgb(0, 0, 0, .4)";
59
- return "";
60
- });
61
-
62
- const hasOtherButton = computed(() => {
63
- return showViewArchiveButton() || showConferenceWebcastButton();
64
- });
65
-
66
- const mainBodyImage = computed(() => {
67
- return conference.value.photo_large;
68
- });
69
- </script>
70
-
71
- <template>
72
- <div :style="mainStyles" class="flex bg-color-2">
73
- <div
74
- v-if="useEventText"
75
- class="text-center flex flex-1 flex-col items-center justify-center h-auto p-12"
76
- :style="mutedHeaderStyle"
77
- >
78
- <h1
79
- class="text-shadow font-bold heading-color-1 mt-4 mb-4 text-2xl sm:text-2xl md:text-3xl lg:text-4xl xl:text-5xl"
80
- >
81
- {{ conference.name }}
82
- </h1>
83
- <h1
84
- v-if="conference.location"
85
- class="text-shadow font-light heading-color-2 mb-2 text-2xl sm:text-l md:text-xl lg:text-2xl xl:text-3xl"
86
- >
87
- {{ conference.location }}
88
- </h1>
89
- <h3
90
- v-if="pagesConfigValue('main.use_event_text_date')"
91
- class="text-shadow font-light heading-color-2 mb-2 text-l sm:text-l md:text-xl lg:text-2xl xl:text-3xl"
92
- >
93
- {{ getConferenceDisplayDate() }}
94
- </h3>
95
-
96
- <div class="flex-row mt-6">
97
- <!-- view test stream or webcast -->
98
- <a
99
- v-if="showConferenceWebcastButton()"
100
- :href="getConferenceWebcastUrl()"
101
- :target="/^http/.test(getConferenceWebcastUrl()) ? '_blank' : '_self'"
102
- >
103
- <button class="btn">
104
- {{ getConferenceWebcastButtonText() }}
105
- </button>
106
- </a>
107
-
108
- <!-- view archive -->
109
- <a
110
- v-if="showViewArchiveButton()"
111
- :href="getViewArchiveUrl()"
112
- :target="/^http/.test(getViewArchiveUrl()) ? '_blank' : '_self'"
113
- >
114
- <button class="btn">
115
- {{ getViewArchiveButtonText() }}
116
- </button>
117
- </a>
118
-
119
- <!-- register -->
120
- <a
121
- v-if="showConferenceRegButton()"
122
- :href="getConferenceRegUrl()"
123
- :target="/^http/.test(getConferenceRegUrl()) ? '_blank' : '_self'"
124
- >
125
- <button class="btn" :class="hasOtherButton ? 'md:ml-4' : ''">
126
- {{ getConferenceRegText() }}
127
- </button>
128
- </a>
129
- </div>
130
- </div>
131
- <img v-else :src="mainBodyImage" class="w-full h-auto" />
132
- </div>
133
- </template>
1
+ <script lang="ts" setup>
2
+ import { toRefs, computed } from "vue";
3
+ import { Conference } from "../../models/conference";
4
+ import { useTemplateConfigsStore } from "../../store/templateConfigs";
5
+ import { useConferencesStore } from "../../store/conferences";
6
+ import { useConferenceHelpers } from "../../composables/useConferenceHelpers";
7
+
8
+ interface Props {
9
+ conference?: Conference | null;
10
+ useEventText?: boolean;
11
+ }
12
+
13
+ // Component Props
14
+ const props = withDefaults(defineProps<Props>(), {
15
+ useEventText: () =>
16
+ useTemplateConfigsStore().pagesConfigValue("main.use_event_text"),
17
+ conference: () => useConferencesStore().currentConference,
18
+ });
19
+
20
+ // stores
21
+ const conferenceStore = useConferencesStore();
22
+ const { globalConfigValue, pagesConfigValue } = useTemplateConfigsStore();
23
+
24
+ // reactive data
25
+ const { useEventText, conference } = toRefs(props);
26
+
27
+ // helper functions
28
+ const {
29
+ getConferenceDisplayDate,
30
+ showConferenceWebcastButton,
31
+ getConferenceWebcastUrl,
32
+ getConferenceWebcastButtonText,
33
+ showViewArchiveButton,
34
+ getViewArchiveUrl,
35
+ getViewArchiveButtonText,
36
+ showConferenceRegButton,
37
+ getConferenceRegUrl,
38
+ getConferenceRegText,
39
+ } = useConferenceHelpers(conference);
40
+
41
+ // computed properties
42
+ const mainStyles = computed(() => {
43
+ if (useEventText.value) {
44
+ return {
45
+ "background-image": `url(${conference.value.photo_large})`,
46
+ "background-repeat": "no-repeat",
47
+ "background-size": "cover",
48
+ "background-position": "center",
49
+ };
50
+ } else {
51
+ return {};
52
+ }
53
+ });
54
+
55
+ const mutedHeaderStyle = computed(() => {
56
+ const muted = globalConfigValue("muted_photo_headers");
57
+ if (muted === "lighten") return "background-color: rgb(255, 255, 255, .4)";
58
+ if (muted === "darken") return "background-color: rgb(0, 0, 0, .4)";
59
+ return "";
60
+ });
61
+
62
+ const hasOtherButton = computed(() => {
63
+ return showViewArchiveButton() || showConferenceWebcastButton();
64
+ });
65
+
66
+ const mainBodyImage = computed(() => {
67
+ return conference.value.photo_large;
68
+ });
69
+ </script>
70
+
71
+ <template>
72
+ <div :style="mainStyles" class="flex bg-color-2">
73
+ <div
74
+ v-if="useEventText"
75
+ class="text-center flex flex-1 flex-col items-center justify-center h-auto p-12"
76
+ :style="mutedHeaderStyle"
77
+ >
78
+ <h1
79
+ class="text-shadow font-bold heading-color-1 mt-4 mb-4 text-2xl sm:text-2xl md:text-3xl lg:text-4xl xl:text-5xl"
80
+ >
81
+ {{ conference.name }}
82
+ </h1>
83
+ <h1
84
+ v-if="conference.location"
85
+ class="text-shadow font-light heading-color-2 mb-2 text-2xl sm:text-l md:text-xl lg:text-2xl xl:text-3xl"
86
+ >
87
+ {{ conference.location }}
88
+ </h1>
89
+ <h3
90
+ v-if="pagesConfigValue('main.use_event_text_date')"
91
+ class="text-shadow font-light heading-color-2 mb-2 text-l sm:text-l md:text-xl lg:text-2xl xl:text-3xl"
92
+ >
93
+ {{ getConferenceDisplayDate() }}
94
+ </h3>
95
+
96
+ <div class="flex-row mt-6">
97
+ <!-- view test stream or webcast -->
98
+ <a
99
+ v-if="showConferenceWebcastButton()"
100
+ :href="getConferenceWebcastUrl()"
101
+ :target="/^http/.test(getConferenceWebcastUrl()) ? '_blank' : '_self'"
102
+ >
103
+ <button class="btn">
104
+ {{ getConferenceWebcastButtonText() }}
105
+ </button>
106
+ </a>
107
+
108
+ <!-- view archive -->
109
+ <a
110
+ v-if="showViewArchiveButton()"
111
+ :href="getViewArchiveUrl()"
112
+ :target="/^http/.test(getViewArchiveUrl()) ? '_blank' : '_self'"
113
+ >
114
+ <button class="btn">
115
+ {{ getViewArchiveButtonText() }}
116
+ </button>
117
+ </a>
118
+
119
+ <!-- register -->
120
+ <a
121
+ v-if="showConferenceRegButton()"
122
+ :href="getConferenceRegUrl()"
123
+ :target="/^http/.test(getConferenceRegUrl()) ? '_blank' : '_self'"
124
+ >
125
+ <button class="btn" :class="hasOtherButton ? 'md:ml-4' : ''">
126
+ {{ getConferenceRegText() }}
127
+ </button>
128
+ </a>
129
+ </div>
130
+ </div>
131
+ <img v-else :src="mainBodyImage" class="w-full h-auto" />
132
+ </div>
133
+ </template>