Skip to content

Commit 984f321

Browse files
author
web3blind
committed
Polish home navigation icons and chronicle speed
1 parent 3b5ae72 commit 984f321

15 files changed

Lines changed: 145 additions & 70 deletions

File tree

app/assets/icons/viz-magic-192.png

-131 Bytes
Loading

app/assets/icons/viz-magic-512.png

-1.65 KB
Loading

app/css/main.css

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1881,10 +1881,20 @@ body,
18811881

18821882
/* Low-cost ambient motion. Disabled for users who prefer reduced motion. */
18831883
@media (prefers-reduced-motion: no-preference) {
1884-
@keyframes vmagic-rune-pulse { 0%, 100% { filter: drop-shadow(0 0 0 rgba(255,216,88,0)); transform: scale(1); } 50% { filter: drop-shadow(0 0 8px rgba(255,216,88,0.45)); transform: scale(1.03); } }
1885-
@keyframes vmagic-boss-breathe { 0%, 100% { transform: scale(1); filter: drop-shadow(0 0 0 rgba(124,53,255,0)); } 50% { transform: scale(1.025); filter: drop-shadow(0 0 10px rgba(124,53,255,0.35)); } }
1886-
@keyframes vmagic-weather-drift { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-2px); } }
1887-
.recipe-icon, .craft-icon-anim { animation: vmagic-rune-pulse 3.6s ease-in-out infinite; }
1888-
.boss-icon-large { display: inline-block; animation: vmagic-boss-breathe 4.8s ease-in-out infinite; }
1889-
.magical-forecast .forecast-icon { display: inline-block; animation: vmagic-weather-drift 5.5s ease-in-out infinite; }
1884+
@keyframes vmagic-rune-pulse { 0%, 100% { filter: drop-shadow(0 0 0 rgba(255,216,88,0)); transform: scale(1) rotate(0deg); } 50% { filter: drop-shadow(0 0 14px rgba(255,216,88,0.75)); transform: scale(1.12) rotate(-3deg); } }
1885+
@keyframes vmagic-boss-breathe { 0%, 100% { transform: scale(1); filter: drop-shadow(0 0 0 rgba(124,53,255,0)); } 50% { transform: scale(1.10); filter: drop-shadow(0 0 16px rgba(124,53,255,0.65)); } }
1886+
@keyframes vmagic-weather-drift { 0%, 100% { transform: translateY(0) rotate(0deg) scale(1); filter: drop-shadow(0 0 0 rgba(88,166,255,0)); } 50% { transform: translateY(-5px) rotate(4deg) scale(1.10); filter: drop-shadow(0 0 12px rgba(88,166,255,0.65)); } }
1887+
@keyframes vmagic-tile-shimmer { 0%, 100% { transform: translateY(0) scale(1); filter: saturate(1); } 50% { transform: translateY(-3px) scale(1.08); filter: saturate(1.45) drop-shadow(0 0 10px rgba(88,166,255,0.5)); } }
1888+
.recipe-icon, .craft-icon-anim { animation: vmagic-rune-pulse 2.4s ease-in-out infinite; }
1889+
.boss-icon-large, .boss-alert-icon { display: inline-block; animation: vmagic-boss-breathe 3.0s ease-in-out infinite; }
1890+
.magical-forecast .forecast-icon { display: inline-block; animation: vmagic-weather-drift 2.8s ease-in-out infinite; }
1891+
.action-tile .tile-icon { display: inline-block; animation: vmagic-tile-shimmer 4.0s ease-in-out infinite; }
1892+
}
1893+
1894+
.map-region-the_veil .region-icon,
1895+
.region-card-the_veil .region-icon,
1896+
.region-card[data-region="the_veil"] .region-icon {
1897+
color: #f7e7a6;
1898+
text-shadow: 0 0 10px rgba(247, 231, 166, 0.85), 0 0 18px rgba(88, 166, 255, 0.45);
1899+
filter: saturate(1.5) brightness(1.2);
18901900
}

app/index.html

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88
<meta name="apple-mobile-web-app-capable" content="yes">
99
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
1010
<title>Viz Magic</title>
11-
<link rel="manifest" href="manifest.json?v=20260713b">
11+
<link rel="manifest" href="manifest.json?v=20260714b">
1212
<link rel="icon" href="favicon.ico?v=20260712c">
13-
<link rel="icon" type="image/png" sizes="192x192" href="assets/icons/viz-magic-192.png?v=20260714a">
14-
<link rel="icon" type="image/png" sizes="512x512" href="assets/icons/viz-magic-512.png?v=20260714a">
15-
<link rel="apple-touch-icon" href="assets/icons/viz-magic-192.png?v=20260714a">
16-
<link rel="stylesheet" href="css/main.css?v=20260714a">
13+
<link rel="icon" type="image/png" sizes="192x192" href="assets/icons/viz-magic-192.png?v=20260714b">
14+
<link rel="icon" type="image/png" sizes="512x512" href="assets/icons/viz-magic-512.png?v=20260714b">
15+
<link rel="apple-touch-icon" href="assets/icons/viz-magic-192.png?v=20260714b">
16+
<link rel="stylesheet" href="css/main.css?v=20260714b">
1717
<link rel="stylesheet" href="css/themes.css">
1818
<link rel="stylesheet" href="css/accessibility.css">
1919
</head>
@@ -124,8 +124,8 @@
124124
<script src="js/config.js?v=20260712a"></script>
125125

126126
<!-- I18n -->
127-
<script src="js/i18n/ru.js?v=20260714a"></script>
128-
<script src="js/i18n/en.js?v=20260714a"></script>
127+
<script src="js/i18n/ru.js?v=20260714b"></script>
128+
<script src="js/i18n/en.js?v=20260714b"></script>
129129

130130
<!-- Utilities -->
131131
<script src="js/utils/helpers.js?v=20260621l"></script>
@@ -149,7 +149,7 @@
149149
<!-- Game data -->
150150
<script src="js/data/creatures.js?v=20260621j"></script>
151151
<script src="js/data/spells.js"></script>
152-
<script src="js/data/recipes.js"></script>
152+
<script src="js/data/recipes.js?v=20260714b"></script>
153153
<script src="js/data/regions.js"></script>
154154
<script src="js/data/quests.js?v=20260621e"></script>
155155

@@ -169,7 +169,7 @@
169169
<script src="js/engine/marketplace.js"></script>
170170
<script src="js/engine/checkpoint.js"></script>
171171
<script src="js/engine/block-processor.js"></script>
172-
<script src="js/engine/world-events.js?v=20260713a"></script>
172+
<script src="js/engine/world-events.js?v=20260714b"></script>
173173
<script src="js/engine/world-boss.js"></script>
174174
<script src="js/engine/quest-system.js?v=20260621e"></script>
175175
<script src="js/engine/loci.js"></script>
@@ -190,26 +190,26 @@
190190
<script src="js/ui/screens/landing.js"></script>
191191
<script src="js/ui/screens/login.js?v=20260711a"></script>
192192
<script src="js/ui/screens/onboarding.js"></script>
193-
<script src="js/ui/screens/home.js?v=20260714a"></script>
193+
<script src="js/ui/screens/home.js?v=20260714b"></script>
194194
<script src="js/ui/screens/character.js?v=20260713b"></script>
195195
<script src="js/ui/screens/hunt.js?v=20260713d"></script>
196196
<script src="js/ui/screens/inventory.js?v=20260713a"></script>
197-
<script src="js/ui/screens/chronicle.js?v=20260714a"></script>
197+
<script src="js/ui/screens/chronicle.js?v=20260714b"></script>
198198
<script src="js/ui/screens/duel.js"></script>
199199
<script src="js/ui/screens/arena.js?v=20260621d"></script>
200200
<script src="js/ui/screens/guild.js?v=20260621l"></script>
201-
<script src="js/ui/screens/map.js?v=20260621h"></script>
201+
<script src="js/ui/screens/map.js?v=20260714b"></script>
202202
<script src="js/ui/screens/marketplace.js?v=20260713c"></script>
203-
<script src="js/ui/screens/crafting.js?v=20260713b"></script>
203+
<script src="js/ui/screens/crafting.js?v=20260714b"></script>
204204
<script src="js/ui/screens/quests.js?v=20260712a"></script>
205205
<script src="js/ui/screens/world-boss.js?v=20260713a"></script>
206206
<script src="js/ui/screens/settings.js?v=20260713b"></script>
207207
<script src="js/ui/screens/help.js?v=20260713a"></script>
208208
<script src="js/ui/screens/leaderboard.js?v=20260712c"></script>
209209
<script src="js/ui/screens/temple.js?v=20260714a"></script>
210-
<script src="js/ui/screens/developers.js?v=20260714a"></script>
210+
<script src="js/ui/screens/developers.js?v=20260714b"></script>
211211

212212
<!-- Main App Controller (must be last) -->
213-
<script src="js/ui/app.js?v=20260714a"></script>
213+
<script src="js/ui/app.js?v=20260714b"></script>
214214
</body>
215215
</html>

app/js/engine/world-events.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -103,15 +103,15 @@ var WorldEvents = (function() {
103103
},
104104
{
105105
id: 'quiet_stars',
106-
icon: '\u2728',
106+
icon: '\uD83D\uDD6F\uFE0F',
107107
summaryKey: 'weather_quiet_stars',
108108
effectKey: 'weather_quiet_stars_effect',
109109
creatureAttackMod: 950,
110110
playerDefenseMod: 1050
111111
},
112112
{
113113
id: 'forbidden_wind',
114-
icon: '\uD83C\uDF2B\uFE0F',
114+
icon: '\uD83E\uDE81',
115115
summaryKey: 'weather_forbidden_wind',
116116
effectKey: 'weather_forbidden_wind_effect',
117117
creatureAttackMod: 1150,
@@ -135,7 +135,7 @@ var WorldEvents = (function() {
135135
},
136136
{
137137
id: 'mirror_fog',
138-
icon: '\uD83C\uDF2B\uFE0F',
138+
icon: '\uD83E\uDE9E',
139139
summaryKey: 'weather_mirror_fog',
140140
effectKey: 'weather_mirror_fog_effect',
141141
creatureAttackMod: 1000,
@@ -199,15 +199,15 @@ var WorldEvents = (function() {
199199
},
200200
{
201201
id: 'borrowed_sun',
202-
icon: '\u2600\uFE0F',
202+
icon: '\uD83D\uDD2E',
203203
summaryKey: 'weather_borrowed_sun',
204204
effectKey: 'weather_borrowed_sun_effect',
205205
creatureAttackMod: 980,
206206
playerDefenseMod: 1070
207207
},
208208
{
209209
id: 'ash_snow',
210-
icon: '\u2744\uFE0F',
210+
icon: '\uD83D\uDD25',
211211
summaryKey: 'weather_ash_snow',
212212
effectKey: 'weather_ash_snow_effect',
213213
creatureAttackMod: 1040,
@@ -239,15 +239,15 @@ var WorldEvents = (function() {
239239
},
240240
{
241241
id: 'golden_dust',
242-
icon: '\u2728',
242+
icon: '\uD83D\uDCB0',
243243
summaryKey: 'weather_golden_dust',
244244
effectKey: 'weather_golden_dust_effect',
245245
creatureAttackMod: 930,
246246
playerDefenseMod: 1100
247247
},
248248
{
249249
id: 'black_rainbow',
250-
icon: '\uD83C\uDF08',
250+
icon: '\uD83D\uDDA4',
251251
summaryKey: 'weather_black_rainbow',
252252
effectKey: 'weather_black_rainbow_effect',
253253
creatureAttackMod: 1100,

app/js/i18n/en.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ var LangEN = {
120120
home_map: 'Map',
121121
home_chronicle: 'Chronicle',
122122
home_primary_actions: 'Main bar',
123-
home_secondary_actions: 'More sections',
123+
home_secondary_actions: 'Additional bar',
124124
home_install_shortcut: 'Game shortcut on your phone',
125125
home_install_shortcut_text: 'Add Viz Magic to your phone home screen so you do not have to find a saved link after the game window closes. This is a normal PWA shortcut install, no app store needed.',
126126
home_install_shortcut_button: 'Install or show instructions',

app/js/i18n/ru.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ var LangRU = {
120120
home_map: 'Карта',
121121
home_chronicle: 'Хроника',
122122
home_primary_actions: 'Главная строка',
123-
home_secondary_actions: 'Ещё разделы',
123+
home_secondary_actions: 'Дополнительная строка',
124124
home_install_shortcut: 'Ярлык игры на телефоне',
125125
home_install_shortcut_text: 'Чтобы не искать сохранённую ссылку после закрытия окна, добавьте Viz Magic на главный экран телефона. Это обычная установка PWA-ярлыка без магазина приложений.',
126126
home_install_shortcut_button: 'Установить или показать инструкцию',

app/js/ui/screens/chronicle.js

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -111,16 +111,19 @@ var ChronicleScreen = (function() {
111111
text = _ensureRequiredTag(text);
112112
if (!text || text.length > MAX_POST_LENGTH) return;
113113
SoundManager.play('bless_send');
114+
var optimisticBlock = _injectLocalPost(text);
115+
_renderLocalFeedNow();
116+
Helpers.$('chronicle-input').value = '';
117+
_setDraft('');
118+
Helpers.$('chronicle-char-count').textContent = '0/' + MAX_POST_LENGTH;
114119

115120
VizBroadcast.chroniclePost(text, function(err) {
116121
if (err) {
122+
_removeLocalPost(optimisticBlock, text);
123+
_renderLocalFeedNow();
117124
Toast.error(Helpers.t('error_network'));
118125
} else {
119-
_injectLocalPost(text);
120126
Toast.success('\u2728 ' + Helpers.t('chronicle_send'));
121-
Helpers.$('chronicle-input').value = '';
122-
_setDraft('');
123-
Helpers.$('chronicle-char-count').textContent = '0/' + MAX_POST_LENGTH;
124127
_loadFeed();
125128
}
126129
});
@@ -143,8 +146,9 @@ var ChronicleScreen = (function() {
143146
var entries = _collectPostEntries(state);
144147
var accounts = _getFeedAccounts(state);
145148

149+
_renderFeedEntries(_filterByTab(_dedupeEntries(entries), state));
150+
146151
if (!accounts.length || typeof VoiceProtocol === 'undefined' || !VoiceProtocol.loadChronicle) {
147-
_renderFeedEntries(_filterByTab(entries, state));
148152
return;
149153
}
150154

@@ -347,16 +351,41 @@ var ChronicleScreen = (function() {
347351
function _injectLocalPost(text) {
348352
var state = StateEngine.getState();
349353
var user = VizAccount.getCurrentUser();
350-
if (!state || !user) return;
354+
if (!state || !user) return 0;
355+
if (!state.recentActions) state.recentActions = [];
356+
var optimisticBlock = (state.headBlock || 0) + 1;
351357
state.recentActions.push({
352358
type: 'chronicle_post',
353359
sender: user,
354-
blockNum: (state.headBlock || 0) + 1,
360+
blockNum: optimisticBlock,
355361
timestamp: Date.now(),
356362
text: text,
357363
message: { type: 'text', text: text },
364+
optimistic: true,
358365
events: []
359366
});
367+
cachedFeedHtml = {};
368+
return optimisticBlock;
369+
}
370+
371+
function _removeLocalPost(blockNum, text) {
372+
var state = StateEngine.getState();
373+
var user = VizAccount.getCurrentUser();
374+
if (!state || !state.recentActions || !user) return;
375+
for (var i = state.recentActions.length - 1; i >= 0; i--) {
376+
var action = state.recentActions[i];
377+
if (action && action.optimistic && action.sender === user && action.blockNum === blockNum && action.text === text) {
378+
state.recentActions.splice(i, 1);
379+
break;
380+
}
381+
}
382+
cachedFeedHtml = {};
383+
}
384+
385+
function _renderLocalFeedNow() {
386+
var state = StateEngine.getState();
387+
var entries = _collectPostEntries(state);
388+
_renderFeedEntries(_filterByTab(_dedupeEntries(entries), state));
360389
}
361390

362391
function _injectLocalBlessing(account, energy) {

app/js/ui/screens/crafting.js

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ var CraftingScreen = (function() {
101101
var recipe = recipeInfo.recipe;
102102
var canCraft = recipeInfo.canCraft;
103103
var name = t(recipe.nameKey) || recipe.id.replace(/_/g, ' ');
104-
var catIcon = _getCategoryIcon(recipe.category);
104+
var catIcon = _getRecipeIcon(recipe);
105105

106106
var html = '<div class="recipe-card' + (canCraft ? ' craftable' : ' locked') + '" ' +
107107
'role="listitem" data-recipe="' + recipe.id + '" tabindex="0" ' +
@@ -357,6 +357,27 @@ var CraftingScreen = (function() {
357357
return html;
358358
}
359359

360+
361+
function _getRecipeIcon(recipe) {
362+
var recipeIcons = {
363+
mana_potion: '\uD83E\uDDEA',
364+
health_scroll: '\uD83E\uDE79',
365+
ember_staff: '\uD83D\uDD25',
366+
ash_wand: '\uD83E\uDE84',
367+
thornwood_staff: '\uD83C\uDF3F',
368+
shadow_blade: '\uD83D\uDDE1\uFE0F',
369+
veilstone_helm: '\uD83E\uDE96',
370+
windwalker_boots: '\uD83E\uDD7E',
371+
ironbark_vest: '\uD83E\uDDBA',
372+
fire_rune: '\uD83D\uDD25',
373+
shadow_rune: '\uD83C\uDF11',
374+
lucky_charm: '\uD83C\uDF40',
375+
armageddon_stone: '\u2604\uFE0F'
376+
};
377+
if (recipe && recipeIcons[recipe.id]) return recipeIcons[recipe.id];
378+
return _getCategoryIcon(recipe ? recipe.category : '');
379+
}
380+
360381
/**
361382
* Get category icon
362383
*/

app/js/ui/screens/developers.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ var DevelopersScreen = (function() {
66
'use strict';
77

88
var DEVELOPER_ACCOUNT = 'denis-skripnik';
9-
var REWARD_OPTIONS = [50, 100, 250]; // basis points: 0.50%, 1.00%, 2.50%
9+
var REWARD_OPTIONS = [100]; // one quick reward button: 1.00%
1010

1111
function render() {
1212
var t = Helpers.t;

0 commit comments

Comments
 (0)