@icvdeveloper/common-module 0.0.35 → 0.0.37

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.
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.35"
4
+ "version": "0.0.37"
5
5
  }
@@ -0,0 +1,60 @@
1
+ export declare type countdownTimerClassObj = {
2
+ container?: string | null;
3
+ countdownContainer?: string | null;
4
+ beginText?: string | null;
5
+ unitsContainer?: string | null;
6
+ itemContainer?: string | null;
7
+ unitLabel?: string | null;
8
+ unitContainer?: string | null;
9
+ unit?: string | null;
10
+ };
11
+ export declare type sponsorClassObj = {
12
+ container?: string | null;
13
+ sponsorContainer?: string | null;
14
+ labelImageContainer?: string | null;
15
+ labelContainer?: string | null;
16
+ sponsorLabel?: string | null;
17
+ imageContainer?: string | null;
18
+ sponsorImage?: string | null;
19
+ };
20
+ export declare type listEventsCompObj = {
21
+ countdownTimer?: countdownTimerClassObj | null;
22
+ sponsor?: sponsorClassObj | null;
23
+ modal?: string | null;
24
+ login?: string | null;
25
+ };
26
+ export declare type listEventsClassObj = {
27
+ container?: string | null;
28
+ listContainer?: string | null;
29
+ eventContainer?: string | null;
30
+ eventImageContainer?: string | null;
31
+ eventImage?: string | null;
32
+ eventContentContainer?: string | null;
33
+ eventDetailsContainer?: string | null;
34
+ eventDetails?: string | null;
35
+ eventBrand?: string | null;
36
+ eventName?: string | null;
37
+ eventDate?: string | null;
38
+ countdownContainerTop?: string | null;
39
+ countdownContainerRight?: string | null;
40
+ countdownContainerBottom?: string | null;
41
+ buttonCountdownSponsorsContainer?: string | null;
42
+ buttonCountdownContainer?: string | null;
43
+ buttonContainer?: string | null;
44
+ buttonItem?: string | null;
45
+ sponsorsContainer?: string | null;
46
+ components?: listEventsCompObj;
47
+ };
48
+ export declare type presenterListingClassObj = {
49
+ container?: string | null;
50
+ presenterImageContainer?: string | null;
51
+ presenterImage?: string | null;
52
+ presenterContainer?: string | null;
53
+ presenterTextContainer?: string | null;
54
+ presenterNameLink?: string | null;
55
+ presenterName?: string | null;
56
+ presenterRole?: string | null;
57
+ presenterTitle?: string | null;
58
+ presenterBio?: string | null;
59
+ presenterBioLink?: string | null;
60
+ };
File without changes
@@ -1,20 +1,20 @@
1
1
  footer {
2
- @apply bg-color-5;
3
- nav {
4
- @apply bg-color-4;
5
- ul {
6
- @apply list-none p-0 inline-flex justify-start content-center;
7
- }
2
+ // @apply bg-color-5;
3
+ // nav {
4
+ // @apply bg-color-4;
5
+ // ul {
6
+ // @apply list-none p-0 inline-flex justify-start content-center;
7
+ // }
8
8
 
9
- ul li {
10
- @apply flex-auto flex-grow my-3 mx-6 self-center;
11
- a {
12
- @apply no-underline text-white uppercase tracking-wide nav-color-3;
9
+ // ul li {
10
+ // @apply flex-auto flex-grow my-3 mx-6 self-center;
11
+ // a {
12
+ // @apply no-underline text-white uppercase tracking-wide nav-color-3;
13
13
 
14
- &:hover {
15
- @apply nav-color-4;
16
- }
17
- }
18
- }
19
- }
14
+ // &:hover {
15
+ // @apply nav-color-4;
16
+ // }
17
+ // }
18
+ // }
19
+ // }
20
20
  }
@@ -1,41 +1,40 @@
1
1
  header {
2
- @apply bg-color-2;
2
+ // @apply bg-color-2;
3
3
 
4
4
  nav {
5
- @apply bg-color-3;
6
- ul {
7
- @apply inline-flex flex-1 justify-start content-around text-center;
8
- }
5
+ // @apply bg-color-3;
6
+ // ul {
7
+ // @apply inline-flex flex-1 justify-start content-around text-center;
8
+ // }
9
9
 
10
- ul li {
11
- @apply flex-auto flex-grow my-3 self-center text-center;
12
- a {
13
- @apply primary-link nav-color-1;
14
-
15
- &:hover {
16
- @apply nav-color-2;
17
- }
18
-
19
- &.active {
20
- @apply nav-color-2;
21
- }
10
+ // ul li {
11
+ // @apply flex-auto flex-grow my-3 self-center text-center;
12
+ // a {
13
+ // @apply primary-link nav-color-1;
22
14
 
23
- }
24
- }
15
+ // &:hover {
16
+ // @apply nav-color-2;
17
+ // }
18
+
19
+ // &.active {
20
+ // @apply nav-color-2;
21
+ // }
22
+
23
+ // }
24
+ // }
25
25
  }
26
26
  /* mobile nav */
27
27
  .mobile-nav {
28
- @apply bg-color-3;
29
-
30
- button {
31
- @apply border rounded nav-color-1;
32
- border-color: $nav-color-1;
28
+ // @apply bg-color-3;
33
29
 
34
- &:hover {
35
- @apply nav-color-2;
36
- border-color: $nav-color-2;
37
- }
38
- }
30
+ // button {
31
+ // @apply border rounded nav-color-1;
32
+ // border-color: $nav-color-1;
39
33
 
34
+ // &:hover {
35
+ // @apply nav-color-2;
36
+ // border-color: $nav-color-2;
37
+ // }
38
+ // }
40
39
  }
41
40
  }
@@ -2,6 +2,8 @@
2
2
  import { find } from "lodash-es";
3
3
  import { ref, toRefs } from "vue";
4
4
  import { Sponsor as SponsorModel } from "../../../models/conference";
5
+ import { sponsorClassObj } from "../../../@types/components";
6
+ import { useClassBinding } from "../../../composables/useClassBinding";
5
7
 
6
8
  type Props = {
7
9
  sponsor: SponsorModel;
@@ -9,18 +11,32 @@ type Props = {
9
11
  inline?: boolean;
10
12
  hideLabel?: boolean;
11
13
  enabledSponsors?: SponsorModel[];
14
+ classObject?: sponsorClassObj;
12
15
  };
13
16
 
14
17
  const props = withDefaults(defineProps<Props>(), {
15
18
  size: "default",
16
19
  inline: false,
17
- hideLabel: false,
20
+ hideLabel: true,
18
21
  enabledSponsors: () => {
19
22
  return [];
20
23
  },
24
+ classObject: () => {
25
+ return {
26
+ container: "",
27
+ sponsorContainer: "",
28
+ labelImageContainer: "",
29
+ labelContainer: "",
30
+ sponsorLabel: "",
31
+ imageContainer: "",
32
+ sponsorImage: "",
33
+ };
34
+ },
21
35
  });
22
36
 
23
- const { sponsor, size, inline, hideLabel, enabledSponsors } = toRefs(props);
37
+ const { sponsor, size, inline, hideLabel, enabledSponsors, classObject } =
38
+ toRefs(props);
39
+ const { classBinding } = useClassBinding();
24
40
 
25
41
  // data
26
42
  const showModal = ref<boolean>(false);
@@ -43,24 +59,59 @@ const handleClick = () => {
43
59
  </script>
44
60
 
45
61
  <template>
46
- <div class="flex flex-col lg:flex-row flex-1 items-center">
47
- <div :class="size">
48
- <div :class="inline ? 'flex-1 items-center' : 'w-full'">
62
+ <div
63
+ :class="
64
+ classBinding(
65
+ classObject,
66
+ 'sponsorContainer',
67
+ 'flex flex-col lg:flex-row flex-1 items-center'
68
+ )
69
+ "
70
+ >
71
+ <div :class="classBinding(classObject, 'labelImageContainer', size)">
72
+ <div
73
+ v-if="!hideLabel"
74
+ :class="
75
+ inline
76
+ ? classBinding(classObject, 'labelContainer', 'flex-1 items-center')
77
+ : classBinding(classObject, 'labelContainer', 'w-full')
78
+ "
79
+ >
49
80
  <h2
50
- v-if="!hideLabel"
51
- :class="{
52
- 'inline-block lg:pr-5 pb-2 lg:pb-0': inline,
53
- 'pb-2': !inline,
54
- }"
81
+ :class="
82
+ inline
83
+ ? classBinding(
84
+ classObject,
85
+ 'sponsorLabel',
86
+ 'inline-block lg:pr-5 pb-2 lg:pb-0'
87
+ )
88
+ : classBinding(classObject, 'sponsorLabel', 'pb-2')
89
+ "
55
90
  class="text-center uppercase font-medium"
56
91
  >
57
92
  {{ sponsor.label }}
58
93
  </h2>
59
94
  </div>
60
- <div :class="inline ? 'flex-1 items-center pb-2 lg:pb-0' : 'w-full'">
95
+ <div
96
+ :class="
97
+ inline
98
+ ? classBinding(
99
+ classObject,
100
+ 'imageContainer',
101
+ 'flex-1 items-center pb-2 lg:pb-0'
102
+ )
103
+ : classBinding(classObject, 'imageContainer', 'w-full')
104
+ "
105
+ >
61
106
  <img
62
- :class="{ block: !inline }"
63
- class="sponsor-img m-auto cursor-pointer"
107
+ :class="[
108
+ { block: !inline },
109
+ classBinding(
110
+ classObject,
111
+ 'sponsorImage',
112
+ 'sponsor-img m-auto cursor-pointer'
113
+ ),
114
+ ]"
64
115
  :src="sponsor.photo"
65
116
  @click="handleClick()"
66
117
  />
@@ -12,6 +12,8 @@ import {
12
12
  addMinutes,
13
13
  } from "date-fns";
14
14
  import { useTemplateConfigsStore } from "../../store";
15
+ import { countdownTimerClassObj } from "../../@types/components";
16
+ import { useClassBinding } from "../../composables/useClassBinding";
15
17
 
16
18
  interface Props {
17
19
  date: string;
@@ -20,6 +22,7 @@ interface Props {
20
22
  showHours?: boolean;
21
23
  showMinutes?: boolean;
22
24
  showSeconds?: boolean;
25
+ classObject?: countdownTimerClassObj;
23
26
  }
24
27
 
25
28
  const props = withDefaults(defineProps<Props>(), {
@@ -28,8 +31,31 @@ const props = withDefaults(defineProps<Props>(), {
28
31
  showHours: true,
29
32
  showMinutes: true,
30
33
  showSeconds: true,
34
+ classObject: () => {
35
+ return {
36
+ container: "",
37
+ countdownContainer: "",
38
+ beginText: "",
39
+ unitsContainer: "",
40
+ itemContainer: "",
41
+ unitLabel: "",
42
+ unitContainer: "",
43
+ unit: "",
44
+ };
45
+ },
31
46
  });
32
47
 
48
+ const {
49
+ isCompact,
50
+ showDays,
51
+ showHours,
52
+ showMinutes,
53
+ showSeconds,
54
+ classObject,
55
+ } = toRefs(props);
56
+
57
+ const { classBinding } = useClassBinding();
58
+
33
59
  // reactive data
34
60
  const isCounting = ref<boolean>(true);
35
61
  const days = ref<number>(0);
@@ -104,36 +130,83 @@ onMounted(() => {
104
130
 
105
131
  <template>
106
132
  <div
107
- class="countdown-timer"
108
- :class="{ compact: isCompact, fullsize: !isCompact }"
133
+ :class="[
134
+ { compact: isCompact, fullsize: !isCompact },
135
+ classBinding(classObject, 'container', 'countdown-timer'),
136
+ ]"
109
137
  >
110
138
  <div
111
- class="countdown-container flex flex-col pt-8 mx-4 text-center justify-center items-center content-center"
139
+ :class="
140
+ classBinding(
141
+ classObject,
142
+ 'countdownContainer',
143
+ 'countdown-container flex flex-col pt-8 mx-4 text-center justify-center items-center content-center'
144
+ )
145
+ "
112
146
  >
113
147
  <div class="flex-initial">
114
- <h1 v-if="isCounting" class="m-0 p-0 heading-color-3">EVENT BEGINS</h1>
115
- <h1 v-if="!isCounting" class="m-0 p-0 heading-color-3">
116
- {{ eventHasBegunText }}
148
+ <h1
149
+ :class="
150
+ classBinding(
151
+ classObject,
152
+ 'beginText',
153
+ 'm-0 p-0 uppercase heading-color-3'
154
+ )
155
+ "
156
+ >
157
+ {{ isCounting ? "event begins" : eventHasBegunText }}
117
158
  </h1>
118
159
  </div>
119
160
 
120
161
  <div
121
162
  v-if="isCounting"
122
- class="units-container flex text-center p-6 pt-4 mt-4 items-center border border-color-accent-1 accent-color-3"
163
+ :class="
164
+ classBinding(
165
+ classObject,
166
+ 'unitsContainer',
167
+ 'units-container flex text-center p-6 pt-4 mt-4 items-center border border-color-accent-1 accent-color-3'
168
+ )
169
+ "
123
170
  >
124
171
  <!-- Days -->
125
172
  <div
126
173
  v-if="showDays"
127
- class="item-container"
128
- :class="{ dropshade: clockStyle == 'dials' }"
174
+ :class="[
175
+ { dropshade: clockStyle == 'dials' },
176
+ classBinding(classObject, 'itemContainer', 'item-container'),
177
+ ]"
129
178
  >
130
- <div class="unit-label-container" :class="clockStyle">days</div>
131
- <div class="unit-container contrast-border" :class="clockStyle">
132
- <div v-if="clockStyle == 'windows'" :class="fontClass">
179
+ <div
180
+ :class="[
181
+ clockStyle,
182
+ classBinding(classObject, 'unitLabel', 'unit-label-container'),
183
+ ]"
184
+ >
185
+ days
186
+ </div>
187
+ <div
188
+ :class="[
189
+ clockStyle,
190
+ classBinding(
191
+ classObject,
192
+ 'unitContainer',
193
+ 'unit-container contrast-border'
194
+ ),
195
+ ]"
196
+ >
197
+ <div
198
+ v-if="clockStyle == 'windows'"
199
+ :class="[fontClass, classBinding(classObject, 'unit', '')]"
200
+ >
133
201
  {{ days }}
134
202
  </div>
135
203
  <transition v-if="clockStyle == 'dials'" name="slide" mode="out-in">
136
- <div :key="days" :class="fontClass">{{ days }}</div>
204
+ <div
205
+ :key="days"
206
+ :class="[fontClass, classBinding(classObject, 'unit', '')]"
207
+ >
208
+ {{ days }}
209
+ </div>
137
210
  </transition>
138
211
  </div>
139
212
  </div>
@@ -141,16 +214,42 @@ onMounted(() => {
141
214
  <!-- Minutes -->
142
215
  <div
143
216
  v-if="showMinutes"
144
- class="item-container"
145
- :class="{ dropshade: clockStyle == 'dials' }"
217
+ :class="[
218
+ { dropshade: clockStyle == 'dials' },
219
+ classBinding(classObject, 'itemContainer', 'item-container'),
220
+ ]"
146
221
  >
147
- <div class="unit-label-container" :class="clockStyle">min</div>
148
- <div class="unit-container contrast-border" :class="clockStyle">
149
- <div v-if="clockStyle == 'windows'" :class="fontClass">
222
+ <div
223
+ :class="[
224
+ clockStyle,
225
+ classBinding(classObject, 'unitLabel', 'unit-label-container'),
226
+ ]"
227
+ >
228
+ min
229
+ </div>
230
+ <div
231
+ :class="[
232
+ clockStyle,
233
+ classBinding(
234
+ classObject,
235
+ 'unitContainer',
236
+ 'unit-container contrast-border'
237
+ ),
238
+ ]"
239
+ >
240
+ <div
241
+ v-if="clockStyle == 'windows'"
242
+ :class="[fontClass, classBinding(classObject, 'unit', '')]"
243
+ >
150
244
  {{ minutes }}
151
245
  </div>
152
246
  <transition v-if="clockStyle == 'dials'" name="slide" mode="out-in">
153
- <div :key="minutes" :class="fontClass">{{ minutes }}</div>
247
+ <div
248
+ :key="minutes"
249
+ :class="[fontClass, classBinding(classObject, 'unit', '')]"
250
+ >
251
+ {{ minutes }}
252
+ </div>
154
253
  </transition>
155
254
  </div>
156
255
  </div>
@@ -158,16 +257,46 @@ onMounted(() => {
158
257
  <!-- Seconds -->
159
258
  <div
160
259
  v-if="showSeconds"
161
- class="item-container last"
162
- :class="{ dropshade: clockStyle == 'dials' }"
260
+ :class="[
261
+ { dropshade: clockStyle == 'dials' },
262
+ classBinding(classObject, 'itemContainer', 'item-container last'),
263
+ ]"
163
264
  >
164
- <div class="unit-label-container last" :class="clockStyle">sec</div>
165
- <div class="unit-container contrast-border" :class="clockStyle">
166
- <div v-if="clockStyle == 'windows'" :class="fontClass">
265
+ <div
266
+ :class="[
267
+ clockStyle,
268
+ classBinding(
269
+ classObject,
270
+ 'unitLabel',
271
+ 'unit-label-container last'
272
+ ),
273
+ ]"
274
+ >
275
+ sec
276
+ </div>
277
+ <div
278
+ :class="[
279
+ clockStyle,
280
+ classBinding(
281
+ classObject,
282
+ 'unitContainer',
283
+ 'unit-container contrast-border'
284
+ ),
285
+ ]"
286
+ >
287
+ <div
288
+ v-if="clockStyle == 'windows'"
289
+ :class="[fontClass, classBinding(classObject, 'unit', '')]"
290
+ >
167
291
  {{ seconds }}
168
292
  </div>
169
293
  <transition v-if="clockStyle == 'dials'" name="slide" mode="out-in">
170
- <div :key="seconds" :class="fontClass">{{ seconds }}</div>
294
+ <div
295
+ :key="seconds"
296
+ :class="[fontClass, classBinding(classObject, 'unit', '')]"
297
+ >
298
+ {{ seconds }}
299
+ </div>
171
300
  </transition>
172
301
  </div>
173
302
  </div>
@@ -3,37 +3,60 @@ import { storeToRefs } from "pinia";
3
3
  import { useDateFormat } from "../../composables/useDateFormat";
4
4
  import { useConferenceHelpers } from "../../composables/useConferenceHelpers";
5
5
  import { useEvents } from "../../composables/useEvents";
6
+ import { useClassBinding } from "../../composables/useClassBinding";
6
7
  import CommonSponsor from "../agenda/components/Sponsor.vue";
7
- import { Conference } from "../models/conference";
8
+ import { Conference } from "../../models/conference";
9
+ import { Position } from "../../enums/general";
10
+ import { listEventsClassObj } from "../../@types/components";
8
11
 
9
12
  interface Props {
10
13
  showSponsors?: boolean;
11
14
  showBrand?: boolean;
12
- MediaButton?: boolean;
15
+ showCountdown?: boolean;
16
+ mediaButton?: boolean;
13
17
  registerButton?: boolean;
14
18
  loginButton?: boolean;
15
19
  viewInfoButton?: boolean;
16
20
  isUpcoming?: boolean;
21
+ showEventImage?: boolean;
22
+ sponsorPosition?: Position;
23
+ borderPosition?: Position;
24
+ countdownPosition?: Position;
25
+ classObject?: listEventsClassObj;
17
26
  }
18
27
 
19
28
  const props = withDefaults(defineProps<Props>(), {
20
29
  showSponsors: true,
21
30
  showBrand: true,
22
- MediaButton: true,
31
+ showCountdown: true,
32
+ mediaButton: true,
23
33
  registerButton: true,
24
34
  loginButton: true,
25
35
  viewInfoButton: true,
26
36
  isUpcoming: true,
37
+ showEventImage: true,
38
+ sponsorPosition: Position.RIGHT,
39
+ borderPosition: Position.MIDDLE,
40
+ countdownPosition: Position.BOTTOM,
41
+ classObject: () => {
42
+ return {};
43
+ },
27
44
  });
28
45
 
29
46
  const {
30
47
  showSponsors,
31
48
  showBrand,
32
- MediaButton,
49
+ showCountdown,
50
+ mediaButton,
33
51
  registerButton,
34
52
  loginButton,
35
53
  viewInfoButton,
36
54
  isUpcoming,
55
+ showEventImage,
56
+ sponsorPosition,
57
+ borderPosition,
58
+ countdownPosition,
59
+ classObject,
37
60
  } = toRefs(props);
38
61
 
39
62
  // data
@@ -69,6 +92,8 @@ const {
69
92
  isHomePage,
70
93
  } = useEvents();
71
94
 
95
+ const { classBinding } = useClassBinding();
96
+
72
97
  const showViewButton = (_conference: Conference): boolean => {
73
98
  return isUpcoming.value
74
99
  ? showConferenceViewButton(_conference)
@@ -88,7 +113,7 @@ const getVideoButtonText = (_conference: Conference): string => {
88
113
  };
89
114
 
90
115
  // computed
91
- const eventType = computed((): Conference => {
116
+ const eventType = computed((): Conference[] => {
92
117
  return isUpcoming.value ? upcomingEvents.value : pastEvents.value;
93
118
  });
94
119
 
@@ -105,68 +130,188 @@ const showLoginButton = computed((): boolean => {
105
130
  </script>
106
131
 
107
132
  <template>
133
+ <!-- list container -->
108
134
  <div class="flex w-full flex-col">
109
- <div class="container flex-1 mx-auto">
135
+ <!-- list container -->
136
+ <div
137
+ :class="
138
+ classBinding(classObject, 'listContainer', 'container flex-1 mx-auto')
139
+ "
140
+ >
141
+ <!-- individual event container -->
110
142
  <div
111
143
  v-for="conference in eventType"
112
144
  :key="conference.id"
113
- class="flex flex-col items-start md:flex-row py-8"
145
+ :class="[
146
+ {
147
+ 'border-1 border-t border-color-accent-2':
148
+ borderPosition === Position.TOP,
149
+ },
150
+ classBinding(
151
+ classObject,
152
+ 'eventContainer',
153
+ 'flex flex-col items-center md:flex-row py-4'
154
+ ),
155
+ ]"
114
156
  >
115
- <div class="flex w-full md:w-1/3 pb-3 px-3 md:px-6 overflow-hidden">
157
+ <!-- event image -->
158
+ <div
159
+ v-if="showEventImage"
160
+ :class="
161
+ classBinding(
162
+ classObject,
163
+ 'eventImageContainer',
164
+ 'flex w-full md:w-1/3 pb-3 px-3 md:px-6 overflow-hidden'
165
+ )
166
+ "
167
+ >
116
168
  <img
117
- class="flex-1 self-center mx-auto w-full"
169
+ :class="
170
+ classBinding(
171
+ classObject,
172
+ 'eventImage',
173
+ 'flex-1 self-center mx-auto w-full'
174
+ )
175
+ "
118
176
  :src="conference.photo"
119
177
  />
120
178
  </div>
121
-
179
+ <!-- event details container -->
122
180
  <div
123
- class="flex flex-col w-full justify-center items-center self-center text-center md:w-2/3 md:px-6 md:text-left md:justify-start md:items-start"
181
+ :class="[
182
+ { 'md:w-2/3': showEventImage },
183
+ classBinding(
184
+ classObject,
185
+ 'eventContentContainer',
186
+ 'flex flex-col justify-center text-center w-full md:pr-6 md:text-left md:justify-start md:items-start'
187
+ ),
188
+ ]"
124
189
  >
125
- <div class="w-full border-1 border-b border-color-accent-2">
126
- <h3
127
- v-if="showBrand && getBrand(conference.affiliates).length"
128
- class="text-base font-bold leading-normal tracking-wide font-light mb-2 md:text-md lg:text-lg"
129
- >
130
- {{ getBrand(conference.affiliates) }}
131
- </h3>
132
- <nuxt-link
133
- :to="`/${isUpcoming ? 'upcoming-events' : 'past-events'}/${
134
- conference.id
135
- }`"
136
- class="no-underline"
190
+ <!-- event brand, name, date and countdown container -->
191
+ <div
192
+ :class="[
193
+ {
194
+ 'border-1 border-b border-color-accent-2 mb-6':
195
+ borderPosition === Position.MIDDLE,
196
+ },
197
+ classBinding(
198
+ classObject,
199
+ 'eventDetailsContainer',
200
+ 'w-full flex flex-col lg:flex-row'
201
+ ),
202
+ ]"
203
+ >
204
+ <!-- event details -->
205
+ <div
206
+ :class="classBinding(classObject, 'eventDetails', 'flex-grow')"
137
207
  >
138
- <h2
139
- class="text-2xl lg:text-3xl font-medium mb-2 conf-name-alignment"
208
+ <h3
209
+ v-if="showBrand && getBrand(conference.affiliates).length"
210
+ :class="
211
+ classBinding(
212
+ classObject,
213
+ 'eventBrand',
214
+ 'text-base font-bold leading-tight tracking-wide mb-3'
215
+ )
216
+ "
140
217
  >
141
- {{ conference.name }}
142
- </h2>
143
- </nuxt-link>
144
- <p
145
- class="text-base leading-normal tracking-wide font-light uppercase md:text-md lg:text-lg"
146
- >
147
- {{ formatDate(conference.start_date) }}
148
- <span v-if="!isSingleDayEvent(conference)">
149
- - {{ formatDate(conference.end_date) }}</span
218
+ {{ getBrand(conference.affiliates) }}
219
+ </h3>
220
+ <nuxt-link
221
+ :to="`/${isUpcoming ? 'upcoming-events' : 'past-events'}/${
222
+ conference.id
223
+ }`"
224
+ class="no-underline"
225
+ >
226
+ <h2
227
+ :class="
228
+ classBinding(
229
+ classObject,
230
+ 'eventName',
231
+ 'text-2xl lg:text-3xl font-medium mb-2 conf-name-alignment'
232
+ )
233
+ "
234
+ >
235
+ {{ conference.name }}
236
+ </h2>
237
+ </nuxt-link>
238
+ <p
239
+ :class="
240
+ classBinding(
241
+ classObject,
242
+ 'eventDate',
243
+ 'text-base leading-normal tracking-wide font-light uppercase md:text-md lg:text-lg'
244
+ )
245
+ "
150
246
  >
151
- </p>
247
+ {{ formatDate(conference.start_date) }}
248
+ <span v-if="!isSingleDayEvent(conference)">
249
+ - {{ formatDate(conference.end_date) }}</span
250
+ >
251
+ </p>
252
+ </div>
253
+ <!-- countdown timer - top-aligned -->
254
+ <div
255
+ v-if="
256
+ isUpcoming &&
257
+ showCountdown &&
258
+ countdownPosition === Position.TOP &&
259
+ pagesConfigValue('main.countdown_timer')
260
+ "
261
+ :class="
262
+ classBinding(
263
+ classObject,
264
+ 'countdownContainerTop',
265
+ 'flex-auto flex items-center self-center mb-4 lg:mb-0'
266
+ )
267
+ "
268
+ >
269
+ <CommonCountdownTimer
270
+ :date="conference.start_date"
271
+ :is-compact="true"
272
+ :class-object="classObject.components.countdownTimer"
273
+ ></CommonCountdownTimer>
274
+ </div>
152
275
  </div>
153
- <div class="flex flex-col w-full mt-4">
276
+ <!-- event button, countdown timer, and sponsors container -->
277
+ <div
278
+ :class="
279
+ classBinding(
280
+ classObject,
281
+ 'buttonCountdownSponsorsContainer',
282
+ 'flex flex-col w-full'
283
+ )
284
+ "
285
+ >
154
286
  <div
155
- class="flex-1 flex flex-col justify-between xl:flex-row w-full"
287
+ :class="
288
+ classBinding(
289
+ classObject,
290
+ 'buttonCountdownContainer',
291
+ 'flex-1 flex flex-col justify-between xl:flex-row w-full'
292
+ )
293
+ "
156
294
  >
157
295
  <div
158
- class="mt-2 mr-0 xl:mr-4 flex justify-center md:justify-start flex-auto flex-row"
296
+ :class="
297
+ classBinding(
298
+ classObject,
299
+ 'buttonContainer',
300
+ 'flex-auto mr-0 xl:mr-4'
301
+ )
302
+ "
159
303
  >
304
+ <!-- view info button -->
160
305
  <button
161
306
  v-if="viewInfoButton"
162
- :class="buttonClass"
307
+ :class="classBinding(classObject, 'buttonItem', buttonClass)"
163
308
  @click="goEventPage(conference)"
164
309
  >
165
310
  View Info
166
311
  </button>
167
- <!-- view or preview archive -->
312
+ <!-- view live/preview archive button -->
168
313
  <a
169
- v-if="MediaButton && showViewButton(conference)"
314
+ v-if="mediaButton && showViewButton(conference)"
170
315
  :href="getVideoUrl(conference)"
171
316
  :target="
172
317
  /^http/.test(!isUpcoming && getVideoUrl(conference))
@@ -174,21 +319,25 @@ const showLoginButton = computed((): boolean => {
174
319
  : '_self'
175
320
  "
176
321
  >
177
- <button :class="buttonClass">
322
+ <button
323
+ :class="
324
+ classBinding(classObject, 'buttonItem', buttonClass)
325
+ "
326
+ >
178
327
  {{ getVideoButtonText(conference) }}
179
328
  </button>
180
329
  </a>
181
330
 
182
- <!-- login -->
331
+ <!-- login button -->
183
332
  <button
184
333
  v-if="showLoginButton"
185
- :class="buttonClass"
334
+ :class="classBinding(classObject, 'buttonItem', buttonClass)"
186
335
  @click="setConferenceToLoginTo(conference)"
187
336
  >
188
337
  Log In
189
338
  </button>
190
339
 
191
- <!-- register -->
340
+ <!-- register button -->
192
341
  <a
193
342
  v-if="registerButton && showConferenceRegButton(conference)"
194
343
  :href="getConferenceRegUrl(conference)"
@@ -198,43 +347,126 @@ const showLoginButton = computed((): boolean => {
198
347
  : '_self'
199
348
  "
200
349
  >
201
- <button :class="buttonClass">
350
+ <button
351
+ :class="
352
+ classBinding(classObject, 'buttonItem', buttonClass)
353
+ "
354
+ >
202
355
  {{ getConferenceRegText(conference) }}
203
356
  </button>
204
357
  </a>
205
358
  </div>
359
+ <!-- countdown timer - right-aligned -->
206
360
  <div
207
- v-if="isUpcoming && pagesConfigValue('main.countdown_timer')"
208
- class="flex-auto text-right mt-3 md:mt-2"
361
+ v-if="
362
+ isUpcoming &&
363
+ showCountdown &&
364
+ countdownPosition === Position.RIGHT &&
365
+ pagesConfigValue('main.countdown_timer')
366
+ "
367
+ class="flex-auto md:flex mt-3 md:mt-2"
368
+ :class="
369
+ classBinding(
370
+ classObject,
371
+ 'countdownContainerRight',
372
+ 'flex-auto flex items-center self-center mb-4 lg:mb-0'
373
+ )
374
+ "
209
375
  >
210
376
  <CommonCountdownTimer
211
377
  :date="conference.start_date"
212
378
  :is-compact="true"
379
+ :class-object="classObject.components.countdownTimer"
213
380
  ></CommonCountdownTimer>
214
381
  </div>
215
382
  </div>
216
- <div v-if="showSponsors" class="grid grid-cols-5 gap-y-1.5 gap-x-3">
383
+ <!-- countdown timer - bottom-aligned -->
384
+ <div
385
+ v-if="
386
+ isUpcoming &&
387
+ showCountdown &&
388
+ countdownPosition === Position.BOTTOM &&
389
+ pagesConfigValue('main.countdown_timer')
390
+ "
391
+ :class="
392
+ classBinding(
393
+ classObject,
394
+ 'countdownContainerBottom',
395
+ 'flex-auto md:flex my-3 md:my-2'
396
+ )
397
+ "
398
+ >
399
+ <CommonCountdownTimer
400
+ :date="conference.start_date"
401
+ :is-compact="true"
402
+ :class-object="classObject.components.countdownTimer"
403
+ ></CommonCountdownTimer>
404
+ </div>
405
+ <!-- sponsors container - bottom-aligned -->
406
+ <div
407
+ v-if="showSponsors && sponsorPosition === Position.BOTTOM"
408
+ class=""
409
+ :class="
410
+ classBinding(
411
+ classObject,
412
+ 'sponsorsContainer',
413
+ 'grid grid-cols-1 md:grid-cols-3 lg:grid-cols-5 gap-y-1.5 gap-x-3'
414
+ )
415
+ "
416
+ >
417
+ <!-- individual sponsor -->
217
418
  <template
218
419
  v-for="affiliate in orderAffiliates(conference.affiliates)"
219
- :key="affiliate.id"
220
420
  >
221
421
  <CommonSponsor
222
422
  v-if="affiliate.role == 'sponsor'"
423
+ :key="affiliate.id"
223
424
  :sponsor="affiliate"
425
+ :class-object="classObject.components.sponsor"
224
426
  ></CommonSponsor>
225
427
  </template>
226
428
  </div>
227
429
  </div>
228
430
  </div>
431
+ <!-- sponsors container - right-aligned -->
432
+ <div
433
+ v-if="showSponsors && sponsorPosition === Position.RIGHT"
434
+ class="flex flex-col"
435
+ >
436
+ <!-- individual sponsor -->
437
+ <template v-for="affiliate in orderAffiliates(conference.affiliates)">
438
+ <CommonSponsor
439
+ v-if="affiliate.role == 'sponsor'"
440
+ :key="affiliate.id"
441
+ :sponsor="affiliate"
442
+ :class-object="classObject.components.sponsor"
443
+ ></CommonSponsor>
444
+ </template>
445
+ </div>
229
446
  </div>
230
447
  </div>
448
+ <!-- login modal -->
231
449
  <CommonModal
232
450
  :visible="loginModalVisible"
451
+ :class="classObject.components.modal"
233
452
  @trigger="loginModalVisible = false"
234
453
  >
235
454
  <template #modal-body>
236
- <CommonLoginFullWidth :conference="conferenceToLoginTo" />
455
+ <CommonLoginFullWidth
456
+ :conference="conferenceToLoginTo"
457
+ :class="classObject.components.login"
458
+ />
237
459
  </template>
238
460
  </CommonModal>
239
461
  </div>
240
462
  </template>
463
+
464
+ <style lang="scss" scoped>
465
+ .leading-tight {
466
+ line-height: 1.25rem;
467
+ }
468
+
469
+ .mr-4 {
470
+ margin-right: 1rem;
471
+ }
472
+ </style>
@@ -2,29 +2,53 @@
2
2
  import { toRefs } from "vue";
3
3
  import { Presenter } from "../../models/conference";
4
4
  import { usePresenter } from "../../composables/usePresenter";
5
+ import { useClassBinding } from "../../composables/useClassBinding";
6
+ import { presenterListingClassObj } from "../../@types/components";
7
+ import { Position } from "../../enums/general";
5
8
 
6
9
  type Props = {
7
10
  presenter: Presenter;
8
- textClass?: string;
9
- linkClass?: string;
10
11
  enableBio?: boolean;
11
12
  showBio?: boolean;
12
13
  isSmallGroupedTrack?: boolean;
14
+ bioLinkOnName?: boolean;
15
+ bioLinkText?: string;
16
+ bioLinkPosition?: Position;
17
+ imagePosition?: Position;
18
+ classObject?: presenterListingClassObj;
13
19
  };
14
20
 
15
21
  const props = withDefaults(defineProps<Props>(), {
16
- textClass: "font-medium text-lg",
17
- linkClass: "",
18
22
  enableBio: true,
19
23
  showBio: false,
20
24
  isSmallGroupedTrack: false,
25
+ bioLinkOnName: true,
26
+ bioLinkText: "Read More >",
27
+ bioLinkPosition: Position.BOTTOM,
28
+ imagePosition: Position.LEFT,
29
+ classObject: () => {
30
+ return {
31
+ container: "",
32
+ presenterImageContainer: "",
33
+ presenterImage: "",
34
+ presenterContainer: "",
35
+ presenterTextContainer: "",
36
+ presenterNameLink: "",
37
+ presenterName: "",
38
+ presenterRole: "",
39
+ presenterTitle: "",
40
+ presenterBio: "",
41
+ presenterBioLink: "",
42
+ };
43
+ },
21
44
  });
22
45
 
23
46
  const emit = defineEmits(["clicked"]);
24
47
 
25
- const { presenter, textClass, linkClass, enableBio, isSmallGroupedTrack } =
48
+ const { presenter, enableBio, isSmallGroupedTrack, classObject } =
26
49
  toRefs(props);
27
50
  const { fullName, titleCompany } = usePresenter(presenter);
51
+ const { classBinding } = useClassBinding();
28
52
 
29
53
  // methods
30
54
  const handleClick = () => {
@@ -35,34 +59,105 @@ const handleClick = () => {
35
59
  </script>
36
60
 
37
61
  <template>
38
- <div :class="textClass">
39
- <p class="my-1">
40
- <a
41
- v-if="enableBio"
42
- class="cursor-pointer"
43
- :class="linkClass"
44
- @click="handleClick()"
45
- >{{ fullName }}</a
62
+ <div>
63
+ <div
64
+ :class="[
65
+ { 'flex-col': imagePosition !== Position.RIGHT },
66
+ { 'md:flex-row': imagePosition !== Position.TOP },
67
+ { 'flex-col-reverse': imagePosition === Position.RIGHT },
68
+ classBinding(
69
+ classObject,
70
+ 'presenterContainer',
71
+ 'flex-1 flex content-center items-center md:items-start'
72
+ ),
73
+ ]"
74
+ >
75
+ <div
76
+ v-if="presenter.photo.length && imagePosition !== Position.RIGHT"
77
+ :class="
78
+ classBinding(classObject, 'presenterImageContainer', 'shrink p-2')
79
+ "
46
80
  >
47
- <span v-else>{{ fullName }}</span>
48
- <span
49
- v-if="presenter.role == 'moderator'"
50
- class="text-grey-dark"
51
- :class="isSmallGroupedTrack ? 'new-line' : 'no-new-line'"
52
- >Moderator</span
81
+ <img
82
+ :src="presenter.photo"
83
+ :class="classBinding(classObject, 'presenterImage', '')"
84
+ />
85
+ </div>
86
+ <div
87
+ :class="
88
+ classBinding(
89
+ classObject,
90
+ 'presenterTextContainer',
91
+ 'flex flex-col text-center md:text-left self-center'
92
+ )
93
+ "
53
94
  >
54
- <span
55
- v-if="titleCompany"
56
- class="font-light paragraph-color-1"
57
- :class="isSmallGroupedTrack ? 'new-line' : 'new-line-responsive'"
58
- >{{ titleCompany }}</span
95
+ <p class="my-1">
96
+ <a
97
+ v-if="enableBio && bioLinkOnName"
98
+ class="cursor-pointer"
99
+ :class="classBinding(classObject, 'presenterNameLink', '')"
100
+ @click="handleClick()"
101
+ ><span :class="classBinding(classObject, 'presenterName', '')">
102
+ {{ fullName }}</span
103
+ ></a
104
+ >
105
+ <span v-else :class="classBinding(classObject, 'presenterName', '')">
106
+ {{ fullName }}
107
+ </span>
108
+ <span
109
+ v-if="presenter.role == 'moderator'"
110
+ :class="[
111
+ isSmallGroupedTrack ? 'new-line' : 'no-new-line',
112
+ classBinding(classObject, 'presenterRole', 'text-grey-dark'),
113
+ ]"
114
+ >Moderator</span
115
+ >
116
+ <span
117
+ v-if="titleCompany"
118
+ :class="[
119
+ isSmallGroupedTrack ? 'new-line' : 'new-line-responsive',
120
+ classBinding(
121
+ classObject,
122
+ 'presenterTitle',
123
+ 'font-light paragraph-color-1'
124
+ ),
125
+ ]"
126
+ >{{ titleCompany }}</span
127
+ >
128
+ </p>
129
+ <p
130
+ v-if="showBio && presenter.biography"
131
+ :class="
132
+ classBinding(
133
+ classObject,
134
+ 'presenterBio',
135
+ 'font-light text-base paragraph-color-1'
136
+ )
137
+ "
138
+ v-html="presenter.biography"
139
+ ></p>
140
+ <div v-if="enableBio && !bioLinkOnName" class="shrink">
141
+ <a
142
+ class="cursor-pointer"
143
+ :class="classBinding(classObject, 'presenterBioLink', '')"
144
+ @click="handleClick()"
145
+ >{{ bioLinkText }}
146
+ </a>
147
+ </div>
148
+ </div>
149
+ <div
150
+ v-if="presenter.photo.length && imagePosition === Position.RIGHT"
151
+ :class="
152
+ classBinding(classObject, 'presenterImageContainer', 'shrink p-2')
153
+ "
59
154
  >
60
- </p>
61
- <p
62
- v-if="showBio && presenter.biography"
63
- class="font-light text-base paragraph-color-1"
64
- v-html="presenter.biography"
65
- ></p>
155
+ <img
156
+ :src="presenter.photo"
157
+ :class="classBinding(classObject, 'presenterImage', '')"
158
+ />
159
+ </div>
160
+ </div>
66
161
  </div>
67
162
  </template>
68
163
 
@@ -24,14 +24,18 @@ const { fullName, presenterImageStyle, itemWidthStyle, isGrayScale } =
24
24
  <template>
25
25
  <div>
26
26
  <div v-if="useIcon" class="presenter-icon cursor-pointer">
27
- <CommonSvgIcon icon="info" :greyscale="isGrayScale"></CommonSvgIcon>
27
+ <CommonSvgIcon
28
+ icon="info"
29
+ :greyscale="isGrayScale"
30
+ @click="modalVisible = true"
31
+ ></CommonSvgIcon>
28
32
  </div>
29
33
 
30
34
  <CommonPresenterListing
31
35
  v-else
32
36
  :presenter="presenter"
33
37
  :enable-bio="true"
34
- :show-bio="false"
38
+ :show-bio="true"
35
39
  text-class="font-bold text-base"
36
40
  link-class="agenda-presenter-color"
37
41
  :is-small-grouped-track="isSmallGroupedTrack"
@@ -0,0 +1,4 @@
1
+ export declare type UseClassBindingMethods = {
2
+ classBinding(_classObject: {}, _element: string, _defaults: string): string;
3
+ };
4
+ export declare const useClassBinding: () => UseClassBindingMethods;
@@ -0,0 +1,12 @@
1
+ export const useClassBinding = () => {
2
+ const classBinding = (_classObject, _element, _defaults) => {
3
+ const key = _element;
4
+ if (_classObject[`${key}`] === void 0 || !_classObject[`${key}`].length) {
5
+ return _defaults;
6
+ }
7
+ return _classObject[`${key}`];
8
+ };
9
+ return {
10
+ classBinding
11
+ };
12
+ };
@@ -43,8 +43,7 @@ export const useConferenceHelpers = (conference) => {
43
43
  const isSingleDayEvent = (_conference) => {
44
44
  const _selectedConference = _getSelectedConference(_conference);
45
45
  const firstDay = new Date(_selectedConference.start_date).getMonth() + "/" + new Date(_selectedConference.start_date).getDate();
46
- const lastDay = new Date(_selectedConference.end_date).getMonth() + "/" + 3;
47
- new Date(_selectedConference.end_date).getDate();
46
+ const lastDay = new Date(_selectedConference.end_date).getMonth() + "/" + new Date(_selectedConference.end_date).getDate();
48
47
  return firstDay === lastDay;
49
48
  };
50
49
  const showConferenceWebcastButton = (_conference) => {
@@ -1,6 +1,7 @@
1
1
  import { storeToRefs } from "pinia";
2
- import { useRouter } from "vue-router";
2
+ import { useRouter, useRoute } from "vue-router";
3
3
  import { sortBy } from "lodash-es";
4
+ import { useAuthStore, useTemplateConfigsStore } from "../store/index.mjs";
4
5
  export const useEvents = () => {
5
6
  const route = useRoute();
6
7
  const router = useRouter();
@@ -32,7 +33,7 @@ export const useEvents = () => {
32
33
  return brand;
33
34
  };
34
35
  const buttonClass = computed(() => {
35
- return pagesConfigValue.value("main.countdown_timer") ? "mx-2 mb-2 w-5/6 sm:mr-1 sm:w-auto md:mr-0 md:w-full xl:mr-1 xl:w-auto btn btn-secondary" : "mx-2 mb-2 w-5/6 sm:mr-1 sm:w-auto btn btn-secondary";
36
+ return pagesConfigValue.value("main.countdown_timer") ? "mx-2 mb-2 w-5/6 sm:w-auto sm:mx-0 sm:mr-4 md:w-full xl:mr-1 xl:w-auto btn btn-secondary" : "mx-2 mb-2 w-5/6 sm:w-auto sm:mx-0 sm:mr-4 btn btn-secondary";
36
37
  });
37
38
  const isHomePage = computed(() => {
38
39
  return route.name === "index";
@@ -0,0 +1,7 @@
1
+ export declare enum Position {
2
+ BOTTOM = "bottom",
3
+ TOP = "top",
4
+ LEFT = "left",
5
+ RIGHT = "right",
6
+ MIDDLE = "middle"
7
+ }
@@ -0,0 +1,8 @@
1
+ export var Position = /* @__PURE__ */ ((Position2) => {
2
+ Position2["BOTTOM"] = "bottom";
3
+ Position2["TOP"] = "top";
4
+ Position2["LEFT"] = "left";
5
+ Position2["RIGHT"] = "right";
6
+ Position2["MIDDLE"] = "middle";
7
+ return Position2;
8
+ })(Position || {});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@icvdeveloper/common-module",
3
- "version": "0.0.35",
3
+ "version": "0.0.37",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "exports": {
@@ -35,6 +35,7 @@
35
35
  "pinia-plugin-persistedstate": "^2.1.1",
36
36
  "sass": "^1.54.2",
37
37
  "sass-loader": "^13.0.2",
38
+ "tailwindcss-opentype": "^1.1.0",
38
39
  "vite-svg-loader": "^3.4.0"
39
40
  },
40
41
  "devDependencies": {