diff --git a/client/src/components/AppCredits.vue b/client/src/components/AppCredits.vue
new file mode 100644
index 0000000..f7b0c06
--- /dev/null
+++ b/client/src/components/AppCredits.vue
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+ Hecho por Nucleo Inteligencia
+ •
+ 2025
+ •
+ firstcontact@nucleoriofrio.com
+ •
+ Proyecto abierto, sin fines de lucro
+ •
+ ⓘ
+
+
+
+
+ ⓘ
+
+
+
+
+
+
+
+
diff --git a/client/src/router/index.ts b/client/src/router/index.ts
index 34e5614..75569fc 100644
--- a/client/src/router/index.ts
+++ b/client/src/router/index.ts
@@ -5,6 +5,7 @@ import Dashboard from '../views/Dashboard.vue';
import DemoGame from '../views/DemoGame.vue';
import UuidSelector from '../views/UuidSelector.vue';
import Leaderboard from '../views/Leaderboard.vue';
+import Credits from '../views/Credits.vue';
const router = createRouter({
history: createWebHistory(),
@@ -34,6 +35,11 @@ const router = createRouter({
name: 'Leaderboard',
component: Leaderboard
},
+ {
+ path: '/credits',
+ name: 'Credits',
+ component: Credits
+ },
{
path: '/',
name: 'UuidSelector',
diff --git a/client/src/views/Credits.vue b/client/src/views/Credits.vue
new file mode 100644
index 0000000..1d36815
--- /dev/null
+++ b/client/src/views/Credits.vue
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+ SnatchGame es un proyecto abierto y de uso público, sin fines de lucro.
+
+
+
+
+ Gracias por jugar y contribuir a la comunidad. Si querés colaborar, difundir o proponer mejoras, ¡escribinos!
+
+
+
+
+
+
+
+
+
+
diff --git a/client/src/views/Dashboard.vue b/client/src/views/Dashboard.vue
index e342278..e55d19d 100644
--- a/client/src/views/Dashboard.vue
+++ b/client/src/views/Dashboard.vue
@@ -231,6 +231,7 @@
@view-details="viewRoomDetails"
@kick-player="kickPlayer"
/>
+
@@ -238,6 +239,7 @@
import { ref, onMounted, onUnmounted, computed } from 'vue';
import { useRouter } from 'vue-router';
import { colyseusService } from '../services/colyseus';
+import AppCredits from '../components/AppCredits.vue';
import RoomCard from '../components/RoomCard.vue';
import RoomsTable from '../components/RoomsTable.vue';
import RoomModal from '../components/RoomModal.vue';
diff --git a/client/src/views/DemoGame.vue b/client/src/views/DemoGame.vue
index 8be6eb7..22c2d06 100644
--- a/client/src/views/DemoGame.vue
+++ b/client/src/views/DemoGame.vue
@@ -72,8 +72,10 @@
+
+
@@ -90,6 +92,7 @@ import { ref, onMounted, computed } from 'vue';
import { useRouter, useRoute } from 'vue-router';
import { colyseusService } from '../services/colyseus';
import { getStateCallbacks } from 'colyseus.js';
+import AppCredits from '../components/AppCredits.vue';
import G1 from './games/G1.vue';
import G2 from './games/G2.vue';
diff --git a/client/src/views/Game.vue b/client/src/views/Game.vue
index d1536b2..96bef5b 100644
--- a/client/src/views/Game.vue
+++ b/client/src/views/Game.vue
@@ -69,6 +69,7 @@
+
@@ -78,6 +79,7 @@ import { ref, onMounted, onUnmounted, computed } from 'vue';
import { useRouter, useRoute } from 'vue-router';
import { colyseusService } from '../services/colyseus';
import { getStateCallbacks } from 'colyseus.js';
+import AppCredits from '../components/AppCredits.vue';
const router = useRouter();
const route = useRoute();
diff --git a/client/src/views/Leaderboard.vue b/client/src/views/Leaderboard.vue
index a8b63b4..29aedfa 100644
--- a/client/src/views/Leaderboard.vue
+++ b/client/src/views/Leaderboard.vue
@@ -121,6 +121,7 @@
totalPlayers: totalPlayersCount
}"
/>
+
@@ -131,6 +132,7 @@ import EventChart from '../components/EventChart.vue';
import EventFilters from '../components/EventFilters.vue';
import DataSourceSelector from '../components/DataSourceSelector.vue';
import GameLogo from '../components/GameLogo.vue';
+import AppCredits from '../components/AppCredits.vue';
import { useEventFilters } from '../composables/useEventFilters';
interface RoomInfo { roomId: string; metadata?: any; }
diff --git a/client/src/views/Lobby.vue b/client/src/views/Lobby.vue
index c87b9b0..bc22dfb 100644
--- a/client/src/views/Lobby.vue
+++ b/client/src/views/Lobby.vue
@@ -78,6 +78,8 @@
+
+
@@ -86,6 +88,7 @@
import { ref, onMounted, onUnmounted, computed, watch, nextTick } from 'vue';
import PlayerStats from './games/PlayerStats.vue';
import GameLogo from '../components/GameLogo.vue';
+import AppCredits from '../components/AppCredits.vue';
import { useRouter, useRoute } from 'vue-router';
import { colyseusService } from '../services/colyseus';
import { getStateCallbacks } from 'colyseus.js';
@@ -969,3 +972,6 @@ margin: 0 0 20px 0;
}
}
+
+
+
diff --git a/client/src/views/UuidSelector.vue b/client/src/views/UuidSelector.vue
index 89aa148..868c40c 100644
--- a/client/src/views/UuidSelector.vue
+++ b/client/src/views/UuidSelector.vue
@@ -87,7 +87,7 @@
-
+
+
+
+
@@ -926,6 +939,25 @@ async function copyToClipboard() {
.uuid-card { -webkit-tap-highlight-color: transparent; outline: none; }
.uuid-card:focus, .uuid-card:focus-visible { outline: none; }
+/* Credits */
+.credits { display:flex; justify-content:center; margin-top: 14px; }
+.credits-card {
+ background: rgba(255,255,255,0.22);
+ backdrop-filter: blur(6px);
+ -webkit-backdrop-filter: blur(6px);
+ border: 1px solid rgba(0,0,0,0.04);
+ border-radius: 10px;
+ padding: 8px 12px;
+ color: #64748b;
+ font-size: 12px;
+ line-height: 1.2;
+ text-align: center;
+}
+.credits-card .sep { opacity: 0.6; margin: 0 6px; }
+.credits-card strong { color: #475569; font-weight: 700; }
+.credits-link { color: #64748b; text-decoration: none; border-bottom: 1px dotted rgba(100,116,139,0.5); }
+.credits-link:hover { color: #475569; border-bottom-color: rgba(71,85,105,0.6); }
+
.uuids-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));