@dcrackel/meyersquaredui 1.0.61 → 1.0.63

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@dcrackel/meyersquaredui",
3
3
  "private": false,
4
- "version": "1.0.61",
4
+ "version": "1.0.63",
5
5
  "type": "module",
6
6
  "main": "dist/meyersquaredui.cjs.js",
7
7
  "module": "dist/meyersquaredui.esm.js",
@@ -5,6 +5,7 @@ const mockGetClubById =
5
5
  "Name": "Acme Fencing Club",
6
6
  "ShortName": "ACME",
7
7
  "Description": "<b>ACME Fencing Club</b> is the premier destination for historical European martial arts (HEMA), offering specialized classes in longsword, rapier, and saber. With a focus on both traditional techniques and modern applications, ACME provides top-tier instruction from some of the best HEMA instructors in the field.\n<br><br>\nClasses are available three nights a week, tailored to specific weapon disciplines:\n<br>\n<b>Monday</b>: Saber<br>\n<b>Wednesday</b>: Longsword<br>\n<b>Thursday</b>: Rapier<br><br>\nIn addition to formal classes, ACME hosts open sparring every Saturday, giving students a chance to apply their skills in a friendly, competitive environment. Whether you're new to HEMA or an experienced fencer, ACME Fencing Club offers a welcoming community and expert instruction to help you refine your craft.",
8
+ "TagLine": "The premier destination for HEMA",
8
9
  "AddressId": 1,
9
10
  "Color1": "navy",
10
11
  "Color2": "rose",
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div class="relative w-48" ref="dropdownContainer">
2
+ <div :class="`relative ${width}`" ref="dropdownContainer">
3
3
  <div @click="toggleDropdown" class="flex items-center cursor-pointer">
4
4
  <BaseText
5
5
  class="border-b-2 border-transparent hover:border-accent pb-1 duration-300 ease-in-out"
@@ -13,20 +13,40 @@
13
13
  <Icon icon="fa-chevron-down" size="sm" color="primary" class="ml-4" />
14
14
  </div>
15
15
 
16
- <!-- Dropdown Menu -->
17
- <div v-if="dropdownOpen" class="absolute top-full mt-1 w-48 bg-secondary border rounded-lg border-lineGrey shadow-xl z-20">
16
+ <!-- Dropdown Menu for PC -->
17
+ <div v-if="dropdownOpen" class="absolute top-full mt-1 w-full bg-secondary border rounded-lg border-lineGrey shadow-xl z-50 hidden md:block">
18
18
  <ul>
19
- <li v-for="item in items"
19
+ <li
20
+ v-for="item in items"
20
21
  :key="item"
21
22
  @click="selectWeapon(item)"
22
- class="px-4 py-2 cursor-pointer hover:bg-hoverColor">
23
+ class="px-4 py-2 cursor-pointer hover:bg-hoverColor"
24
+ >
23
25
  <BaseText color="primary" size="xs sm" tag="p" weight="bold">{{ item }}</BaseText>
24
26
  </li>
25
27
  </ul>
26
28
  </div>
29
+
30
+ <!-- Modal Dropdown for Mobile -->
31
+ <div v-if="dropdownOpen" class="fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50 md:hidden">
32
+ <!-- Dropdown content -->
33
+ <div class="bg-secondary border rounded-lg border-lineGrey shadow-xl z-50 w-3/4 max-w-lg p-6">
34
+ <ul>
35
+ <li
36
+ v-for="item in items"
37
+ :key="item"
38
+ @click="selectWeapon(item)"
39
+ class="px-4 py-2 cursor-pointer hover:bg-hoverColor"
40
+ >
41
+ <BaseText color="primary" size="xs sm" tag="p" weight="bold">{{ item }}</BaseText>
42
+ </li>
43
+ </ul>
44
+ </div>
45
+ </div>
27
46
  </div>
28
47
  </template>
29
48
 
49
+
30
50
  <script>
31
51
  import BaseText from '../../Atoms/BaseText/BaseText.vue';
32
52
  import Icon from '../../Atoms/Icon/Icon.vue';
@@ -46,6 +66,10 @@ export default {
46
66
  type: String,
47
67
  default: ''
48
68
  },
69
+ width: {
70
+ type: String,
71
+ default: 'w-48'
72
+ },
49
73
  boldText: {
50
74
  type: Boolean,
51
75
  default: false
@@ -66,15 +90,24 @@ export default {
66
90
  methods: {
67
91
  toggleDropdown() {
68
92
  this.dropdownOpen = !this.dropdownOpen;
93
+
94
+ // Check if we are on mobile (below md) and disable scroll only for mobile modal
95
+ if (window.innerWidth < 768 && this.dropdownOpen) {
96
+ document.body.style.overflow = 'hidden'; // Disable body scroll on mobile
97
+ } else {
98
+ document.body.style.overflow = ''; // Re-enable body scroll for larger screens
99
+ }
69
100
  },
70
101
  selectWeapon(weapon) {
71
102
  this.$emit('item-select', weapon);
72
103
  this.selectedItem = weapon;
73
104
  this.dropdownOpen = false;
105
+ document.body.style.overflow = ''; // Re-enable body scroll when modal is closed
74
106
  },
75
107
  handleClickOutside(event) {
76
108
  if (this.dropdownOpen && !this.$refs.dropdownContainer.contains(event.target)) {
77
109
  this.dropdownOpen = false;
110
+ document.body.style.overflow = ''; // Re-enable body scroll when clicking outside
78
111
  }
79
112
  }
80
113
  }
@@ -115,7 +115,7 @@
115
115
 
116
116
  <div class="w-full flex flex-col items-center ">
117
117
  <!-- Subscribe Section -->
118
- <div class="w-full max-w-xs flex flex-col items-center pt-8">
118
+ <div class="w-full max-w-xs flex flex-col items-center pt-8 px-6">
119
119
  <BaseText color="secondary" size="md" tag="p" weight="thin" class="pb-4 w-full">Subscribe for Updates</BaseText>
120
120
  <InputField placeholder="Email" type="email" class="w-full" />
121
121
  </div>
@@ -78,12 +78,12 @@ export default {
78
78
  emits: ['grid-click', 'grid-card-click'],
79
79
  computed: {
80
80
  topClasses() {
81
- let retClass = "max-w-[1200px] mx-auto overflow-x-auto";
81
+ let retClass = "max-w-[1200px] mx-auto overflow-x-auto mt-8";
82
82
  if (this.whiteStyle) retClass = `w-full md:mr-10 md:mt-10`;
83
83
  return retClass;
84
84
  },
85
85
  headerClasses() {
86
- let retClasses = "w-full flex py-4 md:pb-10 ml-2 md:ml-0";
86
+ let retClasses = "w-full flex py-4 md:pb-10 ml-2 md:ml-0 mb-4";
87
87
  if (!this.whiteStyle) retClasses = `${retClasses} justify-center`;
88
88
  return retClasses;
89
89
  },
@@ -1,38 +1,42 @@
1
1
  <template>
2
- <div class="flex items-center justify-center space-x-4 bg-white py-6">
3
- <!-- Search Bar -->
4
- <div class="flex items-center pb-1.5 mr-10">
5
- <BaseText class="mr-2" color="primary" size="xs md" tag="p" weight="bold">
6
- Search:
7
- </BaseText>
8
- <InputField type="text" placeholder="By Name" color="secondary" v-model="searchQuery" class="px-2 py-1 focus:outline-none" />
9
- </div>
2
+ <div class="flex w-full items-center justify-between bg-white py-6 overflow-x-auto md:overflow-visible">
3
+ <!-- Spacer (Left) - Visible only on larger screens -->
4
+ <div class="hidden md:block w-[150px] flex-shrink-0"></div>
10
5
 
11
- <!-- Distance Dropdown -->
12
- <div class="flex items-center mr-10">
13
- <BaseText class="mr-2 pb-1.5" color="primary" size="xs md" tag="p" weight="bold">
14
- Within:
15
- </BaseText>
16
- <Dropdown :items="distances" :defaultSelectedItem="selectedDistance" @distance-select="selectDistance" />
17
- </div>
6
+ <!-- Center Section -->
7
+ <section class="flex w-full md:max-w-none md:flex-grow overflow-x-auto md:overflow-visible md:justify-around md:items-center">
8
+ <!-- Search Bar -->
9
+ <div class="flex items-center pb-1.5 mr-8 flex-shrink-0 md:flex-grow">
10
+ <BaseText class="w-20 mr-2" color="primary" size="xs md" tag="p" weight="bold">Search:</BaseText>
11
+ <InputField type="text" placeholder="By Name" color="secondary" v-model="searchQuery" class="px-2 py-1 focus:outline-none placeholder:text-sm lg:placeholder:text-sm w-full" />
12
+ </div>
18
13
 
19
- <!-- Weapon Dropdown -->
20
- <div class="flex items-center">
21
- <BaseText class="mr-2 pb-1.5" color="primary" size="xs md" tag="p" weight="bold">
22
- By Weapon:
23
- </BaseText>
24
- <Dropdown :items="weapons" :defaultSelectedItem="selectedWeapon" @weapon-select="selectWeapon" />
25
- </div>
14
+ <!-- Distance Dropdown -->
15
+ <div class="flex justify-center items-center flex-shrink-0 md:flex-grow">
16
+ <BaseText class="mr-2 pb-1.5" color="primary" size="xs md" tag="p" weight="bold">Within:</BaseText>
17
+ <Dropdown :items="distances" :defaultSelectedItem="selectedDistance" @distance-select="selectDistance" />
18
+ </div>
19
+
20
+ <!-- Weapon Dropdown -->
21
+ <div class="flex justify-end flex-shrink-0 md:flex-grow pt-2">
22
+ <BaseText class="mr-2 pb-1.5" color="primary" size="xs md" tag="p" weight="bold">By Weapon:</BaseText>
23
+ <Dropdown :items="weapons" width="w-32" :defaultSelectedItem="selectedWeapon" @weapon-select="selectWeapon" />
24
+ </div>
25
+ </section>
26
+
27
+ <!-- Spacer (Right) - Visible only on larger screens -->
28
+ <div class="hidden md:block w-[150px]"></div>
26
29
  </div>
27
30
  </template>
28
-
29
31
  <script>
30
32
  import BaseText from '../../../Atoms/BaseText/BaseText.vue';
31
33
  import Dropdown from '../../../Molecules/DropDowns/BasicDropDown.vue';
32
34
  import InputField from "../../../Atoms/InputField/InputField.vue";
35
+ import Icon from "../../../Atoms/Icon/Icon.vue";
33
36
  export default {
34
37
  name: 'ClubHeader',
35
38
  components: {
39
+ Icon,
36
40
  InputField,
37
41
  BaseText,
38
42
  Dropdown
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <section class="relative w-full h-3/4 flex justify-center bg-primary m-0" :style="backgroundStyle">
2
+ <section class="relative w-full h-3/4 flex justify-center bg-primary md:m-0 mt-6 " :style="backgroundStyle">
3
3
  <!-- Spacer (Left) -->
4
4
  <div class="hidden md:block w-[150px] bg-primary border-b border-lineGrey flex-shrink-0"></div>
5
5
 
@@ -23,16 +23,16 @@
23
23
  </section>
24
24
 
25
25
  <!-- Mobile Overlay -->
26
- <div v-if="isMobile" class="flex justify-center text-left w-full px-6 py-8">
26
+ <div v-if="isMobile" class="flex justify-center text-left w-full px-6 py-4">
27
27
  <div class="w-full">
28
- <BaseText color="secondary" tag="h1" size="xl" weight="bold" class="mb-2 w-48">{{ title }}</BaseText>
29
- <BaseText color="secondary" tag="p" size="xs" weight="normal" class="mb-6 w-48">{{ description }}</BaseText>
28
+ <BaseText color="secondary" tag="h1" size="md" weight="bold" class="mb-2 w-40 mt-16">{{ title }}</BaseText>
29
+ <BaseText color="secondary" tag="p" size="xs" weight="normal" class="mb-2 w-48">{{ description }}</BaseText>
30
30
  <BaseButton
31
31
  :label="buttonLabel"
32
32
  size="xs"
33
33
  color="secondary"
34
34
  border="gradient1"
35
- class="w-1/2 m-auto"
35
+ class="w-32 m-auto"
36
36
  @click="onClick"
37
37
  />
38
38
  </div>
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <section class="relative w-full flex justify-center bg-primary m-0 bg-top" :style="backgroundStyle">
2
+ <section class="hidden md:flex relative w-full justify-center bg-primary m-0 bg-top" :style="backgroundStyle">
3
3
  <!-- Left Spacer -->
4
4
  <div class="hidden md:block w-[150px] bg-primary border-b border-lineGrey flex-shrink-0"></div>
5
5
 
@@ -45,6 +45,16 @@
45
45
  <!-- Right Spacer -->
46
46
  <div class="hidden md:block w-[150px] bg-primary border-b border-lineGrey flex-shrink-0"></div>
47
47
  </section>
48
+ <section class="md:hidden w-full flex justify-center mt-10">
49
+ <div class="w-full md:w-2/3 flex-col justify-center pl-2">
50
+ <BaseText color="primary" tag="h1" size="md" weight="bold" class="">{{ formattedDate }}</BaseText>
51
+ <BaseText color="primary" tag="h1" size="2xl" weight="bold" class="mb-1">{{ title }}</BaseText>
52
+ <div class="flex">
53
+ <BaseText color="primary" tag="p" size="xs" weight="normal" class="mr-2">Hosted by:</BaseText>
54
+ <BaseText color="primary" tag="p" size="xs" weight="bold">{{ hostingClubName }}</BaseText>
55
+ </div>
56
+ </div>
57
+ </section>
48
58
  </template>
49
59
 
50
60
  <script>
@@ -99,7 +109,6 @@ export default {
99
109
  },
100
110
  computed: {
101
111
  formattedDate() {
102
- // Format the date using plain JavaScript
103
112
  const date = new Date(this.tournamentStartDate);
104
113
  const options = {weekday: 'long', year: 'numeric', month: 'short', day: 'numeric'};
105
114
  return date.toLocaleDateString('en-US', options);
@@ -8,13 +8,13 @@
8
8
  <section class="hidden md:flex absolute inset-0 items-center justify-start px-8 pt-32">
9
9
  <div class="text-left text-white max-w-lg">
10
10
  <BaseText color="secondary" tag="h1" size="4xl" weight="bold" class="mb-4">{{ title }}</BaseText>
11
- <BaseText color="secondary" tag="p" size="xl" weight="normal" class="mb-6" v-html="description"></BaseText>
11
+ <BaseText color="secondary" tag="p" size="xl" weight="normal" class="mb-8" v-html="description"></BaseText>
12
12
  </div>
13
13
  </section>
14
14
  <div v-if="isMobile" class="flex justify-center text-left w-full px-4 mt-32">
15
15
  <div class="w-full mb-4">
16
- <BaseText color="secondary" tag="h1" size="lg" weight="bold" class="mb-0 w-1/2">{{ title }}</BaseText>
17
- <BaseText color="secondary" tag="p" size="xs" weight="normal" class="w-8/12">{{ description }}</BaseText>
16
+ <BaseText color="secondary" tag="h1" size="xl" weight="bold" class="mb-0 w-1/2">{{ title }}</BaseText>
17
+ <BaseText color="secondary" tag="p" size="xs" weight="normal" class="w-6/12 mt-1 mb-1">{{ description }}</BaseText>
18
18
  </div>
19
19
  </div>
20
20
  </div>
@@ -36,6 +36,11 @@ export default {
36
36
  type: String,
37
37
  required: true
38
38
  },
39
+ mobileImageSrc: {
40
+ type: String,
41
+ required: false,
42
+ default: 'https://meyersquared.com/images/banners/leaderboardm.png'
43
+ },
39
44
  title: {
40
45
  type: String,
41
46
  required: true,
@@ -54,8 +59,9 @@ export default {
54
59
  },
55
60
  computed: {
56
61
  backgroundStyle() {
62
+ const background = this.isMobile ? `url(${this.mobileImageSrc})` : `url(${this.imageSrc})`;
57
63
  return {
58
- backgroundImage: `url(${this.imageSrc})`,
64
+ backgroundImage: background,
59
65
  backgroundSize: 'cover',
60
66
  backgroundPosition: 'top',
61
67
  backgroundRepeat: 'no-repeat',
@@ -13,7 +13,7 @@
13
13
  <div class="relative w-full border-b border-l border-r border-lineGrey">
14
14
  <section class="hidden md:flex h-80 justify-between items-center p-14">
15
15
  <div class="text-left text-white max-w-lg w-96">
16
- <BaseText color="secondary" tag="h1" size="5xl" weight="semibold" class="mb-4">{{ title }}</BaseText>
16
+ <BaseText color="secondary" tag="h1" size="5xl" weight="normal" class="mb-4">{{ title }}</BaseText>
17
17
  </div>
18
18
  <div class="flex flex-col w-1/3 align-right">
19
19
  <BaseButton
@@ -62,7 +62,7 @@
62
62
  <!-- Mobile Overlay -->
63
63
  <section class="flex justify-center md:hidden text-left bg-primary w-full">
64
64
  <div class="w-full px-6 py-8 text-center flex flex-col justify-center items-center">
65
- <BaseText color="secondary" tag="h1" size="2xl" weight="bold" class="mb-2">{{ title }}</BaseText>
65
+ <BaseText color="secondary" tag="h1" size="2xl" weight="normal" class="mb-2">{{ title }}</BaseText>
66
66
  <BaseText color="secondary" tag="p" size="sm" weight="normal" class="mb-6">{{ description }}</BaseText>
67
67
  <BaseButton
68
68
  :label="buttonLabelOne"
@@ -1,7 +1,36 @@
1
1
  <template>
2
- <section class="relative bg-cover bg-top h-80 max-w-[1200px] mx-auto rounded-lg overflow-hidden mb-10" :style="{ backgroundImage: 'url(' + imageUrl + ')' }">
3
- <div class="flex flex-col justify-center items-center md:items-start h-full w-full text-center md:text-left px-6 md:px-20">
4
- <BaseText color="secondary" tag="h3" size="5xl" weight="normal" class="mb-8" v-html="description" />
2
+ <section
3
+ class="relative h-80 max-w-[1200px] mx-auto rounded-lg overflow-hidden mb-10 bg-primary"
4
+ >
5
+ <!-- Background Image for Non-Mobile -->
6
+ <div
7
+ class="hidden md:block bg-cover bg-top h-full w-full"
8
+ :style="{ backgroundImage: 'url(' + imageUrl + ')' }"
9
+ ></div>
10
+
11
+ <!-- Solid Black Background for Mobile -->
12
+ <div
13
+ class="block md:hidden bg-black h-full w-full"
14
+ ></div>
15
+
16
+ <!-- Content -->
17
+ <div class="absolute inset-0 flex flex-col justify-center items-center md:items-start text-center md:text-left px-6 md:px-20">
18
+ <BaseText
19
+ color="secondary"
20
+ tag="h3"
21
+ size="5xl"
22
+ weight="normal"
23
+ class="hidden md:block mb-8"
24
+ v-html="description"
25
+ />
26
+ <BaseText
27
+ color="secondary"
28
+ tag="h3"
29
+ size="3xl"
30
+ weight="normal"
31
+ class="md:hidden mb-8"
32
+ v-html="description"
33
+ />
5
34
  <BaseButton
6
35
  :label="buttonLabel"
7
36
  size="xs"
@@ -1,12 +1,12 @@
1
1
  <template>
2
2
  <div class="m-0 w-full bg-secondary">
3
3
  <Header />
4
- <TournamentBanner :title="title" :description="description" :imageSrc="imageSrc" />
4
+ <TournamentBanner :title="ClubTitle" :description="ClubTagLine" :imageSrc="ClubHeaderImage" :mobileImageSrc="ClubHeaderImage" />
5
5
 
6
- <div class="w-full flex justify-center">
7
- <div class="flex flex-col md:flex-row w-full max-w-7xl mt-16 mb-20">
6
+ <div class="flex justify-center pl-4 md:pl-0">
7
+ <div class="flex flex-col md:flex-row justify-center md:w-3/4 mt-16 mb-20">
8
8
 
9
- <section class="w-full md:w-2/3 pr-8">
9
+ <section class="w-full md:w-2/3 pr-4 md:pr-8">
10
10
  <div class="mb-16">
11
11
  <BaseText size="xl" color="primary" weight="bold" class="mb-10">{{ club.Name }}</BaseText>
12
12
  <BaseText size="md" color="primary" weight="normal" v-html="club.Description"></BaseText>
@@ -14,7 +14,6 @@
14
14
 
15
15
  <div class="w-full mb-16">
16
16
  <BaseText size="xl" color="primary" weight="bold" class="mb-10">Location</BaseText>
17
- adsfs{{club.Address.Coordinates}}
18
17
  <Mapbox
19
18
  :apiKey="apiKey"
20
19
  :coordinates="{ lat: 50.7128, lng: -94.006 }"
@@ -48,8 +47,7 @@
48
47
  />
49
48
  </div>
50
49
  </section>
51
-
52
- <section class="w-full md:w-1/3 mt-8 md:mt-0 flex flex-col justify-start">
50
+ <section class="w-full pr-4 md:w-1/3 md:mt-8 flex flex-col justify-start">
53
51
  <SocialMediaLinkCard :socialMedia="club.SocialMedia"/>
54
52
  </section>
55
53
  </div>
@@ -115,8 +113,16 @@ export default {
115
113
  },
116
114
  ClubListCard() {
117
115
  return ClubListCard
116
+ },
117
+ ClubHeaderImage() {
118
+ return this.club.Images && this.club.Images[0] ? this.club.Images[0].URL : this.imageSrc
119
+ },
120
+ ClubTitle() {
121
+ return this.club.Name ? this.club.Name : this.title
122
+ },
123
+ ClubTagLine() {
124
+ return this.club.TagLine ? this.club.TagLine : this.description
118
125
  }
119
-
120
126
  },
121
127
  data() {
122
128
  return {
@@ -24,8 +24,9 @@ const Template = (args) => ({
24
24
  export const Default = Template.bind({});
25
25
  Default.args = {
26
26
  title: 'Local Clubs',
27
- description: 'Explore clubs near you<br> and join the community!',
28
- imageSrc: 'https://meyersquared.com/images/banners/largebanner03.jpg',
27
+ description: 'Explore clubs near you and join the community!',
28
+ imageSrc: 'https://meyersquared.com/images/banners/clubmembers.png',
29
+ mobileImageSrc: 'https://meyersquared.com/images/banners/clubmembersm.png',
29
30
  clubs: mockAllClubs,
30
31
  clubsIsLoading: false,
31
32
  };
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <div class="m-0 w-full bg-secondary">
3
3
  <Header />
4
- <TournamentBanner :title="title" :description="description" :imageSrc="imageSrc" />
4
+ <TournamentBanner :title="title" :description="description" :imageSrc="imageSrc" :mobileImageSrc="mobileImageSrc" />
5
5
  <ClubHeader />
6
6
 
7
7
  <div class="w-full flex justify-center">
@@ -61,6 +61,10 @@ export default {
61
61
  type: String,
62
62
  default: 'https://meyersquared.com/images/Banner2.png'
63
63
  },
64
+ mobileImageSrc: {
65
+ type: String,
66
+ default: 'https://meyersquared.com/images/Banner2.png'
67
+ },
64
68
  clubs: {
65
69
  type: Array,
66
70
  default: () => []
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <div class="m-0 w-full bg-secondary">
3
3
  <Header @search="onSearch"/>
4
- <TournamentBanner :title="title" :description="description" :imageSrc="imageSrc" />
4
+ <TournamentBanner :title="title" :description="description" :imageSrc="imageSrc" isMo />
5
5
  <LeaderboardHeader :weapons="['Longsword', 'Rapier', 'Saber', 'Sword & Buckler', 'Dagger']" @weaponSelected="changeLeaderBoarder"/>
6
6
 
7
7
  <div class="w-full flex justify-center">