@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,99 @@
1
+ <script setup>
2
+ import UExpansionStd from './UExpansionStd.vue'
3
+
4
+ const filterOptions = defineModel('filterOptions', {
5
+ default: () => [],
6
+ type: Array,
7
+ })
8
+ const props = defineProps({
9
+ collapsedAriaLabel: {
10
+ type: String,
11
+ default: '',
12
+ },
13
+ expandAriaLabel: {
14
+ type: String,
15
+ default: '',
16
+ },
17
+ dataTestId: {
18
+ type: String,
19
+ default: 'u-expansion-filter',
20
+ },
21
+ header: {
22
+ type: String,
23
+ default: null,
24
+ },
25
+ subHeader: {
26
+ type: Boolean,
27
+ default: true,
28
+ },
29
+ })
30
+ </script>
31
+
32
+ <template>
33
+ <div
34
+ v-if="filterOptions.length"
35
+ class="u-expansion-filter q-pa-sm"
36
+ :dataTestId="dataTestId"
37
+ >
38
+ <div v-if="header" class="text-heading-sm text-dark q-pb-xs q-mb-xxs">
39
+ {{ header }}
40
+ </div>
41
+ <div
42
+ v-if="subHeader"
43
+ class="q-mb-xxs"
44
+ dataTestId="expansion-filter-sub-header"
45
+ >
46
+ <slot name="subHeader" />
47
+ </div>
48
+ <template v-for="filter in filterOptions" :key="filter.type">
49
+ <q-list v-if="filter.label" bordered>
50
+ <UExpansionStd
51
+ v-model="filter.isExpanded"
52
+ class="expansion-filter-item-wrapper"
53
+ :collapsed-aria-label="filter.collapsedAriaLabel"
54
+ :disabled="filter.disabled"
55
+ :expand-aria-label="filter.expandAriaLabel"
56
+ expansion-icon="fa-kit fa-chevron-right rotate-0"
57
+ :id="`filter-expansion-item-${filter.type}`"
58
+ :label="filter.label"
59
+ :toggle-icon-left="true"
60
+ toggle-icon-rotation-class="rotate-90"
61
+ >
62
+ <template #body>
63
+ <div class="expansion-filter-body-wrapper">
64
+ <slot :name="`type${filter.type}`" />
65
+ </div>
66
+ </template>
67
+ </UExpansionStd>
68
+ </q-list>
69
+ </template>
70
+ </div>
71
+ </template>
72
+
73
+ <style lang="sass">
74
+ .u-expansion-filter
75
+ .q-list
76
+ margin-bottom: $xxs
77
+
78
+ border: 1px solid $neutral-4
79
+ border-radius: $sm
80
+ .q-list
81
+ border: none
82
+
83
+ .q-item.q-item-type
84
+ padding: $xs $xxs !important
85
+ display: flex
86
+ justify-content: start
87
+ align-items: center
88
+ min-height: $lg
89
+
90
+ .expansion-transition-icon
91
+ transition: all 0.2s ease-in-out 0.1s
92
+
93
+ .expansion-filter-item-wrapper
94
+ border: none !important
95
+ min-height: auto !important
96
+
97
+ .expansion-filter-body-wrapper
98
+ padding: $xs
99
+ </style>
@@ -0,0 +1,478 @@
1
+ <script setup>
2
+ import { ref } from 'vue'
3
+ import UAvatar from './UAvatar.vue'
4
+ import UBtnStd from './UBtnStd.vue'
5
+ import { useScreenType } from '../../composables/useScreenType'
6
+ import VsImg from '../../assets/VS.svg'
7
+
8
+ const body = defineModel('body', {
9
+ type: Object,
10
+ default: () => ({
11
+ team1: {
12
+ avatar: { type: 'initials', value: '', name: '' },
13
+ teamName: 'Team Name',
14
+ record: 'In-Class Record (10-6-1)',
15
+ link: {
16
+ url: '',
17
+ color: 'neutral',
18
+ ariaLabel: '',
19
+ onClick: () => {},
20
+ },
21
+ score: '',
22
+ },
23
+ team2: {
24
+ avatar: { type: 'initials', value: '', name: '' },
25
+ teamName: 'Team Name',
26
+ record: 'In-Class Record (10-6-1)',
27
+ link: {
28
+ url: '',
29
+ color: 'neutral',
30
+ ariaLabel: '',
31
+ onClick: () => {},
32
+ },
33
+ score: '',
34
+ },
35
+ viewMatchup: {
36
+ color: 'primary',
37
+ size: 'sm',
38
+ label: 'View Matchup',
39
+ onClick: () => {},
40
+ },
41
+ }),
42
+ })
43
+
44
+ const direction = defineModel('direction', {
45
+ default: 'horizontal',
46
+ type: String,
47
+ })
48
+
49
+ const gameState = defineModel('gameState', {
50
+ default: 'notStarted',
51
+ type: String,
52
+ })
53
+
54
+ const header = defineModel('header', {
55
+ type: Object,
56
+ default: () => ({
57
+ primary: {
58
+ iconClass: '',
59
+ iconColor: '',
60
+ text: '',
61
+ customClass: '',
62
+ },
63
+ secondary: {
64
+ iconClass: '',
65
+ iconColor: '',
66
+ text: '',
67
+ badge: '',
68
+ alignBadge: '',
69
+ customClass: '',
70
+ },
71
+ }),
72
+ })
73
+
74
+ const props = defineProps({
75
+ dataTestId: {
76
+ type: String,
77
+ default: 'game-object-card',
78
+ },
79
+ fieldLocation: {
80
+ type: String,
81
+ default: '',
82
+ },
83
+ })
84
+
85
+ const $screen = useScreenType()
86
+
87
+ const vsLogo = ref('/icons/VS.svg')
88
+ // const versesLogo = ref("/icons/verses.svg"); TODO: Will uncomment when Figma design for completed state is completed
89
+
90
+ const getChipCustomClass = (badge) => {
91
+ const isNotStarted = gameState.value === 'notStarted' ? true : false
92
+ if (badge === 'REPLAY') {
93
+ return 'replay-watch-chip'
94
+ }
95
+
96
+ if (badge === 'WATCH LIVE') {
97
+ return isNotStarted ? 'completed-replay-watch-chip' : 'replay-watch-chip'
98
+ }
99
+
100
+ return 'replay-watch-chip'
101
+ }
102
+
103
+ function isEmpty(obj) {
104
+ const emptyRegex = /^\s*$/
105
+ return Object.values(obj).every((value) => {
106
+ return (
107
+ value == null || (typeof value === 'string' && emptyRegex.test(value))
108
+ )
109
+ })
110
+ }
111
+ </script>
112
+
113
+ <template>
114
+ <q-card
115
+ v-bind="$attrs"
116
+ :class="[
117
+ 'u-game-object-std ',
118
+ $screen.isMobile || direction === 'vertical'
119
+ ? 'vertical-view'
120
+ : 'full-width',
121
+ ]"
122
+ :dataTestId="dataTestId"
123
+ >
124
+ <!-- Header -->
125
+ <q-card-section
126
+ :class="[
127
+ 'row',
128
+ !$screen.isMobile && direction === 'horizontal' ? 'nowrap' : 'wrap',
129
+ 'u-game-object-std-header justify-between q-mb-xxs',
130
+ ]"
131
+ >
132
+ <!-- two section -->
133
+
134
+ <!-- Header primary section -->
135
+ <div class="header-primary-section flex items-center no-wrap">
136
+ <q-icon
137
+ v-if="header.primary.iconClass"
138
+ :class="['q-mr-xs icon-secondary-opacity', header.primary.iconClass]"
139
+ :iconColor="header.primary.iconColor"
140
+ size="1rem"
141
+ />
142
+ <span class="text-caption-md title-text">{{
143
+ header.primary.text
144
+ }}</span>
145
+ </div>
146
+
147
+ <!-- Header secondary section -->
148
+ <div
149
+ v-if="!isEmpty(header.secondary)"
150
+ class="header-secondary-section flex items-center"
151
+ :style="{
152
+ width:
153
+ !$screen.isMobile && direction === 'horizontal'
154
+ ? 'auto'
155
+ : !header.secondary.badge && !header.secondary.iconClass
156
+ ? 'auto'
157
+ : '100%',
158
+ justifyContent:
159
+ !$screen.isMobile && direction === 'horizontal'
160
+ ? 'unset'
161
+ : 'space-between',
162
+ }"
163
+ >
164
+ <!-- Left Badge -->
165
+ <template
166
+ v-if="
167
+ header.secondary.badge &&
168
+ header.secondary.alignBadge === 'left' &&
169
+ (!$screen.isMobile || direction != 'vertical')
170
+ "
171
+ >
172
+ <q-chip
173
+ icon="circle"
174
+ :class="[
175
+ 'secondary-section-chip',
176
+ 'text-overline-xs',
177
+ !$screen.isMobile && direction === 'horizontal'
178
+ ? 'q-mr-xs'
179
+ : 'hidden',
180
+ getChipCustomClass(header.secondary.badge),
181
+ ]"
182
+ >
183
+ {{ header.secondary.badge }}</q-chip
184
+ >
185
+ </template>
186
+ <!-- Left Badge -->
187
+
188
+ <div class="secondary-sub-section flex items-center">
189
+ <q-icon
190
+ v-if="header.secondary.iconClass"
191
+ :class="[
192
+ 'q-mr-xs icon-secondary-opacity',
193
+ header.secondary.iconClass,
194
+ ]"
195
+ :iconColor="header.secondary.iconColor"
196
+ size="1rem"
197
+ />
198
+ <span class="text-caption-md title-text">{{
199
+ header.secondary.text
200
+ }}</span>
201
+ </div>
202
+
203
+ <!-- Right Badge -->
204
+ <template
205
+ v-if="
206
+ header.secondary.badge &&
207
+ (header.secondary.alignBadge === 'right' ||
208
+ (header.secondary.alignBadge === 'left' &&
209
+ ($screen.isMobile || direction === 'vertical')))
210
+ "
211
+ >
212
+ <q-chip
213
+ :class="[
214
+ 'secondary-section-chip',
215
+ 'text-overline-xs',
216
+ getChipCustomClass(header.secondary.badge),
217
+ ]"
218
+ icon="circle"
219
+ >
220
+ {{ header.secondary.badge }}</q-chip
221
+ >
222
+ </template>
223
+ <!-- Right Badge -->
224
+ </div>
225
+ </q-card-section>
226
+ <!-- Header -->
227
+
228
+ <!-- Body -->
229
+ <q-card-section class="u-game-object-std-body">
230
+ <div class="team-stats-section row q-mb-ba">
231
+ <!-- Team 1 -->
232
+ <div class="flex justify-between items-center no-wrap">
233
+ <div class="team-stats">
234
+ <div
235
+ v-if="typeof body.team1.avatar === 'object'"
236
+ class="flex item-center justify-center"
237
+ >
238
+ <UAvatar
239
+ v-if="body.team1.avatar?.type === 'initials'"
240
+ :name="`${body.team1.avatar?.value}`"
241
+ :size="body.team1.avatar?.size"
242
+ />
243
+ <UAvatar
244
+ v-else-if="body.team1.avatar?.type === 'image'"
245
+ :image="`${body.team1.avatar?.value}`"
246
+ :name="body.team1.avatar?.name ?? body.team1.avatar?.value"
247
+ :size="body.team1.avatar?.size"
248
+ />
249
+ </div>
250
+ <div>
251
+ <div class="flex items-center no-wrap">
252
+ <span
253
+ class="text-caption-lg q-mr-xs"
254
+ :style="{ wordBreak: 'break-word' }"
255
+ >{{ body.team1.teamName }}
256
+ </span>
257
+ <q-icon
258
+ class="fa-kit-duotone fa-share cursor-pointer icon-secondary-opacity"
259
+ :aria-label="body.team1.link.ariaLabel"
260
+ :color="body.team1.link.color"
261
+ role="button"
262
+ size="1rem"
263
+ tabindex="0"
264
+ @click="body.team1.link.onClick"
265
+ />
266
+ </div>
267
+ <span class="text-body-xxs text-description">{{
268
+ body.team1.record
269
+ }}</span>
270
+ </div>
271
+ </div>
272
+
273
+ <div class="flex item-center justify-center full-height q-ml-xs">
274
+ <span class="text-caption-lg">
275
+ {{ body.team1.score }}
276
+ </span>
277
+ </div>
278
+ </div>
279
+ <!-- Team 1 -->
280
+
281
+ <div class="logo-section">
282
+ <q-img class="vs-logo" alt="vs logo" :src="VsImg" />
283
+ </div>
284
+
285
+ <!-- Team 2 -->
286
+ <div
287
+ class="flex justify-between items-center no-wrap"
288
+ :style="{
289
+ flexDirection:
290
+ !$screen.isMobile && direction === 'horizontal'
291
+ ? 'unset'
292
+ : 'row-reverse',
293
+ }"
294
+ >
295
+ <div class="flex item-center justify-center full-height">
296
+ <span
297
+ class="text-caption-lg"
298
+ :style="{
299
+ marginLeft:
300
+ !$screen.isMobile && direction === 'horizontal'
301
+ ? '0'
302
+ : '0.5rem',
303
+ }"
304
+ >
305
+ {{ body.team2.score }}
306
+ </span>
307
+ </div>
308
+ <div class="team-stats2">
309
+ <div
310
+ v-if="typeof body.team2.avatar === 'object'"
311
+ class="flex item-center justify-center"
312
+ :style="{
313
+ marginLeft:
314
+ !$screen.isMobile && direction === 'horizontal'
315
+ ? '0.5rem'
316
+ : '',
317
+ }"
318
+ >
319
+ <UAvatar
320
+ v-if="body.team2.avatar?.type === 'initials'"
321
+ :name="`${body.team2.avatar?.value}`"
322
+ :size="body.team2.avatar?.size"
323
+ />
324
+ <UAvatar
325
+ v-else-if="body.team2.avatar?.type === 'image'"
326
+ :image="`${body.team2.avatar?.value}`"
327
+ :name="body.team2.avatar?.name ?? body.team2.avatar?.value"
328
+ :size="body.team2.avatar?.size"
329
+ />
330
+ </div>
331
+ <div>
332
+ <div class="flex items-center no-wrap">
333
+ <span
334
+ class="text-caption-lg q-mr-xs"
335
+ :style="{ wordBreak: 'break-word' }"
336
+ >{{ body.team2.teamName }}
337
+ </span>
338
+ <q-icon
339
+ class="fa-kit-duotone fa-share cursor-pointer icon-secondary-opacity"
340
+ :aria-label="body.team2.link.ariaLabel"
341
+ :color="body.team2.link.color"
342
+ role="button"
343
+ size="1rem"
344
+ tabindex="0"
345
+ @click="body.team2.link.onClick"
346
+ />
347
+ </div>
348
+ <span class="text-body-xxs text-description">{{
349
+ body.team2.record
350
+ }}</span>
351
+ </div>
352
+ </div>
353
+ </div>
354
+ <!-- Team 2 -->
355
+ </div>
356
+
357
+ <!-- action -->
358
+ <div class="row flex items-center justify-between">
359
+ <div
360
+ v-if="fieldLocation"
361
+ :class="{
362
+ 'q-mb-ba': $screen.isMobile || direction !== 'horizontal',
363
+ 'field-location-desktop':
364
+ !$screen.isMobile && direction === 'horizontal',
365
+ }"
366
+ class="flex items-center field-location no-wrap"
367
+ >
368
+ <q-icon
369
+ class="fa-kit-duotone fa-field-location q-mr-xxs icon-secondary-opacity"
370
+ size="ba"
371
+ />
372
+ <span class="text-body-sm">{{ fieldLocation }}</span>
373
+ </div>
374
+
375
+ <UBtnStd
376
+ :class="[
377
+ !$screen.isMobile && direction === 'horizontal' ? '' : 'full-width',
378
+ ]"
379
+ :color="body.viewMatchup.color"
380
+ :label="body.viewMatchup.label"
381
+ :outline="true"
382
+ :size="body.viewMatchup.size"
383
+ @on-click="body.viewMatchup.onClick"
384
+ />
385
+ </div>
386
+ </q-card-section>
387
+ <!-- Body -->
388
+ </q-card>
389
+ </template>
390
+ <style lang="sass">
391
+ .u-game-object-std
392
+ border-radius: $xs
393
+ box-shadow: none
394
+ background: $neutral-3
395
+ padding: $xxs
396
+
397
+ .u-game-object-std-header
398
+ padding: $xxs $xs
399
+ background: inherit
400
+ min-height: $lg
401
+ align-items: center
402
+
403
+ .title-text
404
+ word-break: break-word
405
+ overflow-wrap: break-word
406
+
407
+ .u-game-object-std-body
408
+ padding: $sm
409
+ background: white
410
+ border-radius: $xxs !important
411
+
412
+ .secondary-section-chip
413
+ border: none !important
414
+ margin: 0 0.5rem 0px 0px !important
415
+ padding: $xxs
416
+ .q-icon
417
+ font-size: $xs
418
+ margin-right: $xxs
419
+
420
+ .replay-watch-chip
421
+ background-color: #FCEDEE
422
+ .q-icon
423
+ color: #CE2129 !important
424
+ .q-chip__content
425
+ color: #CE2129
426
+
427
+ .completed-replay-watch-chip
428
+ background-color: $pink-1
429
+ .q-icon
430
+ color: $pink-7
431
+ .q-chip__content
432
+ color: $pink-7
433
+
434
+ .field-location-desktop
435
+ max-width: 65%
436
+ overflow: hidden
437
+
438
+ .u-game-object-std-body
439
+ .team-stats-section
440
+ display: grid
441
+ grid-template-columns: 1fr auto 1fr
442
+
443
+ .team-stats
444
+ width: 100%
445
+ display: flex
446
+ align-items: center
447
+ gap: $xs
448
+
449
+ .team-stats2
450
+ display: flex
451
+ align-items: center
452
+ gap: $xs
453
+
454
+ .logo-section
455
+ display: flex
456
+ align-items: center
457
+ justify-content: center
458
+ margin: 0 $ba
459
+ .vs-logo
460
+ width: 2.8rem
461
+ height: $md
462
+
463
+ .u-game-object-std.vertical-view
464
+ max-width: 100%
465
+
466
+ .u-game-object-std-header
467
+ gap: $xs
468
+
469
+ .u-game-object-std-body
470
+ .team-stats-section
471
+ display: flex !important
472
+ flex-direction: column !important
473
+ gap: $ba
474
+ .logo-section
475
+ align-items: start
476
+ justify-content: unset
477
+ margin: 0
478
+ </style>
@@ -0,0 +1,69 @@
1
+ <script setup>
2
+ defineProps({
3
+ dataTestId: {
4
+ type: String,
5
+ default: 'inner-loader',
6
+ },
7
+ image: {
8
+ type: String,
9
+ required: true,
10
+ },
11
+ imageHeight: {
12
+ type: String,
13
+ default: '24'
14
+ },
15
+ imageWidth: {
16
+ type: String,
17
+ default: '95'
18
+ },
19
+ loading: {
20
+ type: Boolean,
21
+ required: true,
22
+ },
23
+ loadingMessage: {
24
+ type: String,
25
+ required: true,
26
+ },
27
+ spinnerColor: {
28
+ type: String,
29
+ required: false,
30
+ },
31
+ spinnerSize: {
32
+ type: String,
33
+ requried: false,
34
+ default: '2rem',
35
+ },
36
+ })
37
+ </script>
38
+ <template>
39
+ <q-inner-loading
40
+ v-bind="$attrs"
41
+ color="primary"
42
+ :dataTestId="dataTestId"
43
+ :showing="loading"
44
+ >
45
+ <div class="column items-center q-gutter-y-sm">
46
+ <img
47
+ class="q-my-none"
48
+ alt="Loader Image"
49
+ :height="imageHeight"
50
+ :src="image"
51
+ :width="imageWidth"
52
+ />
53
+ <div class="row items-center">
54
+ <div v-if="loadingMessage" class="text-center">
55
+ <span class="message q-mr-sm">{{ loadingMessage }}</span>
56
+ <q-spinner-facebook :color="spinnerColor" :size="spinnerSize" />
57
+ </div>
58
+ </div>
59
+ </div>
60
+ </q-inner-loading>
61
+ </template>
62
+ <style scoped lang="sass">
63
+ .u-loader
64
+ position: relative
65
+ height: 100%
66
+ .message
67
+ color: $dark
68
+ font-weight: 500
69
+ </style>