@usssa/component-library 1.0.0-alpha.27 → 1.0.0-alpha.271

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 (105) hide show
  1. package/README.md +8 -5
  2. package/package.json +30 -8
  3. package/src/assets/VS.svg +5 -0
  4. package/src/assets/fonts/CorneroRegular.woff +0 -0
  5. package/src/assets/fonts/CorneroRegular.woff2 +0 -0
  6. package/src/assets/logo.svg +19 -0
  7. package/src/assets/no-result.svg +25 -0
  8. package/src/assets/upload-illustration.svg +48 -0
  9. package/src/components/core/UAccordionSelect.vue +237 -0
  10. package/src/components/core/UAvatar.vue +90 -26
  11. package/src/components/core/UAvatarGroup.vue +62 -52
  12. package/src/components/core/UBadgeStd.vue +6 -1
  13. package/src/components/core/UBannerStd.vue +100 -31
  14. package/src/components/core/UBracket.vue +2181 -0
  15. package/src/components/core/UBreadCrumbs.vue +171 -0
  16. package/src/components/core/UBtnIcon.vue +106 -53
  17. package/src/components/core/UBtnStd.vue +38 -31
  18. package/src/components/core/UBtnToggle.vue +11 -6
  19. package/src/components/core/UCheckboxStd.vue +26 -20
  20. package/src/components/core/UChip.vue +107 -58
  21. package/src/components/core/UDate.vue +627 -0
  22. package/src/components/core/UDialogStd.vue +456 -58
  23. package/src/components/core/UDrawer/UDrawer.vue +479 -0
  24. package/src/components/core/UDrawer/UDrawerMenuItem.vue +130 -0
  25. package/src/components/core/UEventCard.vue +463 -0
  26. package/src/components/core/UExpansionStd.vue +380 -0
  27. package/src/components/core/UExpansionTableStd.vue +311 -0
  28. package/src/components/core/UFilter.vue +99 -0
  29. package/src/components/core/UGameObject.vue +478 -0
  30. package/src/components/core/UInnerLoader.vue +69 -0
  31. package/src/components/core/UInputAddressLookup.vue +535 -0
  32. package/src/components/core/UInputPhoneStd.vue +74 -67
  33. package/src/components/core/UInputTextStd.vue +99 -64
  34. package/src/components/core/UInputTypeahead.vue +44 -0
  35. package/src/components/core/UInputTypeaheadAdvanceSearch.vue +134 -0
  36. package/src/components/core/UMatchup.vue +404 -0
  37. package/src/components/core/UMenuButtonStd.vue +280 -0
  38. package/src/components/core/UMenuDropdown.vue +38 -33
  39. package/src/components/core/UMenuDropdownAdvancedSearch.vue +306 -0
  40. package/src/components/core/UMenuItem.vue +226 -0
  41. package/src/components/core/UMenuSearch.vue +73 -0
  42. package/src/components/core/UModal.vue +660 -0
  43. package/src/components/core/UMultiSelectStd.vue +521 -63
  44. package/src/components/core/UPagination.vue +76 -24
  45. package/src/components/core/URadioBtn.vue +66 -43
  46. package/src/components/core/URadioStd.vue +23 -14
  47. package/src/components/core/USelectStd.vue +441 -84
  48. package/src/components/core/USheet.vue +349 -0
  49. package/src/components/core/UStepper/UProgress.vue +157 -0
  50. package/src/components/core/UStepper/UStepper.vue +214 -0
  51. package/src/components/core/UTabBtnStd.vue +36 -22
  52. package/src/components/core/UTable/UTable.vue +2269 -57
  53. package/src/components/core/UTableStd.vue +1436 -286
  54. package/src/components/core/UTabsStd.vue +53 -23
  55. package/src/components/core/UToggleStd.vue +18 -13
  56. package/src/components/core/UToolbar/UCustomMenuIcon.vue +58 -0
  57. package/src/components/core/UToolbar/UToolbar.vue +226 -0
  58. package/src/components/core/UTooltip.vue +32 -10
  59. package/src/components/core/UTypeahead.vue +890 -0
  60. package/src/components/core/UUploader.vue +757 -0
  61. package/src/components/core/UVenueCard.vue +221 -0
  62. package/src/components/index.js +83 -30
  63. package/src/composables/useNotify.js +16 -16
  64. package/src/composables/useOverlayLoader.js +23 -0
  65. package/src/composables/useScreenType.js +30 -0
  66. package/src/css/app.sass +69 -36
  67. package/src/css/colors.sass +2 -0
  68. package/src/css/quasar.variables.sass +102 -70
  69. package/src/css/vars/colors.variables.sass +28 -41
  70. package/src/utils/bracket.json +1538 -0
  71. package/src/utils/data.ts +179 -0
  72. package/src/App.vue +0 -9
  73. package/src/boot/.gitkeep +0 -0
  74. package/src/components/core/UMenutem.vue +0 -130
  75. package/src/layouts/MainLayout.vue +0 -145
  76. package/src/pages/Avatar.vue +0 -77
  77. package/src/pages/AvatarGroup.vue +0 -139
  78. package/src/pages/BadgeStd.vue +0 -83
  79. package/src/pages/BannerPage.vue +0 -76
  80. package/src/pages/BtnIcon.vue +0 -120
  81. package/src/pages/BtnStd.vue +0 -126
  82. package/src/pages/BtnToggle.vue +0 -131
  83. package/src/pages/CheckBox.vue +0 -62
  84. package/src/pages/Chip.vue +0 -108
  85. package/src/pages/ComponentBase.vue +0 -54
  86. package/src/pages/Dialog.vue +0 -206
  87. package/src/pages/ErrorNotFound.vue +0 -11
  88. package/src/pages/IndexPage.vue +0 -11
  89. package/src/pages/InputPhone.vue +0 -152
  90. package/src/pages/InputText.vue +0 -140
  91. package/src/pages/MenuDropdown.vue +0 -79
  92. package/src/pages/MenuItem.vue +0 -68
  93. package/src/pages/MultiSelectStd.vue +0 -174
  94. package/src/pages/NotifyPage.vue +0 -109
  95. package/src/pages/Pagination.vue +0 -71
  96. package/src/pages/Radio.vue +0 -80
  97. package/src/pages/RadioBtn.vue +0 -104
  98. package/src/pages/SelectStd.vue +0 -160
  99. package/src/pages/TabButtonPage.vue +0 -126
  100. package/src/pages/TablePage.vue +0 -375
  101. package/src/pages/TabsPage.vue +0 -261
  102. package/src/pages/TogglePage.vue +0 -58
  103. package/src/pages/TooltipPage.vue +0 -125
  104. package/src/router/index.js +0 -34
  105. package/src/router/routes.js +0 -121
@@ -0,0 +1,463 @@
1
+ <script setup>
2
+ import { computed, onMounted, ref } from 'vue'
3
+
4
+ import defaultImage from '../../assets/no-result.svg'
5
+ import { useScreenType } from '../../composables/useScreenType'
6
+ import { trimmedLabel } from '../../utils/data'
7
+ import UBtnStd from './UBtnStd.vue'
8
+ import UChip from './UChip.vue'
9
+ import UTooltip from './UTooltip.vue'
10
+
11
+ const emit = defineEmits(['onRegister', 'onView'])
12
+ const props = defineProps({
13
+ dataTestId: {
14
+ type: String,
15
+ default: 'eventCard',
16
+ },
17
+ eventAgeGroup: {
18
+ type: String,
19
+ },
20
+ eventCategory: {
21
+ type: String,
22
+ },
23
+ eventDate: {
24
+ type: String,
25
+ },
26
+ eventHost: {
27
+ type: String,
28
+ },
29
+ eventLocation: {
30
+ type: String,
31
+ },
32
+ eventLogo: {
33
+ type: String,
34
+ },
35
+ eventName: {
36
+ type: String,
37
+ },
38
+ eventPlayersMax: {
39
+ type: String,
40
+ default: '0',
41
+ },
42
+ eventPrice: {
43
+ type: String,
44
+ },
45
+ eventRegisterText: {
46
+ type: String,
47
+ },
48
+ eventViewText: {
49
+ type: String,
50
+ },
51
+ isRegisterEventActionDisabled: {
52
+ type: Boolean,
53
+ default: false,
54
+ },
55
+ isViewEventActionDisabled: {
56
+ type: Boolean,
57
+ default: false,
58
+ },
59
+ registerEventTooltip: {
60
+ type: String,
61
+ default: '',
62
+ },
63
+ })
64
+
65
+ const VERTICAL_TEXT_LIMIT = 13
66
+
67
+ const $screen = useScreenType()
68
+
69
+ const eventChip = ref(true) // this is required to show chip
70
+ const isCategoryOverflowing = ref(false)
71
+ const isNameOverflowing = ref(false)
72
+ const textEName = ref(null)
73
+
74
+ const eventAgeGroup = computed(() => trimmedLabel(props.eventAgeGroup, 30))
75
+ const eventDate = computed(() => trimmedLabel(props.eventDate, 30))
76
+ const eventHost = computed(() => trimmedLabel(props.eventHost, 50))
77
+ const eventLocation = computed(() => trimmedLabel(props.eventLocation, 50))
78
+ const eventPlayersMax = computed(() =>
79
+ trimmedLabel(props.eventPlayersMax, 9, '0')
80
+ )
81
+ const eventPrice = computed(() => trimmedLabel(props.eventPrice, 30))
82
+ const eventRegisterText = computed(() =>
83
+ trimmedLabel(props.eventRegisterText, 15, 'Register Event')
84
+ )
85
+ const eventViewText = computed(() =>
86
+ trimmedLabel(props.eventViewText, 15, 'View Event')
87
+ )
88
+
89
+ const isMobile = computed(() => $screen.value.isMobile)
90
+
91
+ const checkOverflow = () => {
92
+ if (props.eventCategory.length > VERTICAL_TEXT_LIMIT) {
93
+ isCategoryOverflowing.value = true
94
+ }
95
+
96
+ if (textEName.value) {
97
+ isNameOverflowing.value =
98
+ textEName.value.scrollWidth > textEName.value.clientWidth ||
99
+ textEName.value.scrollHeight > textEName.value.clientHeight
100
+ }
101
+ }
102
+
103
+ const registerClick = () => {
104
+ emit('onRegister')
105
+ }
106
+
107
+ const viewClick = () => {
108
+ emit('onView')
109
+ }
110
+
111
+ onMounted(() => {
112
+ const verticalTextEle = document.getElementsByClassName('event-vertical-text')
113
+ Array.from(verticalTextEle).forEach((el) => {
114
+ const originalText = el.innerText.trim()
115
+ if (originalText.length > VERTICAL_TEXT_LIMIT) {
116
+ el.innerText = originalText.slice(0, VERTICAL_TEXT_LIMIT) + '...'
117
+ }
118
+ })
119
+ })
120
+ </script>
121
+
122
+ <template>
123
+ <!-- Event Card for Desktop and Tab devices -->
124
+
125
+ <q-card
126
+ v-if="!isMobile"
127
+ class="flex event-card no-wrap"
128
+ :aria-label="`${props.eventName} ${props.eventDate}`"
129
+ :data-testid="dataTestId"
130
+ tabindex="0"
131
+ >
132
+ <!-- Column 1: Rotated Text -->
133
+ <div
134
+ class="flex items-center justify-center q-py-sm q-px-xs rotated-text event-vertical-text text-dark text-italic text-display-xxxs text-center cornero-font-family ellipsis"
135
+ data-testid="eventCategory"
136
+ @mouseenter="checkOverflow"
137
+ >
138
+ {{ props.eventCategory }}
139
+ <UTooltip
140
+ v-if="isCategoryOverflowing"
141
+ :description="props.eventCategory"
142
+ />
143
+ </div>
144
+ <!-- Right Column: Nested 3-column layout -->
145
+ <div
146
+ class="flex justify-between items-start q-pt-ms q-pr-ms q-pb-ms event-details no-wrap"
147
+ >
148
+ <!-- Column 2: Image -->
149
+ <div class="flex items-center justify-center">
150
+ <!-- Logo -->
151
+ <q-avatar class="event-logo" size="6.75rem">
152
+ <q-img
153
+ alt="event-card-logo"
154
+ data-testid="eventLogo"
155
+ :error-src="defaultImage"
156
+ :src="props.eventLogo || defaultImage"
157
+ />
158
+ </q-avatar>
159
+ </div>
160
+
161
+ <!-- Column 3: Grid Text -->
162
+ <div class="flex column justify-center event-text-col-wrapper">
163
+ <div class="event-item text-caption-lg text-description">
164
+ <span v-if="props.eventDate" class="q-mr-xxs">
165
+ {{ eventDate.text }}
166
+ <UTooltip
167
+ v-if="eventDate.isTrimmed"
168
+ :description="props.eventDate"
169
+ />
170
+ </span>
171
+ |
172
+ <span v-if="props.eventPrice" class="q-px-xxs">
173
+ {{ eventPrice.text }}
174
+ <UTooltip
175
+ v-if="eventPrice.isTrimmed"
176
+ :description="props.eventPrice"
177
+ />
178
+ </span>
179
+ |
180
+ <UChip
181
+ v-model="eventChip"
182
+ class="event-team-users-count"
183
+ iconClass="fa-kit-duotone fa-users icon-secondary-opacity"
184
+ :chipLabel="eventPlayersMax.text"
185
+ dense
186
+ :removable="false"
187
+ type="positive"
188
+ />
189
+ </div>
190
+
191
+ <div
192
+ v-if="props.eventName"
193
+ class="text-dark text-heading-lg event-name ellipsis q-pt-xs q-pb-ba"
194
+ data-testid="eventName"
195
+ ref="textEName"
196
+ @mouseenter="checkOverflow"
197
+ >
198
+ {{ props.eventName }}
199
+ <UTooltip v-if="isNameOverflowing" :description="props.eventName" />
200
+ </div>
201
+ <div class="event-item text-body-md text-description">
202
+ <span v-if="props.eventAgeGroup" class="q-mr-xxs">
203
+ {{ eventAgeGroup.text }}
204
+ <UTooltip
205
+ v-if="eventAgeGroup.isTrimmed"
206
+ :description="props.eventAgeGroup"
207
+ />
208
+ </span>
209
+ <span v-if="props.eventAgeGroup && props.eventLocation">|</span>
210
+ <span v-if="props.eventLocation" class="q-px-xxs">
211
+ {{ eventLocation.text }}
212
+ <UTooltip
213
+ v-if="eventLocation.isTrimmed"
214
+ :description="props.eventLocation"
215
+ />
216
+ </span>
217
+ <span
218
+ v-if="
219
+ (props.eventAgeGroup || props.eventLocation) && props.eventHost
220
+ "
221
+ >
222
+ |
223
+ </span>
224
+ <span v-if="props.eventHost" class="q-ml-xxs">
225
+ {{ eventHost.text }}
226
+ <UTooltip
227
+ v-if="eventHost.isTrimmed"
228
+ :description="props.eventHost"
229
+ />
230
+ </span>
231
+ </div>
232
+ </div>
233
+
234
+ <!-- Column 4: Buttons -->
235
+ <div
236
+ class="flex column justify-center items-end event-action no-wrap shrink"
237
+ >
238
+ <u-btn-std
239
+ class="border-radius-sm full-width text-no-wrap ellipsis"
240
+ :aria-label="props.eventRegisterText || 'Register Event'"
241
+ color="primary"
242
+ data-testid="eventRegisterBtn"
243
+ :disable="isRegisterEventActionDisabled"
244
+ size="md"
245
+ @click="registerClick"
246
+ >
247
+ {{ eventRegisterText.text }}
248
+ <UTooltip
249
+ v-if="eventRegisterText.isTrimmed"
250
+ :description="props.eventRegisterText"
251
+ />
252
+ </u-btn-std>
253
+ <u-btn-std
254
+ class="border-radius-sm full-width text-no-wrap ellipsis"
255
+ :aria-label="props.eventViewText || 'View Event'"
256
+ color="primary"
257
+ data-testid="eventViewBtn"
258
+ :disable="isViewEventActionDisabled"
259
+ flat
260
+ size="md"
261
+ @click="viewClick"
262
+ >
263
+ {{ eventViewText.text }}
264
+ <UTooltip
265
+ v-if="eventViewText.isTrimmed"
266
+ :description="props.eventViewText"
267
+ />
268
+ </u-btn-std>
269
+ </div>
270
+ </div>
271
+ </q-card>
272
+
273
+ <!-- Event Card for Mobile devices -->
274
+ <q-card
275
+ v-if="isMobile"
276
+ class="event-card event-row-mobile text-center q-pa-ba"
277
+ :aria-label="props.eventName + props.eventDate || 'Event Card'"
278
+ :data-testid="dataTestId"
279
+ >
280
+ <!-- Left Ribbon -->
281
+ <div class="event-item-mobile">
282
+ <div
283
+ class="text-dark text-display-xxxs text-italic cornero-font-family text-no-wrap ellipsis"
284
+ data-testid="eventCategory"
285
+ @mouseenter="checkOverflow"
286
+ >
287
+ {{ props.eventCategory }}
288
+ <UTooltip
289
+ v-if="isCategoryOverflowing"
290
+ :description="props.eventCategory"
291
+ />
292
+ </div>
293
+ </div>
294
+
295
+ <div class="event-item-mobile event-logo-mobile q-mt-ba q-pa-ba">
296
+ <!-- Logo -->
297
+ <q-avatar class="event-logo" size="6.75rem">
298
+ <q-img
299
+ alt="event-card-logo"
300
+ data-testid="eventLogo"
301
+ :error-src="defaultImage"
302
+ :src="props.eventLogo || defaultImage"
303
+ />
304
+ </q-avatar>
305
+ </div>
306
+
307
+ <!-- Event Info -->
308
+ <div
309
+ class="event-item-mobile event-name-mobile text-heading-sm text-dark flex justify-center q-mt-ba ellipsis-3-lines"
310
+ data-testid="eventName"
311
+ ref="textEName"
312
+ @mouseenter="checkOverflow"
313
+ >
314
+ {{ props.eventName }}
315
+ <UTooltip v-if="isNameOverflowing" :description="props.eventName" />
316
+ </div>
317
+
318
+ <div class="event-item-mobile text-caption-md text-description q-mt-xs">
319
+ <span v-if="props.eventDate" class="q-px-xxs">
320
+ {{ eventDate.text }}
321
+ <UTooltip v-if="eventDate.isTrimmed" :description="props.eventDate" />
322
+ </span>
323
+ |
324
+ <span v-if="props.eventPrice" class="q-px-xxs">
325
+ {{ eventPrice.text }}
326
+ <UTooltip v-if="eventPrice.isTrimmed" :description="props.eventPrice" />
327
+ </span>
328
+ |
329
+ <UChip
330
+ v-model="eventChip"
331
+ class="event-team-users-count"
332
+ iconClass="fa-kit-duotone fa-users icon-secondary-opacity"
333
+ :chipLabel="eventPlayersMax.text"
334
+ dense
335
+ :removable="false"
336
+ type="positive"
337
+ />
338
+ </div>
339
+
340
+ <div class="event-item-mobile text-body-md text-description q-mt-ba">
341
+ <span v-if="props.eventAgeGroup" class="q-mx-xxs">
342
+ {{ eventAgeGroup.text }}
343
+ <UTooltip
344
+ v-if="eventAgeGroup.isTrimmed"
345
+ :description="props.eventAgeGroup"
346
+ />
347
+ </span>
348
+ <span v-if="props.eventAgeGroup && props.eventLocation">|</span>
349
+ <span v-if="props.eventLocation" class="q-px-xxs">
350
+ {{ eventLocation.text }}
351
+ <UTooltip
352
+ v-if="eventLocation.isTrimmed"
353
+ :description="props.eventLocation"
354
+ />
355
+ </span>
356
+ <span
357
+ v-if="(props.eventAgeGroup || props.eventLocation) && props.eventHost"
358
+ >|</span
359
+ >
360
+ <span v-if="props.eventHost" class="q-ml-xxs">
361
+ {{ eventHost.text }}
362
+ <UTooltip v-if="eventHost.isTrimmed" :description="props.eventHost" />
363
+ </span>
364
+ </div>
365
+
366
+ <!-- Right Actions -->
367
+ <div class="row event-action-mobile q-mt-ba">
368
+ <q-card-actions
369
+ class="full-width-actions justify-center mobile-btn-actions action-buttons"
370
+ >
371
+ <u-btn-std
372
+ class="border-radius-sm text-no-wrap"
373
+ :aria-label="props.eventViewText || 'View Event'"
374
+ color="primary"
375
+ data-testid="eventViewBtn"
376
+ :disable="isViewEventActionDisabled"
377
+ flat
378
+ :label="eventViewText.text"
379
+ size="md"
380
+ @click="viewClick"
381
+ />
382
+ <u-btn-std
383
+ class="border-radius-sm text-no-wrap"
384
+ :aria-label="props.eventRegisterText || 'Register Event'"
385
+ color="primary"
386
+ data-testid="eventRegisterBtn"
387
+ :disable="isRegisterEventActionDisabled"
388
+ :label="eventRegisterText.text"
389
+ size="md"
390
+ @click="registerClick"
391
+ />
392
+ </q-card-actions>
393
+ </div>
394
+ </q-card>
395
+ </template>
396
+
397
+ <style lang="sass">
398
+ .event-card
399
+ border: 0.0625rem solid $neutral-4
400
+ border-radius: $xs
401
+ box-shadow: none !important
402
+ overflow: hidden
403
+ justify-content: space-between
404
+ box-sizing: border-box
405
+
406
+ .rotated-text
407
+ writing-mode: vertical-rl
408
+ transform: rotate(180deg)
409
+ text-orientation: mixed
410
+ max-width: 100%
411
+
412
+ .event-details
413
+ flex-direction: row !important
414
+ align-items: stretch !important
415
+ flex: 1 !important
416
+ gap: $ms
417
+ min-width: 0
418
+
419
+ .event-logo
420
+ border-radius: 0
421
+
422
+ .event-action
423
+ gap: $ba
424
+ flex-shrink: 0
425
+
426
+ .full-width-actions
427
+ width: 100%
428
+ flex-wrap: nowrap
429
+
430
+ .event-row-mobile
431
+ gap: $ba
432
+
433
+ .event-action, .event-action-mobile
434
+ .action-buttons
435
+ padding: 0
436
+ gap: $xs
437
+ .q-btn
438
+ text-transform: none
439
+ padding: $xs $ba $xs $ba !important
440
+
441
+ .event-logo-mobile
442
+ background-color: $neutral-2
443
+ border-radius: $xxs !important
444
+
445
+ .event-card
446
+ .q-chip
447
+ margin-left: $xxs !important
448
+ .q-chip__content
449
+ gap: $xxs
450
+ padding: $xxs
451
+
452
+ .event-text-col-wrapper
453
+ flex: 1
454
+ min-width: 0
455
+ overflow: hidden
456
+
457
+ .event-name
458
+ max-width: 100%
459
+
460
+ .event-team-users-count
461
+ .iconLeft
462
+ padding: 0 $xxs 0 0 !important
463
+ </style>