alexrsworld 1.0.0 → 1.0.2

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 (45) hide show
  1. package/Apps/codeeditor.html +163 -0
  2. package/Games/WAflash/vex.html +1 -1
  3. package/Games/emulated/GBA/mariokartsupercircuit.html +30 -0
  4. package/Games/emulated/GBA/mother.html +30 -0
  5. package/Games/emulated/GBA/mother3.html +30 -0
  6. package/Games/emulated/GBA/pacmanworld.html +30 -0
  7. package/Games/emulated/GBA/sonicadvance.html +30 -0
  8. package/Games/emulated/GBA/sonicadvance2.html +30 -0
  9. package/Games/emulated/GBA/sonicadvance3.html +30 -0
  10. package/Games/emulated/GBA/superstarsaga.html +30 -0
  11. package/Games/emulated/N64/majorasmask.html +31 -0
  12. package/Games/emulated/N64/ocarinaoftime.html +31 -0
  13. package/Games/emulated/SNES/donkeykongcountry.html +31 -0
  14. package/Games/emulated/SNES/donkeykongcountry2.html +30 -0
  15. package/Games/emulated/SNES/donkeykongcountry3.html +31 -0
  16. package/Games/emulated/SNES/linktothepast.html +31 -0
  17. package/Games/ruffle/bcubed.html +40 -0
  18. package/Games/ruffle/hobo.html +41 -0
  19. package/Games/ruffle/maxdirtbike.html +40 -0
  20. package/Games/ruffle/raftwars2.html +40 -0
  21. package/Games/ruffle/useboxmen.html +40 -0
  22. package/Games/ruffle/whackyourboss.html +40 -0
  23. package/Games/ruffle/whackyourex.html +40 -0
  24. package/Games/singlefile.html +2322 -54
  25. package/Games/standalone/amongus.html +1 -0
  26. package/Games/standalone/bendy.html +141 -0
  27. package/Games/standalone/chess.html +204 -0
  28. package/Games/standalone/gdremastered.html +247 -0
  29. package/Games/standalone/highwayracer3D.html +50 -0
  30. package/Games/standalone/omnomrun.html +45 -0
  31. package/Games/standalone/retrobowlcollege.html +0 -65
  32. package/Games/standalone/slope2player.html +76 -0
  33. package/Games/standalone/soniccd.html +229 -0
  34. package/Games/standalone/station141.html +25 -8
  35. package/Games/standalone/tanukisunset.html +19 -0
  36. package/Games/standalone/ultrakill.html +108 -0
  37. package/games.json +130 -3
  38. package/iframetrue.json +2622 -0
  39. package/index.html +298 -147
  40. package/package.json +2 -2
  41. package/singlefilegames.json +7 -0
  42. package/singleiframetrue.json +2581 -0
  43. package/start.html +25 -0
  44. package/test.html +132 -0
  45. package/port.html +0 -0
package/index.html CHANGED
@@ -4,6 +4,7 @@
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Alexr's World</title>
7
+ <link rel="icon" href="new logo.png">
7
8
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
8
9
  <style>
9
10
 
@@ -817,6 +818,58 @@ body.theme-red .game-modal > div:first-child { background: #3a0000 !important; c
817
818
  .tab-btn { display: inline-block; font-size: 0.95rem; }
818
819
  .library-overlay .lib-header, .otherOverlay .lib-header { padding-left: 10px; padding-right: 10px; }
819
820
  }
821
+
822
+ .lib-card.dragging {
823
+ opacity: 0.4;
824
+ transform: scale(0.95);
825
+ }
826
+ .lib-card.drag-over {
827
+ outline: 3px solid var(--ps-light-blue);
828
+ }
829
+
830
+
831
+ /* ===== TV-ONLY FIX: DO NOT AFFECT DESKTOP ===== */
832
+
833
+ /* Samsung TV fails to render transformed flex rows */
834
+ body.tv-detected .carousel-container {
835
+ transform: none !important;
836
+ overflow: visible !important;
837
+ }
838
+
839
+ /* Ensure carousel area has height */
840
+ body.tv-detected .main-stage {
841
+ min-height: 220px;
842
+ }
843
+
844
+ /* Ensure cards are paintable */
845
+ body.tv-detected .card {
846
+ min-width: var(--card-size);
847
+ min-height: var(--card-size);
848
+ flex-shrink: 0;
849
+ visibility: visible;
850
+ }
851
+
852
+ /* Force images to paint on Tizen */
853
+ body.tv-detected .card img {
854
+ display: block;
855
+ width: 100%;
856
+ height: 100%;
857
+ }
858
+
859
+ /* Tizen does not support flex gap */
860
+ body.tv-detected .social-icons a {
861
+ margin-right: 14px;
862
+ }
863
+ body.tv-detected .social-icons a:last-child {
864
+ margin-right: 0;
865
+ }
866
+
867
+ /* Focus outline for TV */
868
+ body.tv-detected .card:focus {
869
+ outline: 5px solid var(--ps-light-blue);
870
+ outline-offset: 4px;
871
+ }
872
+
820
873
  </style>
821
874
  </head>
822
875
  <body>
@@ -824,7 +877,7 @@ body.theme-red .game-modal > div:first-child { background: #3a0000 !important; c
824
877
 
825
878
  <div class="top-bar">
826
879
  <div class="site-title-group">
827
- <div class="site-title"><img src="/new logo.png" alt="Alexr's World Logo"> Alexr's World</div>
880
+ <div class="site-title"><img src="new logo.png" alt="Alexr's World Logo"> Alexr's World</div>
828
881
  </div>
829
882
 
830
883
  <div class="nav-hint" id="navHint">Navigate with &larr;&rarr; Arrow Keys or Mouse</div>
@@ -894,7 +947,10 @@ body.theme-red .game-modal > div:first-child { background: #3a0000 !important; c
894
947
  </div>
895
948
 
896
949
  <div id="other_changelog">
897
- <p>12-14-25: Beta release</p>
950
+ <p>12-14-25 Beta V1: Beta release</p>
951
+ <p>12-15-25 Beta V2: Bug Fixes and implemented pokemon games and more!</p>
952
+ <p>12-17-25: Beta V3: More bug fixes and implement FNAF 4 Halloween and Ultimate Custom Night</p>
953
+ <p>12-18-25: V1.0: RELEASE! You can now drag and drop cards on menu. Added Donkey Kong Country 1-3.</p>
898
954
  </div>
899
955
 
900
956
  <div id="other_proxy" style="display:none;">
@@ -957,7 +1013,7 @@ body.theme-red .game-modal > div:first-child { background: #3a0000 !important; c
957
1013
  </div>
958
1014
 
959
1015
  <p style="font-size:0.85rem; color:#aaa; margin-top:15px;">
960
- Sound effects include card hovers, selection, and a menu background track.
1016
+ Sound effects include card hovers, selection, and the PS4 Menu Music.
961
1017
  </p>
962
1018
 
963
1019
  <hr style="margin:20px 0; border-color:rgba(255,255,255,0.1);">
@@ -975,6 +1031,9 @@ body.theme-red .game-modal > div:first-child { background: #3a0000 !important; c
975
1031
  </div>
976
1032
 
977
1033
  <script>
1034
+
1035
+ let draggedLibTitle = null;
1036
+
978
1037
  const carousel = document.getElementById('carousel');
979
1038
  const infoArea = document.getElementById('infoArea');
980
1039
  const libOverlay = document.getElementById('libraryOverlay');
@@ -986,9 +1045,7 @@ body.theme-red .game-modal > div:first-child { background: #3a0000 !important; c
986
1045
  const gameSuggestionsDatalist = document.getElementById('game-suggestions');
987
1046
  const subContent = document.querySelector('.sub-content');
988
1047
 
989
- // Play select sound when interacting with the library/favorites search input
990
1048
  if (libSearchInput) {
991
- // Use focus and Enter; avoid click to prevent double-trigger (focus + click) on some browsers
992
1049
  libSearchInput.addEventListener('focus', () => playSound('select'));
993
1050
  libSearchInput.addEventListener('keydown', (e) => {
994
1051
  if (e.key === 'Enter') {
@@ -1237,71 +1294,74 @@ body.theme-red .game-modal > div:first-child { background: #3a0000 !important; c
1237
1294
  }
1238
1295
 
1239
1296
 
1240
- async function loadGames() {
1241
- loadFavorites();
1297
+ async function loadGames() {
1298
+ loadFavorites();
1242
1299
 
1243
-
1244
- localStorage.removeItem('alexrGames_allGamesData');
1245
-
1246
-
1247
- try {
1248
- const response = await fetch('https://raw.githubusercontent.com/dskjfoisjfsjio/alexrsworld/main/games.json');
1249
- if (!response.ok) {
1250
- throw new Error(`HTTP error! status: ${response.status}`);
1251
- }
1252
- const data = await response.json();
1253
-
1254
-
1255
- allGamesData = Array.isArray(data) ? data : data.allGamesData || [];
1300
+ localStorage.removeItem('alexrGames_allGamesData');
1301
+
1302
+ try {
1303
+ const response = await fetch('https://raw.githubusercontent.com/dskjfoisjfsjio/alexrsworld/main/games.json?t=' + Date.now());
1304
+ if (!response.ok) {
1305
+ throw new Error(`HTTP error! status: ${response.status}`);
1306
+ }
1307
+ const data = await response.json();
1308
+
1309
+ allGamesData = Array.isArray(data) ? data : data.allGamesData || [];
1256
1310
 
1257
- if (allGamesData.length === 0) {
1258
- console.warn('games.json was empty or incorrectly formatted.');
1259
- }
1311
+ allGamesData.sort((a, b) => {
1312
+ return a.title.localeCompare(b.title, undefined, {
1313
+ numeric: true,
1314
+ sensitivity: 'base'
1315
+ });
1316
+ });
1260
1317
 
1261
- try {
1262
- const savedCustom = JSON.parse(localStorage.getItem('alexrGames_customOrder') || '[]');
1263
- if (Array.isArray(savedCustom) && savedCustom.length) {
1264
- const map = new Map(allGamesData.map(g => [g.title, g]));
1265
- const reordered = [];
1266
- savedCustom.forEach(title => {
1267
- if (map.has(title)) {
1268
- reordered.push(map.get(title));
1269
- map.delete(title);
1270
- }
1271
- });
1272
- for (const g of allGamesData) {
1273
- if (map.has(g.title)) reordered.push(g);
1274
- }
1275
- allGamesData = reordered;
1276
- } else {
1277
- const savedRecent = JSON.parse(localStorage.getItem('alexrGames_recent') || '[]');
1278
- if (Array.isArray(savedRecent) && savedRecent.length) {
1279
- const map = new Map(allGamesData.map(g => [g.title, g]));
1280
- const reordered = [];
1281
- savedRecent.forEach(title => {
1282
- if (map.has(title)) {
1283
- reordered.push(map.get(title));
1284
- map.delete(title);
1285
- }
1286
- });
1287
- for (const g of allGamesData) {
1288
- if (map.has(g.title)) reordered.push(g);
1289
- }
1290
- allGamesData = reordered;
1318
+ if (allGamesData.length === 0) {
1319
+ console.warn('games.json was empty or incorrectly formatted.');
1320
+ }
1321
+
1322
+ try {
1323
+ const savedCustom = JSON.parse(localStorage.getItem('alexrGames_customOrder') || '[]');
1324
+ if (Array.isArray(savedCustom) && savedCustom.length) {
1325
+ const map = new Map(allGamesData.map(g => [g.title, g]));
1326
+ const reordered = [];
1327
+ savedCustom.forEach(title => {
1328
+ if (map.has(title)) {
1329
+ reordered.push(map.get(title));
1330
+ map.delete(title);
1331
+ }
1332
+ });
1333
+ for (const g of allGamesData) {
1334
+ if (map.has(g.title)) reordered.push(g);
1335
+ }
1336
+ allGamesData = reordered;
1337
+ } else {
1338
+ const savedRecent = JSON.parse(localStorage.getItem('alexrGames_recent') || '[]');
1339
+ if (Array.isArray(savedRecent) && savedRecent.length) {
1340
+ const map = new Map(allGamesData.map(g => [g.title, g]));
1341
+ const reordered = [];
1342
+ savedRecent.forEach(title => {
1343
+ if (map.has(title)) {
1344
+ reordered.push(map.get(title));
1345
+ map.delete(title);
1291
1346
  }
1347
+ });
1348
+ for (const g of allGamesData) {
1349
+ if (map.has(g.title)) reordered.push(g);
1292
1350
  }
1293
- } catch (e) {
1294
- console.warn('Failed to apply saved ordering:', e);
1351
+ allGamesData = reordered;
1295
1352
  }
1296
-
1297
- } catch(e) {
1298
- console.error("Failed to fetch games.json. Please ensure the file exists and is valid JSON.", e);
1299
- allGamesData = [];
1300
1353
  }
1301
-
1302
- buildLists();
1354
+ } catch (e) {
1355
+ console.warn('Failed to apply saved ordering:', e);
1303
1356
  }
1304
1357
 
1358
+ } catch(e) {
1359
+ console.error("Failed to fetch games.json. Please ensure the file exists and is valid JSON.", e);
1360
+ allGamesData = [];
1361
+ }
1362
+
1363
+ buildLists();
1364
+ }
1305
1365
  function buildLists() {
1306
1366
  const firstSix = allGamesData.slice(0, 6);
1307
1367
 
@@ -1517,79 +1577,120 @@ body.theme-red .game-modal > div:first-child { background: #3a0000 !important; c
1517
1577
  renderOverlayGrid();
1518
1578
  }
1519
1579
 
1520
- function renderOverlayGrid() {
1521
- libGrid.innerHTML = '';
1522
- let gamesToShow = [];
1580
+ function renderOverlayGrid() {
1581
+ libGrid.innerHTML = '';
1582
+ let gamesToShow = [];
1523
1583
 
1524
- if (currentOverlayMode === 'library') {
1525
- libraryTitle.textContent = 'All Games';
1526
- gamesToShow = allGamesData;
1527
-
1528
-
1529
- const searchTerm = libSearchInput.value.toLowerCase().trim();
1530
-
1531
- gamesToShow = gamesToShow.filter(game => {
1532
- const matchesSearch = !searchTerm || game.title.toLowerCase().includes(searchTerm);
1533
- const matchesCategory = currentCategoryFilter === 'All' || game.category === currentCategoryFilter;
1534
- return matchesSearch && matchesCategory;
1535
- });
1584
+ if (currentOverlayMode === 'library') {
1585
+ libraryTitle.textContent = 'All Games';
1586
+ gamesToShow = allGamesData;
1587
+
1588
+ const searchTerm = libSearchInput.value.toLowerCase().trim();
1589
+
1590
+ gamesToShow = gamesToShow.filter(game => {
1591
+ const matchesSearch = !searchTerm || game.title.toLowerCase().includes(searchTerm);
1592
+ const matchesCategory = currentCategoryFilter === 'All' || game.category === currentCategoryFilter;
1593
+ return matchesSearch && matchesCategory;
1594
+ });
1536
1595
 
1537
- } else {
1538
- libraryTitle.textContent = 'Your Favorites';
1539
- gamesToShow = allGamesData.filter(g => favoritesSet.has(g.title));
1540
-
1541
- const searchTerm = libSearchInput.value.toLowerCase().trim();
1542
- gamesToShow = gamesToShow.filter(game => {
1543
- const matchesSearch = !searchTerm || game.title.toLowerCase().includes(searchTerm);
1544
- const matchesCategory = currentCategoryFilter === 'All' || game.category === currentCategoryFilter;
1545
- return matchesSearch && matchesCategory;
1546
- });
1547
- }
1596
+ } else {
1597
+ libraryTitle.textContent = 'Your Favorites';
1598
+ gamesToShow = allGamesData.filter(g => favoritesSet.has(g.title));
1599
+
1600
+ const searchTerm = libSearchInput.value.toLowerCase().trim();
1601
+ gamesToShow = gamesToShow.filter(game => {
1602
+ const matchesSearch = !searchTerm || game.title.toLowerCase().includes(searchTerm);
1603
+ const matchesCategory = currentCategoryFilter === 'All' || game.category === currentCategoryFilter;
1604
+ return matchesSearch && matchesCategory;
1605
+ });
1606
+ }
1548
1607
 
1549
- gamesToShow.forEach((game) => {
1550
- const card = document.createElement('div');
1551
- card.className = 'lib-card';
1552
- card.innerHTML = `
1553
- <img src="${game.img || ''}" onerror="this.style.display='none'">
1554
- <button class="lib-fav-btn" aria-label="${favoritesSet.has(game.title) ? 'Unfavorite' : 'Favorite'}">
1555
- <i class="${favoritesSet.has(game.title) ? 'fas' : 'far'} fa-heart"></i>
1556
- </button>
1557
- <div class="lib-card-title">${game.title}</div>
1558
- `;
1559
-
1560
- const favBtn = card.querySelector('.lib-fav-btn');
1561
- if (favBtn) {
1562
- if (favoritesSet.has(game.title)) favBtn.classList.add('favorited');
1563
- favBtn.addEventListener('click', (e) => {
1564
- e.stopPropagation();
1565
- if (favoritesSet.has(game.title)) {
1566
- favoritesSet.delete(game.title);
1567
- favBtn.classList.remove('favorited');
1568
- const icon = favBtn.querySelector('i'); if (icon) icon.className = 'far fa-heart';
1569
- favBtn.setAttribute('aria-label','Favorite');
1570
- } else {
1571
- favoritesSet.add(game.title);
1572
- favBtn.classList.add('favorited');
1573
- const icon = favBtn.querySelector('i'); if (icon) icon.className = 'fas fa-heart';
1574
- favBtn.setAttribute('aria-label','Unfavorite');
1575
- }
1576
- saveFavorites();
1577
- playSound('select');
1608
+ gamesToShow.forEach((game) => {
1609
+ const card = document.createElement('div');
1610
+ card.draggable = true;
1578
1611
 
1579
- if (currentOverlayMode === 'favorites') renderOverlayGrid();
1580
- try { updateFavoriteTile(displayList[selectedIndex]); } catch(e) {}
1581
- });
1612
+ card.addEventListener('dragstart', () => {
1613
+ draggedLibTitle = game.title;
1614
+ card.classList.add('dragging');
1615
+ playSound('hover');
1616
+ });
1617
+
1618
+ card.addEventListener('dragend', () => {
1619
+ draggedLibTitle = null;
1620
+ card.classList.remove('dragging');
1621
+ document.querySelectorAll('.lib-card').forEach(c => c.classList.remove('drag-over'));
1622
+ });
1623
+
1624
+ card.addEventListener('dragover', (e) => {
1625
+ e.preventDefault();
1626
+ card.classList.add('drag-over');
1627
+ });
1628
+
1629
+ card.addEventListener('dragleave', () => {
1630
+ card.classList.remove('drag-over');
1631
+ });
1632
+
1633
+ card.addEventListener('drop', (e) => {
1634
+ e.preventDefault();
1635
+ card.classList.remove('drag-over');
1636
+
1637
+ if (!draggedLibTitle || draggedLibTitle === game.title) return;
1638
+
1639
+ const fromIndex = allGamesData.findIndex(g => g.title === draggedLibTitle);
1640
+ const toIndex = allGamesData.findIndex(g => g.title === game.title);
1641
+
1642
+ if (fromIndex === -1 || toIndex === -1) return;
1643
+
1644
+ const [moved] = allGamesData.splice(fromIndex, 1);
1645
+ allGamesData.splice(toIndex, 0, moved);
1646
+
1647
+ playSound('select');
1648
+ saveGameOrder();
1649
+ renderOverlayGrid();
1650
+ });
1651
+
1652
+ card.className = 'lib-card';
1653
+ card.innerHTML = `
1654
+ <img src="${game.img || ''}" onerror="this.style.display='none'">
1655
+ <button class="lib-fav-btn" aria-label="${favoritesSet.has(game.title) ? 'Unfavorite' : 'Favorite'}">
1656
+ <i class="${favoritesSet.has(game.title) ? 'fas' : 'far'} fa-heart"></i>
1657
+ </button>
1658
+ <div class="lib-card-title">${game.title}</div>
1659
+ `;
1660
+
1661
+ const favBtn = card.querySelector('.lib-fav-btn');
1662
+ if (favBtn) {
1663
+ if (favoritesSet.has(game.title)) favBtn.classList.add('favorited');
1664
+ favBtn.addEventListener('click', (e) => {
1665
+ e.stopPropagation();
1666
+ if (favoritesSet.has(game.title)) {
1667
+ favoritesSet.delete(game.title);
1668
+ favBtn.classList.remove('favorited');
1669
+ const icon = favBtn.querySelector('i'); if (icon) icon.className = 'far fa-heart';
1670
+ favBtn.setAttribute('aria-label','Favorite');
1671
+ } else {
1672
+ favoritesSet.add(game.title);
1673
+ favBtn.classList.add('favorited');
1674
+ const icon = favBtn.querySelector('i'); if (icon) icon.className = 'fas fa-heart';
1675
+ favBtn.setAttribute('aria-label','Unfavorite');
1582
1676
  }
1677
+ saveFavorites();
1678
+ playSound('select');
1583
1679
 
1584
- card.onclick = () => {
1585
- playSound('select');
1586
- toggleOverlay(false);
1587
- launchGame(game);
1588
- };
1589
- libGrid.appendChild(card);
1680
+ if (currentOverlayMode === 'favorites') renderOverlayGrid();
1681
+ try { updateFavoriteTile(displayList[selectedIndex]); } catch(e) {}
1590
1682
  });
1591
1683
  }
1592
1684
 
1685
+ card.onclick = () => {
1686
+ playSound('select');
1687
+ toggleOverlay(false);
1688
+ launchGame(game);
1689
+ };
1690
+ libGrid.appendChild(card);
1691
+ });
1692
+ }
1693
+
1593
1694
  function updateSelection(index) {
1594
1695
  if(isLibraryOpen || isOtherOpen || document.querySelector('.game-modal')) return;
1595
1696
  if(index < 0) index = 0;
@@ -2190,33 +2291,38 @@ body.theme-red .game-modal > div:first-child { background: #3a0000 !important; c
2190
2291
 
2191
2292
  loadCloak();
2192
2293
 
2193
- let lastWheelTime = 0;
2194
- const wheelCooldownMs = 120;
2195
- window.addEventListener('wheel', (e) => {
2196
- try {
2197
- if (isLibraryOpen || isOtherOpen) return;
2198
- if (document.querySelector('.game-modal')) return;
2294
+ let lastWheelTime = 0;
2295
+ const wheelCooldownMs = 120;
2199
2296
 
2200
- const now = Date.now();
2201
- if (now - lastWheelTime < wheelCooldownMs) return;
2297
+ window.addEventListener('wheel', (e) => {
2298
+ try {
2299
+ if (isLibraryOpen || isOtherOpen) return;
2300
+ if (document.querySelector('.game-modal')) return;
2202
2301
 
2203
- const delta = e.deltaY || e.wheelDelta || 0;
2204
- if (Math.abs(delta) < 5) return;
2302
+ const now = Date.now();
2303
+ if (now - lastWheelTime < wheelCooldownMs) return;
2205
2304
 
2206
- if (e.preventDefault) e.preventDefault();
2305
+ const delta = e.deltaY || e.wheelDelta || 0;
2306
+ if (Math.abs(delta) < 5) return;
2207
2307
 
2208
- if (delta > 0) {
2209
- updateSelection(Math.min(displayList.length - 1, selectedIndex + 1));
2210
- } else {
2211
- updateSelection(Math.max(0, selectedIndex - 1));
2212
- }
2308
+ if (e.preventDefault) e.preventDefault();
2213
2309
 
2214
- playSound('hover');
2215
- lastWheelTime = now;
2216
- } catch (err) {
2217
- console.warn('Wheel navigation error:', err);
2218
- }
2219
- }, { passive: false });
2310
+ let nextIndex;
2311
+ if (delta > 0) {
2312
+ nextIndex = (selectedIndex >= displayList.length - 1) ? 0 : selectedIndex + 1;
2313
+ } else {
2314
+ nextIndex = (selectedIndex <= 0) ? displayList.length - 1 : selectedIndex - 1;
2315
+ }
2316
+
2317
+ updateSelection(nextIndex);
2318
+
2319
+ playSound('hover');
2320
+
2321
+ lastWheelTime = now;
2322
+ } catch (err) {
2323
+ console.warn('Wheel navigation error:', err);
2324
+ }
2325
+ }, { passive: false });
2220
2326
 
2221
2327
  (function(){
2222
2328
  let touchStartX = 0;
@@ -2296,6 +2402,51 @@ body.theme-red {
2296
2402
  linear-gradient(135deg, #3a0000, #7a0000) !important;
2297
2403
  --ps-light-blue: #ff4d4d !important;
2298
2404
  }
2405
+
2406
+ .lib-card.dragging {
2407
+ opacity: 0.4;
2408
+ transform: scale(0.95);
2409
+ }
2410
+ .lib-card.drag-over {
2411
+ outline: 3px solid var(--ps-light-blue);
2412
+ }
2413
+
2414
+
2415
+
2416
+ body.tv-detected .carousel-container {
2417
+ transform: none !important;
2418
+ overflow: visible !important;
2419
+ }
2420
+
2421
+ body.tv-detected .main-stage {
2422
+ min-height: 220px;
2423
+ }
2424
+
2425
+ body.tv-detected .card {
2426
+ min-width: var(--card-size);
2427
+ min-height: var(--card-size);
2428
+ flex-shrink: 0;
2429
+ visibility: visible;
2430
+ }
2431
+
2432
+ body.tv-detected .card img {
2433
+ display: block;
2434
+ width: 100%;
2435
+ height: 100%;
2436
+ }
2437
+
2438
+ body.tv-detected .social-icons a {
2439
+ margin-right: 14px;
2440
+ }
2441
+ body.tv-detected .social-icons a:last-child {
2442
+ margin-right: 0;
2443
+ }
2444
+
2445
+ body.tv-detected .card:focus {
2446
+ outline: 5px solid var(--ps-light-blue);
2447
+ outline-offset: 4px;
2448
+ }
2449
+
2299
2450
  </style>
2300
2451
 
2301
2452
  </body>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "alexrsworld",
3
- "version": "1.0.0",
4
- "description": "This is in beta. Not everything is final or perfect yet. Expect some glitches and bugs here and there.",
3
+ "version": "1.0.2",
4
+ "description": "Released! Will improve overtime.",
5
5
  "main": "index.js",
6
6
  "scripts": {
7
7
  "test": "echo \"Error: no test specified\" && exit 1"
@@ -2231,6 +2231,10 @@
2231
2231
  "category": "Arcade",
2232
2232
  "iframe": false
2233
2233
  },
2234
+
2235
+
2236
+
2237
+
2234
2238
  {
2235
2239
  "title": "Soundboard",
2236
2240
  "img": "https://raw.githubusercontent.com/dskjfoisjfsjio/dskjfoisjfsjio.github.io/main/assets/game%20images/soundboard.png",
@@ -2264,3 +2268,6 @@
2264
2268
  "iframe": false
2265
2269
  }
2266
2270
  ]
2271
+
2272
+
2273
+ // DONT USE THIS