@mundogamernetwork/shared-ui 1.8.6 → 1.8.7

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.
@@ -172,7 +172,7 @@ const detailRoute = computed(() =>
172
172
  <svg xmlns="http://www.w3.org/2000/svg" width="12" height="13" viewBox="0 0 16 17" fill="none">
173
173
  <path d="M13.3333 4.1112L12.8666 3.64453L11.9333 4.57786L10.9333 3.64453L8.33329 4.1112L2.66663 9.77786L7.19996 14.3112L12.8666 8.64453L13.3333 6.04453L12.4 5.1112L13.3333 4.1112ZM12.6 6.24453L12.2666 8.3112L7.19996 13.3779L3.59996 9.77786L8.66663 4.7112L10.7333 4.3112L11.4666 5.04453L11 5.5112L10.5333 5.04453L9.99996 5.57786L11.4 6.97786L11.8666 6.5112L11.4 6.04453L11.8666 5.57786L12.6 6.24453Z" fill="#D297FF"/>
174
174
  </svg>
175
- {{ card.type }}
175
+ {{ typeof card.type === "string" ? card.type : card.type.name }}
176
176
  </span>
177
177
  </div>
178
178
  </div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mundogamernetwork/shared-ui",
3
- "version": "1.8.6",
3
+ "version": "1.8.7",
4
4
  "description": "Mundo Gamer Network - Shared UI Layer (Nuxt 3)",
5
5
  "type": "module",
6
6
  "main": "./nuxt.config.ts",
@@ -130,7 +130,9 @@
130
130
  <div
131
131
  class="keys-badge"
132
132
  v-if="card.available_count > 0 && card.user_can_access && !card.isExpired && !card.isUpcoming"
133
+ :title="$t('keys.campaigns.keys_left', { n: card.available_count })"
133
134
  >
135
+ <i class="fa-solid fa-key" />
134
136
  {{ card.available_count }}
135
137
  </div>
136
138
 
@@ -221,10 +223,6 @@
221
223
  +{{ card.platforms.length - 4 }}
222
224
  </span>
223
225
  </div>
224
- <div v-if="card.available_count > 0 && card.user_can_access && !card.isExpired && !card.isUpcoming" class="card-availability">
225
- {{ $t("keys.campaigns.keys_left", { n: card.available_count }) }}
226
- </div>
227
- <div v-if="card.gameName && card.gameName !== card.text" class="card-campaign-name">{{ card.text }}</div>
228
226
 
229
227
  <div class="buttons">
230
228
  <template v-if="!card.user_can_access">
@@ -1237,7 +1235,7 @@ onUnmounted(() => {
1237
1235
  }
1238
1236
 
1239
1237
  .text {
1240
- min-height: 210px;
1238
+ min-height: 170px;
1241
1239
 
1242
1240
  .card-name {
1243
1241
  font-size: 16px;
@@ -1254,18 +1252,6 @@ onUnmounted(() => {
1254
1252
  gap: 6px;
1255
1253
  }
1256
1254
 
1257
- .card-availability {
1258
- font-size: 12px;
1259
- color: var(--key-accent, var(--primary, #D297FF));
1260
- font-weight: 600;
1261
- }
1262
-
1263
- .card-campaign-name {
1264
- font-size: 13px;
1265
- font-weight: 400;
1266
- color: var(--secondary-info-fg);
1267
- }
1268
-
1269
1255
  .card-meta-row {
1270
1256
  display: flex;
1271
1257
  align-items: center;
@@ -98,6 +98,14 @@ const PLATFORM_LABEL: Record<string, string> = {
98
98
  linkedin: 'LinkedIn', bluesky: 'Bluesky',
99
99
  };
100
100
 
101
+ // Font Awesome brand icon per platform — no entry means no official FA glyph
102
+ // exists yet (e.g. Kick), the template falls back to the 2-letter label.
103
+ const PLATFORM_ICON: Record<string, string> = {
104
+ instagram: 'fa-instagram', tiktok: 'fa-tiktok', youtube: 'fa-youtube', twitch: 'fa-twitch',
105
+ x: 'fa-x-twitter', facebook: 'fa-facebook', discord: 'fa-discord', telegram: 'fa-telegram',
106
+ linkedin: 'fa-linkedin', bluesky: 'fa-bluesky',
107
+ };
108
+
101
109
  const socials = computed(() => {
102
110
  const s = streamer.value?.social_links || {};
103
111
  return Object.entries(s).filter(([, v]) => v).map(([k, v]) => ({ platform: k, url: v as string }));
@@ -110,6 +118,14 @@ const scheduleByDay = computed(() => {
110
118
  return [0, 1, 2, 3, 4, 5, 6].map((d) => ({ d, key: DOW[d], slot: map[d] || null }));
111
119
  });
112
120
 
121
+ // Sidebar "hire" CTA jumps to the rates tab — on mobile the tabs are further
122
+ // down the stacked layout, so switching activeTab alone can leave the change
123
+ // off-screen; scroll it into view too.
124
+ function goToRates() {
125
+ activeTab.value = 1;
126
+ document.getElementById('mk-tabs')?.scrollIntoView({ behavior: 'smooth', block: 'start' });
127
+ }
128
+
113
129
  // ── Tabs: template picks which one opens first, casting-details-style ──
114
130
  const TAB_KEYS = ['profile', 'rates', 'performance'] as const;
115
131
  const TEMPLATE_DEFAULT_TAB: Record<string, number> = {
@@ -284,7 +300,8 @@ function onDownload() {
284
300
  </div>
285
301
 
286
302
  <div class="mk-actions no-print">
287
- <a class="kit-btn kit-btn-primary" @click="onDownload">{{ $t('kit.media.download_pdf') }}</a>
303
+ <a v-if="!isOwnKit" class="kit-btn kit-btn-primary" @click="goToRates">{{ $t('kit.media.hire') }}</a>
304
+ <a class="kit-btn" :class="isOwnKit ? 'kit-btn-primary' : 'kit-btn-ghost'" @click="onDownload">{{ $t('kit.media.download_pdf') }}</a>
288
305
  <a v-if="streamer.contact_email" class="kit-btn kit-btn-ghost" :href="`mailto:${streamer.contact_email}`" @click="track('contact')">{{ $t('kit.media.contact') }}</a>
289
306
  </div>
290
307
 
@@ -314,16 +331,17 @@ function onDownload() {
314
331
 
315
332
  <div v-if="socials.length" class="mk-socials no-print">
316
333
  <a v-for="s in socials" :key="s.platform" class="mk-soc" :href="s.url" target="_blank" rel="noopener" :title="PLATFORM_LABEL[s.platform] || s.platform" @click="track('click')">
317
- {{ (PLATFORM_LABEL[s.platform] || s.platform).slice(0, 2).toUpperCase() }}
334
+ <i v-if="PLATFORM_ICON[s.platform]" class="fa-brands" :class="PLATFORM_ICON[s.platform]" />
335
+ <span v-else class="mk-soc-fallback">{{ (PLATFORM_LABEL[s.platform] || s.platform).slice(0, 2).toUpperCase() }}</span>
318
336
  </a>
319
337
  </div>
320
338
  </aside>
321
339
 
322
340
  <!-- ══════════════ MAIN: TABS ══════════════ -->
323
341
  <main class="mk-main">
324
- <div class="mk-tabs no-print">
342
+ <div id="mk-tabs" class="mk-tabs no-print">
325
343
  <button class="mk-tab" :class="{ active: activeTab === 0 }" @click="activeTab = 0">{{ $t('kit.media.tab_profile') }}</button>
326
- <button v-if="hasRatesTab" class="mk-tab" :class="{ active: activeTab === 1 }" @click="activeTab = 1">{{ $t('kit.media.tab_rates') }}</button>
344
+ <button class="mk-tab" :class="{ active: activeTab === 1 }" @click="activeTab = 1">{{ $t('kit.media.tab_rates') }}</button>
327
345
  <button v-if="hasPerformanceTab" class="mk-tab" :class="{ active: activeTab === 2 }" @click="activeTab = 2">{{ $t('kit.media.tab_performance') }}</button>
328
346
  </div>
329
347
 
@@ -452,8 +470,12 @@ function onDownload() {
452
470
  </div>
453
471
 
454
472
  <!-- ── TAB: RATE CARDS ── -->
455
- <div v-if="hasRatesTab" class="mk-tabpanel" :class="{ active: activeTab === 1 }" data-print-tab="rates">
456
- <div class="mk-rc-layout">
473
+ <div class="mk-tabpanel" :class="{ active: activeTab === 1 }" data-print-tab="rates">
474
+ <div v-if="!hasRatesTab" class="mk-rc-empty">
475
+ <p>{{ isOwnKit ? $t('kit.media.rates_empty_own') : $t('kit.media.rates_empty_viewer') }}</p>
476
+ <a v-if="!isOwnKit && streamer.contact_email" class="kit-btn kit-btn-primary" :href="`mailto:${streamer.contact_email}`" @click="track('contact')">{{ $t('kit.media.contact') }}</a>
477
+ </div>
478
+ <div v-else class="mk-rc-layout">
457
479
  <div class="mk-rc-main">
458
480
  <div v-if="bundles.length" class="mk-rc-group">
459
481
  <h2>{{ $t('kit.media.rates_bundles') }}</h2>
@@ -715,11 +737,12 @@ function onDownload() {
715
737
  display: flex; align-items: center; justify-content: center;
716
738
  border: 1px solid var(--kit-line);
717
739
  color: var(--kit-muted);
718
- font-size: 11px; font-weight: 700;
740
+ font-size: 15px;
719
741
  text-decoration: none;
720
742
 
721
743
  &:hover { border-color: var(--kit-accent); color: var(--kit-accent); }
722
744
  }
745
+ .mk-soc-fallback { font-size: 11px; font-weight: 700; }
723
746
 
724
747
  /* Buttons (shared) */
725
748
  .kit-btn {
@@ -909,6 +932,15 @@ function onDownload() {
909
932
  }
910
933
 
911
934
  /* Rate cards / builder */
935
+ .mk-rc-empty {
936
+ display: flex;
937
+ flex-direction: column;
938
+ align-items: center;
939
+ gap: 16px;
940
+ text-align: center;
941
+ padding: 60px 24px;
942
+ color: var(--kit-muted);
943
+ }
912
944
  .mk-rc-layout { display: grid; grid-template-columns: 1fr 260px; gap: 20px; align-items: start; }
913
945
  @media (max-width: 760px) { .mk-rc-layout { grid-template-columns: 1fr; } }
914
946
  .mk-rc-group { display: flex; flex-direction: column; gap: 1px; background: var(--kit-line); margin-bottom: 24px; }