fix a few bugs
- make mobile vc tiles match pc version - translate missing blahs - make font appear on avatar svg
This commit is contained in:
parent
093498e168
commit
d4c3b15367
12 changed files with 142 additions and 38 deletions
|
|
@ -325,5 +325,31 @@
|
||||||
"error.call.microphone": "microphone error :c",
|
"error.call.microphone": "microphone error :c",
|
||||||
"error.voice.reconnect.failed": "voice connection lost :c",
|
"error.voice.reconnect.failed": "voice connection lost :c",
|
||||||
"error.voice.ticket.rejected": "voice auth failed :c check VOICE_KEY/server version",
|
"error.voice.ticket.rejected": "voice auth failed :c check VOICE_KEY/server version",
|
||||||
"error.voice.not.configured": "voice server not configured :c missing VOICE_KEY"
|
"error.voice.not.configured": "voice server not configured :c missing VOICE_KEY",
|
||||||
|
"title.group.name": "clowder name",
|
||||||
|
"title.group.history.visible": "history visible to newcomers",
|
||||||
|
"desc.group.history.visible": "new clowder meowmbers will be able to see older meowsages (disables key purrotation)",
|
||||||
|
"history.visible": "enabled, meow",
|
||||||
|
"history.hidden": "disabled, meow",
|
||||||
|
"group.history.changed.by": "{0} changed history visibility to: {1}",
|
||||||
|
"group.name.changed.by": "{0} changed the clowder name to {1}",
|
||||||
|
"group.pfp.changed.by": "{0} changed the clowder picture",
|
||||||
|
"group.pfp.removed.by": "{0} removed the clowder picture",
|
||||||
|
"action.call.init": "starting call... :3",
|
||||||
|
"already.in.call": "ur already in a call meow",
|
||||||
|
"call.connect.failed": "failed to connect to the call :c",
|
||||||
|
"call.microphone": "microphone error :c",
|
||||||
|
"voice.reconnect.failed": "voice connection lost :c",
|
||||||
|
"voice.ticket.rejected": "voice auth failed :c check VOICE_KEY/server version",
|
||||||
|
"kdf.salt.missing": "missing encryption salt :c try pawging in again",
|
||||||
|
"group-avatar.updated": "clowder picture updated successfully :3",
|
||||||
|
"error.unknown.error": "unknown error :o",
|
||||||
|
"federation.disabled": "federation is disabled :c",
|
||||||
|
"invalid.name": "invalid name meow",
|
||||||
|
"invalid.keys": "invalid nametags meow",
|
||||||
|
"history.hidden.keys.provided": "no nametags allowed when history is hissed away, meow",
|
||||||
|
"cannot.kick.self": "you can't scratch yourself",
|
||||||
|
"invalid.attachment": "invalid meowttachment :c",
|
||||||
|
"no.voice.servers": "no voice servers available :c",
|
||||||
|
"voice.not.configured": "voice server not configured :c missing VOICE_KEY"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -334,5 +334,22 @@
|
||||||
"error.call.microphone": "Microphone error",
|
"error.call.microphone": "Microphone error",
|
||||||
"error.voice.reconnect.failed": "Voice connection lost",
|
"error.voice.reconnect.failed": "Voice connection lost",
|
||||||
"error.voice.ticket.rejected": "Voice authentication failed - check VOICE_KEY/server version",
|
"error.voice.ticket.rejected": "Voice authentication failed - check VOICE_KEY/server version",
|
||||||
"error.voice.not.configured": "Voice server is not configured (missing VOICE_KEY)"
|
"error.voice.not.configured": "Voice server is not configured (missing VOICE_KEY)",
|
||||||
|
"action.call.init": "Initializing call...",
|
||||||
|
"already.in.call": "You are already in a call",
|
||||||
|
"call.connect.failed": "Failed to connect to the call",
|
||||||
|
"call.microphone": "Microphone error",
|
||||||
|
"voice.reconnect.failed": "Voice connection lost",
|
||||||
|
"voice.ticket.rejected": "Voice authentication failed - check VOICE_KEY/server version",
|
||||||
|
"kdf.salt.missing": "Encryption salt is missing. Please log in again.",
|
||||||
|
"group-avatar.updated": "Group icon updated successfully",
|
||||||
|
"error.unknown.error": "Unknown error",
|
||||||
|
"federation.disabled": "Federation is disabled",
|
||||||
|
"invalid.name": "Invalid name",
|
||||||
|
"invalid.keys": "Invalid keys",
|
||||||
|
"history.hidden.keys.provided": "Keys cannot be provided when group history is hidden",
|
||||||
|
"cannot.kick.self": "You cannot kick yourself",
|
||||||
|
"invalid.attachment": "Invalid attachment",
|
||||||
|
"no.voice.servers": "No voice servers available",
|
||||||
|
"voice.not.configured": "Voice server is not configured (missing VOICE_KEY)"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -334,5 +334,22 @@
|
||||||
"error.call.microphone": "Błąd mikrofonu",
|
"error.call.microphone": "Błąd mikrofonu",
|
||||||
"error.voice.reconnect.failed": "Utracono połączenie głosowe",
|
"error.voice.reconnect.failed": "Utracono połączenie głosowe",
|
||||||
"error.voice.ticket.rejected": "Autoryzacja głosu nieudana - sprawdź VOICE_KEY/wersję serwera",
|
"error.voice.ticket.rejected": "Autoryzacja głosu nieudana - sprawdź VOICE_KEY/wersję serwera",
|
||||||
"error.voice.not.configured": "Serwer głosowy nieskonfigurowany (brak VOICE_KEY)"
|
"error.voice.not.configured": "Serwer głosowy nieskonfigurowany (brak VOICE_KEY)",
|
||||||
|
"action.call.init": "Nawiązywanie połączenia...",
|
||||||
|
"already.in.call": "Jesteś już w rozmowie",
|
||||||
|
"call.connect.failed": "Nie udało się połączyć z rozmową",
|
||||||
|
"call.microphone": "Błąd mikrofonu",
|
||||||
|
"voice.reconnect.failed": "Utracono połączenie głosowe",
|
||||||
|
"voice.ticket.rejected": "Autoryzacja głosu nieudana - sprawdź VOICE_KEY/wersję serwera",
|
||||||
|
"kdf.salt.missing": "Brak soli szyfrowania. Zaloguj się ponownie.",
|
||||||
|
"group-avatar.updated": "Ikona grupy została pomyślnie zaktualizowana",
|
||||||
|
"error.unknown.error": "Nieznany błąd",
|
||||||
|
"federation.disabled": "Federacja jest wyłączona",
|
||||||
|
"invalid.name": "Nieprawidłowa nazwa",
|
||||||
|
"invalid.keys": "Nieprawidłowe klucze",
|
||||||
|
"history.hidden.keys.provided": "Nie można podać kluczy, gdy historia grupy jest ukryta",
|
||||||
|
"cannot.kick.self": "Nie możesz wyrzucić samego siebie",
|
||||||
|
"invalid.attachment": "Nieprawidłowy załącznik",
|
||||||
|
"no.voice.servers": "Brak dostępnych serwerów głosowych",
|
||||||
|
"voice.not.configured": "Serwer głosowy nieskonfigurowany (brak VOICE_KEY)"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,11 @@
|
||||||
// icons.js - Centralized SVG definitions
|
// icons.js - Centralized SVG definitions
|
||||||
|
|
||||||
|
//Subset czcionki Nunito (A-Z, 0-9, kropka, spacja) w base64.
|
||||||
|
//SVG wczytany przez <img> nie ma dostępu do fontów strony (@font-face),
|
||||||
|
//więc bez osadzenia czcionki inicjały na fallback awatarach renderują się
|
||||||
|
//systemową czcionką zamiast Nunito.
|
||||||
|
const AVATAR_FONT_B64 = "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";
|
||||||
|
|
||||||
const ICONS = {
|
const ICONS = {
|
||||||
_create: function(content, defaultProps, customProps = {}) {
|
_create: function(content, defaultProps, customProps = {}) {
|
||||||
let p = { ...defaultProps, ...customProps };
|
let p = { ...defaultProps, ...customProps };
|
||||||
|
|
@ -55,6 +61,6 @@ const ICONS = {
|
||||||
inbox: (props) => ICONS._material(`<path d="M216-144q-29 0-50.5-21.5T144-216v-528q0-29.7 21.5-50.85Q187-816 216-816h528q29.7 0 50.85 21.15Q816-773.7 816-744v528q0 29-21.15 50.5T744-144H216Zm0-72h528v-144H632q-23 43-63.5 69.5T480-264q-49 0-89.5-26T328-360H216v144Zm332-148q28-28 28-68h168v-312H216v312h168q0 40 28 68t68 28q40 0 68-28ZM216-216h528-528Z"/>`, props),
|
inbox: (props) => ICONS._material(`<path d="M216-144q-29 0-50.5-21.5T144-216v-528q0-29.7 21.5-50.85Q187-816 216-816h528q29.7 0 50.85 21.15Q816-773.7 816-744v528q0 29-21.15 50.5T744-144H216Zm0-72h528v-144H632q-23 43-63.5 69.5T480-264q-49 0-89.5-26T328-360H216v144Zm332-148q28-28 28-68h168v-312H216v312h168q0 40 28 68t68 28q40 0 68-28ZM216-216h528-528Z"/>`, props),
|
||||||
|
|
||||||
avatar: function(initials, color, size) {
|
avatar: function(initials, color, size) {
|
||||||
return `<svg xmlns="http://www.w3.org/2000/svg" width="${size}" height="${size}" viewBox="0 0 ${size} ${size}"><rect width="100%" height="100%" fill="${color}" /><text x="50%" y="50%" fill="white" font-family="Nunito" font-size="${size * 0.45}" text-anchor="middle" dy=".35em">${initials}</text></svg>`;
|
return `<svg xmlns="http://www.w3.org/2000/svg" width="${size}" height="${size}" viewBox="0 0 ${size} ${size}"><defs><style>@font-face{font-family:'NunitoAvatar';src:url(data:font/woff2;base64,${AVATAR_FONT_B64}) format('woff2');}</style></defs><rect width="100%" height="100%" fill="${color}" /><text x="50%" y="50%" fill="white" font-family="NunitoAvatar, Nunito, sans-serif" font-size="${size * 0.45}" text-anchor="middle" dy=".35em">${initials}</text></svg>`;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1963,17 +1963,4 @@ input:checked + .toggle-slider:before {
|
||||||
.voice-call-btn {
|
.voice-call-btn {
|
||||||
padding: 0 0.75rem;
|
padding: 0 0.75rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
#voice-users {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(auto-fit, minmax(min(5.5rem, 100%), 1fr));
|
|
||||||
grid-auto-rows: minmax(6.25rem, 1fr);
|
|
||||||
align-content: stretch;
|
|
||||||
justify-items: stretch;
|
|
||||||
}
|
|
||||||
.voice-tile {
|
|
||||||
width: auto !important;
|
|
||||||
height: auto !important;
|
|
||||||
min-width: 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2212,7 +2212,6 @@ function relayoutVoiceTiles() {
|
||||||
}
|
}
|
||||||
|
|
||||||
const gap = 0.75 * rootFs;
|
const gap = 0.75 * rootFs;
|
||||||
const maxSize = 18 * rootFs; // jedna osoba nie dostanie gigantycznego kafelka
|
|
||||||
const minSize = 4.5 * rootFs; // poniżej tego wolimy scrollować niż spłaszczać
|
const minSize = 4.5 * rootFs; // poniżej tego wolimy scrollować niż spłaszczać
|
||||||
|
|
||||||
//Największy kwadrat, przy którym n kafelków mieści się w dostępnej powierzchni:
|
//Największy kwadrat, przy którym n kafelków mieści się w dostępnej powierzchni:
|
||||||
|
|
@ -2228,7 +2227,7 @@ function relayoutVoiceTiles() {
|
||||||
if (s > best) best = s;
|
if (s > best) best = s;
|
||||||
}
|
}
|
||||||
|
|
||||||
const size = Math.min(maxSize, Math.max(minSize, Math.floor(best)));
|
const size = Math.max(minSize, Math.floor(best));
|
||||||
const sig = `${n}:${size}`;
|
const sig = `${n}:${size}`;
|
||||||
if (container.dataset.layoutSig === sig) return;
|
if (container.dataset.layoutSig === sig) return;
|
||||||
container.dataset.layoutSig = sig;
|
container.dataset.layoutSig = sig;
|
||||||
|
|
|
||||||
|
|
@ -325,5 +325,31 @@
|
||||||
"error.call.microphone": "microphone error :c",
|
"error.call.microphone": "microphone error :c",
|
||||||
"error.voice.reconnect.failed": "voice connection lost :c",
|
"error.voice.reconnect.failed": "voice connection lost :c",
|
||||||
"error.voice.ticket.rejected": "voice auth failed :c check VOICE_KEY/server version",
|
"error.voice.ticket.rejected": "voice auth failed :c check VOICE_KEY/server version",
|
||||||
"error.voice.not.configured": "voice server not configured :c missing VOICE_KEY"
|
"error.voice.not.configured": "voice server not configured :c missing VOICE_KEY",
|
||||||
|
"title.group.name": "clowder name",
|
||||||
|
"title.group.history.visible": "history visible to newcomers",
|
||||||
|
"desc.group.history.visible": "new clowder meowmbers will be able to see older meowsages (disables key purrotation)",
|
||||||
|
"history.visible": "enabled, meow",
|
||||||
|
"history.hidden": "disabled, meow",
|
||||||
|
"group.history.changed.by": "{0} changed history visibility to: {1}",
|
||||||
|
"group.name.changed.by": "{0} changed the clowder name to {1}",
|
||||||
|
"group.pfp.changed.by": "{0} changed the clowder picture",
|
||||||
|
"group.pfp.removed.by": "{0} removed the clowder picture",
|
||||||
|
"action.call.init": "starting call... :3",
|
||||||
|
"already.in.call": "ur already in a call meow",
|
||||||
|
"call.connect.failed": "failed to connect to the call :c",
|
||||||
|
"call.microphone": "microphone error :c",
|
||||||
|
"voice.reconnect.failed": "voice connection lost :c",
|
||||||
|
"voice.ticket.rejected": "voice auth failed :c check VOICE_KEY/server version",
|
||||||
|
"kdf.salt.missing": "missing encryption salt :c try pawging in again",
|
||||||
|
"group-avatar.updated": "clowder picture updated successfully :3",
|
||||||
|
"error.unknown.error": "unknown error :o",
|
||||||
|
"federation.disabled": "federation is disabled :c",
|
||||||
|
"invalid.name": "invalid name meow",
|
||||||
|
"invalid.keys": "invalid nametags meow",
|
||||||
|
"history.hidden.keys.provided": "no nametags allowed when history is hissed away, meow",
|
||||||
|
"cannot.kick.self": "you can't scratch yourself",
|
||||||
|
"invalid.attachment": "invalid meowttachment :c",
|
||||||
|
"no.voice.servers": "no voice servers available :c",
|
||||||
|
"voice.not.configured": "voice server not configured :c missing VOICE_KEY"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -334,5 +334,22 @@
|
||||||
"error.call.microphone": "Microphone error",
|
"error.call.microphone": "Microphone error",
|
||||||
"error.voice.reconnect.failed": "Voice connection lost",
|
"error.voice.reconnect.failed": "Voice connection lost",
|
||||||
"error.voice.ticket.rejected": "Voice authentication failed - check VOICE_KEY/server version",
|
"error.voice.ticket.rejected": "Voice authentication failed - check VOICE_KEY/server version",
|
||||||
"error.voice.not.configured": "Voice server is not configured (missing VOICE_KEY)"
|
"error.voice.not.configured": "Voice server is not configured (missing VOICE_KEY)",
|
||||||
|
"action.call.init": "Initializing call...",
|
||||||
|
"already.in.call": "You are already in a call",
|
||||||
|
"call.connect.failed": "Failed to connect to the call",
|
||||||
|
"call.microphone": "Microphone error",
|
||||||
|
"voice.reconnect.failed": "Voice connection lost",
|
||||||
|
"voice.ticket.rejected": "Voice authentication failed - check VOICE_KEY/server version",
|
||||||
|
"kdf.salt.missing": "Encryption salt is missing. Please log in again.",
|
||||||
|
"group-avatar.updated": "Group icon updated successfully",
|
||||||
|
"error.unknown.error": "Unknown error",
|
||||||
|
"federation.disabled": "Federation is disabled",
|
||||||
|
"invalid.name": "Invalid name",
|
||||||
|
"invalid.keys": "Invalid keys",
|
||||||
|
"history.hidden.keys.provided": "Keys cannot be provided when group history is hidden",
|
||||||
|
"cannot.kick.self": "You cannot kick yourself",
|
||||||
|
"invalid.attachment": "Invalid attachment",
|
||||||
|
"no.voice.servers": "No voice servers available",
|
||||||
|
"voice.not.configured": "Voice server is not configured (missing VOICE_KEY)"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -334,5 +334,22 @@
|
||||||
"error.call.microphone": "Błąd mikrofonu",
|
"error.call.microphone": "Błąd mikrofonu",
|
||||||
"error.voice.reconnect.failed": "Utracono połączenie głosowe",
|
"error.voice.reconnect.failed": "Utracono połączenie głosowe",
|
||||||
"error.voice.ticket.rejected": "Autoryzacja głosu nieudana - sprawdź VOICE_KEY/wersję serwera",
|
"error.voice.ticket.rejected": "Autoryzacja głosu nieudana - sprawdź VOICE_KEY/wersję serwera",
|
||||||
"error.voice.not.configured": "Serwer głosowy nieskonfigurowany (brak VOICE_KEY)"
|
"error.voice.not.configured": "Serwer głosowy nieskonfigurowany (brak VOICE_KEY)",
|
||||||
|
"action.call.init": "Nawiązywanie połączenia...",
|
||||||
|
"already.in.call": "Jesteś już w rozmowie",
|
||||||
|
"call.connect.failed": "Nie udało się połączyć z rozmową",
|
||||||
|
"call.microphone": "Błąd mikrofonu",
|
||||||
|
"voice.reconnect.failed": "Utracono połączenie głosowe",
|
||||||
|
"voice.ticket.rejected": "Autoryzacja głosu nieudana - sprawdź VOICE_KEY/wersję serwera",
|
||||||
|
"kdf.salt.missing": "Brak soli szyfrowania. Zaloguj się ponownie.",
|
||||||
|
"group-avatar.updated": "Ikona grupy została pomyślnie zaktualizowana",
|
||||||
|
"error.unknown.error": "Nieznany błąd",
|
||||||
|
"federation.disabled": "Federacja jest wyłączona",
|
||||||
|
"invalid.name": "Nieprawidłowa nazwa",
|
||||||
|
"invalid.keys": "Nieprawidłowe klucze",
|
||||||
|
"history.hidden.keys.provided": "Nie można podać kluczy, gdy historia grupy jest ukryta",
|
||||||
|
"cannot.kick.self": "Nie możesz wyrzucić samego siebie",
|
||||||
|
"invalid.attachment": "Nieprawidłowy załącznik",
|
||||||
|
"no.voice.servers": "Brak dostępnych serwerów głosowych",
|
||||||
|
"voice.not.configured": "Serwer głosowy nieskonfigurowany (brak VOICE_KEY)"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,11 @@
|
||||||
// icons.js - Centralized SVG definitions
|
// icons.js - Centralized SVG definitions
|
||||||
|
|
||||||
|
//Subset czcionki Nunito (A-Z, 0-9, kropka, spacja) w base64.
|
||||||
|
//SVG wczytany przez <img> nie ma dostępu do fontów strony (@font-face),
|
||||||
|
//więc bez osadzenia czcionki inicjały na fallback awatarach renderują się
|
||||||
|
//systemową czcionką zamiast Nunito.
|
||||||
|
const AVATAR_FONT_B64 = "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";
|
||||||
|
|
||||||
const ICONS = {
|
const ICONS = {
|
||||||
_create: function(content, defaultProps, customProps = {}) {
|
_create: function(content, defaultProps, customProps = {}) {
|
||||||
let p = { ...defaultProps, ...customProps };
|
let p = { ...defaultProps, ...customProps };
|
||||||
|
|
@ -55,6 +61,6 @@ const ICONS = {
|
||||||
inbox: (props) => ICONS._material(`<path d="M216-144q-29 0-50.5-21.5T144-216v-528q0-29.7 21.5-50.85Q187-816 216-816h528q29.7 0 50.85 21.15Q816-773.7 816-744v528q0 29-21.15 50.5T744-144H216Zm0-72h528v-144H632q-23 43-63.5 69.5T480-264q-49 0-89.5-26T328-360H216v144Zm332-148q28-28 28-68h168v-312H216v312h168q0 40 28 68t68 28q40 0 68-28ZM216-216h528-528Z"/>`, props),
|
inbox: (props) => ICONS._material(`<path d="M216-144q-29 0-50.5-21.5T144-216v-528q0-29.7 21.5-50.85Q187-816 216-816h528q29.7 0 50.85 21.15Q816-773.7 816-744v528q0 29-21.15 50.5T744-144H216Zm0-72h528v-144H632q-23 43-63.5 69.5T480-264q-49 0-89.5-26T328-360H216v144Zm332-148q28-28 28-68h168v-312H216v312h168q0 40 28 68t68 28q40 0 68-28ZM216-216h528-528Z"/>`, props),
|
||||||
|
|
||||||
avatar: function(initials, color, size) {
|
avatar: function(initials, color, size) {
|
||||||
return `<svg xmlns="http://www.w3.org/2000/svg" width="${size}" height="${size}" viewBox="0 0 ${size} ${size}"><rect width="100%" height="100%" fill="${color}" /><text x="50%" y="50%" fill="white" font-family="Nunito" font-size="${size * 0.45}" text-anchor="middle" dy=".35em">${initials}</text></svg>`;
|
return `<svg xmlns="http://www.w3.org/2000/svg" width="${size}" height="${size}" viewBox="0 0 ${size} ${size}"><defs><style>@font-face{font-family:'NunitoAvatar';src:url(data:font/woff2;base64,${AVATAR_FONT_B64}) format('woff2');}</style></defs><rect width="100%" height="100%" fill="${color}" /><text x="50%" y="50%" fill="white" font-family="NunitoAvatar, Nunito, sans-serif" font-size="${size * 0.45}" text-anchor="middle" dy=".35em">${initials}</text></svg>`;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -1963,17 +1963,4 @@ input:checked + .toggle-slider:before {
|
||||||
.voice-call-btn {
|
.voice-call-btn {
|
||||||
padding: 0 0.75rem;
|
padding: 0 0.75rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
#voice-users {
|
|
||||||
display: grid;
|
|
||||||
grid-template-columns: repeat(auto-fit, minmax(min(5.5rem, 100%), 1fr));
|
|
||||||
grid-auto-rows: minmax(6.25rem, 1fr);
|
|
||||||
align-content: stretch;
|
|
||||||
justify-items: stretch;
|
|
||||||
}
|
|
||||||
.voice-tile {
|
|
||||||
width: auto !important;
|
|
||||||
height: auto !important;
|
|
||||||
min-width: 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2212,7 +2212,6 @@ function relayoutVoiceTiles() {
|
||||||
}
|
}
|
||||||
|
|
||||||
const gap = 0.75 * rootFs;
|
const gap = 0.75 * rootFs;
|
||||||
const maxSize = 18 * rootFs; // jedna osoba nie dostanie gigantycznego kafelka
|
|
||||||
const minSize = 4.5 * rootFs; // poniżej tego wolimy scrollować niż spłaszczać
|
const minSize = 4.5 * rootFs; // poniżej tego wolimy scrollować niż spłaszczać
|
||||||
|
|
||||||
//Największy kwadrat, przy którym n kafelków mieści się w dostępnej powierzchni:
|
//Największy kwadrat, przy którym n kafelków mieści się w dostępnej powierzchni:
|
||||||
|
|
@ -2228,7 +2227,7 @@ function relayoutVoiceTiles() {
|
||||||
if (s > best) best = s;
|
if (s > best) best = s;
|
||||||
}
|
}
|
||||||
|
|
||||||
const size = Math.min(maxSize, Math.max(minSize, Math.floor(best)));
|
const size = Math.max(minSize, Math.floor(best));
|
||||||
const sig = `${n}:${size}`;
|
const sig = `${n}:${size}`;
|
||||||
if (container.dataset.layoutSig === sig) return;
|
if (container.dataset.layoutSig === sig) return;
|
||||||
container.dataset.layoutSig = sig;
|
container.dataset.layoutSig = sig;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue