Compare commits
No commits in common. "9c99b112d56783d89a03daee10cfdfef3c1b4ea8" and "0a20562d9fcc1f52953f995ebcd3bfe5f7c44e78" have entirely different histories.
9c99b112d5
...
0a20562d9f
17 changed files with 104 additions and 328 deletions
|
|
@ -14,7 +14,7 @@
|
|||
"dm.key.too.large": "meowchat key too large :o",
|
||||
"dm.key.not.found": "meowchat key not found :c",
|
||||
"dm.key.updated": "meowchat key updated successfully :3",
|
||||
"body.too.large": "request too large ><",
|
||||
"body.too.large": "request body too large ><",
|
||||
"invite.revoked": "invite revoked successfully",
|
||||
"invite.declined": "invite declined successfully",
|
||||
"account.creation.request.expired": "cat creation request expired. try again",
|
||||
|
|
@ -33,8 +33,12 @@
|
|||
"username.conditions.allowed": "cat name can only include {all}",
|
||||
"password.not.hashed.properly": "meow word is not hashed properly",
|
||||
"invalid.username.or.password": "invalid cat name or meow word",
|
||||
"error.account.not.exist": "Meowccount Does Not Exist",
|
||||
"error.storage.limit.exceeded": "Storage Limit Exceeded, purr",
|
||||
"error.username.taken": "Meowname is Taken",
|
||||
"error.network.error": "Network error, check connection or file size, meow.",
|
||||
"error.body.too.large": "File is too large, meow! (max 10MB)",
|
||||
"error.unknown.error": "Unknown error, purr",
|
||||
"account.not.exist": "cat with this name doesn't exist",
|
||||
"invalid.nonce": "invalid nonce. try again",
|
||||
"username.changed": "cat name changed successfully",
|
||||
|
|
@ -118,6 +122,7 @@
|
|||
"title.back.to.register": "back to registration",
|
||||
"title.details": "details",
|
||||
"title.members": "cats",
|
||||
|
||||
"placeholder.username": "cat name",
|
||||
"placeholder.captcha.code": "captcha code",
|
||||
"desc.messages.loading": "loading meows...",
|
||||
|
|
@ -186,11 +191,5 @@
|
|||
"action.attachment.poll": "Meowll",
|
||||
"action.attachment.uploading": "Uploading meowttachments...",
|
||||
"attachment.legacy": "Legacy meowttachment",
|
||||
"warning.unencrypted": "This meowsage is not encrypted",
|
||||
"action.change.avatar": "Change Cat Picture",
|
||||
"action.change.banner": "Change Cat Banner",
|
||||
"placeholder.type.text.emoji": "Type purr / meow...",
|
||||
"action.cancel": "Cancel",
|
||||
"title.crop.image": "Crop Image",
|
||||
"title.zoom": "Zoom"
|
||||
"warning.unencrypted": "This meowsage is not encrypted"
|
||||
}
|
||||
|
|
@ -14,7 +14,7 @@
|
|||
"dm.key.too.large": "DM key too large",
|
||||
"dm.key.not.found": "DM key not found",
|
||||
"dm.key.updated": "DM key updated successfully",
|
||||
"body.too.large": "Request too large",
|
||||
"body.too.large": "Request body too large",
|
||||
"invite.revoked": "Invite revoked successfully",
|
||||
"invite.declined": "Invite declined successfully",
|
||||
"account.creation.request.expired": "Account creation request expired. Try again",
|
||||
|
|
@ -33,8 +33,12 @@
|
|||
"username.conditions.allowed": "Username can only include {all}",
|
||||
"password.not.hashed.properly": "Password is not hashed properly",
|
||||
"invalid.username.or.password": "Invalid username or password",
|
||||
"error.account.not.exist": "Account Does Not Exist",
|
||||
"error.storage.limit.exceeded": "Storage Limit Exceeded",
|
||||
"error.username.taken": "Username is Taken",
|
||||
"error.network.error": "Network error, check connection or file size.",
|
||||
"error.body.too.large": "File is too large (max 10MB)",
|
||||
"error.unknown.error": "Unknown error",
|
||||
"account.not.exist": "Account with this name doesn't exist",
|
||||
"invalid.nonce": "Invalid nonce. Try again",
|
||||
"username.changed": "Username changed successfully",
|
||||
|
|
@ -152,6 +156,7 @@
|
|||
"title.loading": "Loading...",
|
||||
"title.details": "Details",
|
||||
"title.members": "Members",
|
||||
|
||||
"action.edit.profile": "Edit profile",
|
||||
"action.open.dm": "Open DM",
|
||||
"action.invite.accept": "Accept invite",
|
||||
|
|
@ -186,11 +191,5 @@
|
|||
"action.attachment.poll": "Poll",
|
||||
"action.attachment.uploading": "Uploading attachments...",
|
||||
"attachment.legacy": "Legacy attachment",
|
||||
"warning.unencrypted": "This message is not encrypted",
|
||||
"action.change.avatar": "Change Avatar",
|
||||
"action.change.banner": "Change Banner",
|
||||
"placeholder.type.text.emoji": "Type text / emoji...",
|
||||
"action.cancel": "Cancel",
|
||||
"title.crop.image": "Crop Image",
|
||||
"title.zoom": "Zoom"
|
||||
"warning.unencrypted": "This message is not encrypted"
|
||||
}
|
||||
|
|
@ -1,5 +1,4 @@
|
|||
{
|
||||
"en-us": { "english": "English (US)", "native": "English (US)" },
|
||||
"en-cat": { "english": "English (Cat)", "native": "Meowlish" },
|
||||
"pl-pl": { "english": "Polish", "native": "Polski" }
|
||||
"en-cat": { "english": "English (Cat)", "native": "Meowlish" }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,196 +0,0 @@
|
|||
{
|
||||
"user.not.found": "Nie znaleziono użytkownika",
|
||||
"dm.already.exists": "Wiadomość prywatna już istnieje",
|
||||
"cant.invite.urself": "Nie możesz zaprosić samego siebie",
|
||||
"user.already.invited": "Ten użytkownik został już przez Ciebie zaproszony",
|
||||
"user.invited": "Użytkownik został pomyślnie zaproszony",
|
||||
"cant.create.dm.without.invitation": "Nie możesz utworzyć wiadomości prywatnej bez zaproszenia",
|
||||
"dm.begin.notice": "Na początku każdej rozmowy prywatnej zawsze upewnij się, że rozmawiasz z właściwą osobą",
|
||||
"failed.accept.dm": "Nie udało się zaakceptować rozmowy prywatnej",
|
||||
"dm.accepted": "Rozmowa prywatna została zaakceptowana",
|
||||
"no.invite.found": "Nie możesz utworzyć wiadomości prywatnej bez zaproszenia",
|
||||
"unknown.error": "Nieznany błąd",
|
||||
"forbidden": "Nie masz uprawnień do wykonania tej akcji",
|
||||
"dm.key.too.large": "Klucz wiadomości prywatnej jest zbyt duży",
|
||||
"dm.key.not.found": "Nie znaleziono klucza wiadomości prywatnej",
|
||||
"dm.key.updated": "Klucz wiadomości prywatnej został pomyślnie zaktualizowany",
|
||||
"body.too.large": "Treść żądania jest zbyt duża",
|
||||
"invite.revoked": "Zaproszenie zostało cofnięte",
|
||||
"invite.declined": "Zaproszenie zostało odrzucone",
|
||||
"account.creation.request.expired": "Żądanie utworzenia konta wygasło. Spróbuj ponownie",
|
||||
"invalid.username": "Nieprawidłowa nazwa użytkownika: {0}",
|
||||
"invalid.password": "Nieprawidłowe hasło: {0}",
|
||||
"incorrect.captcha": "Nieprawidłowa captcha. Spróbuj ponownie",
|
||||
"username.taken": "Ta nazwa użytkownika jest już zajęta",
|
||||
"accounts.slots.full": "Nie można utworzyć nowego konta, ponieważ wszystkie identyfikatory są zajęte. Spróbuj ponownie później",
|
||||
"registration.disabled": "Rejestracja jest wyłączona",
|
||||
"account.created": "Konto zostało pomyślnie utworzone",
|
||||
"password.changed": "Hasło zostało pomyślnie zmienione",
|
||||
"keys.updated": "Klucze zostały pomyślnie zaktualizowane",
|
||||
"unknown.request": "Nieznane żądanie: {0}",
|
||||
"login.successful": "Logowanie zakończone pomyślnie",
|
||||
"username.length": "Nazwa użytkownika musi mieć {0} znaków",
|
||||
"username.conditions.allowed": "Nazwa użytkownika może zawierać tylko: {all}",
|
||||
"password.not.hashed.properly": "Hasło nie zostało poprawnie zahaszowane",
|
||||
"invalid.username.or.password": "Nieprawidłowa nazwa użytkownika lub hasło",
|
||||
"error.storage.limit.exceeded": "Przekroczono limit pamięci",
|
||||
"error.network.error": "Błąd sieci. Sprawdź połączenie lub rozmiar pliku.",
|
||||
"account.not.exist": "Konto o tej nazwie nie istnieje",
|
||||
"invalid.nonce": "Nieprawidłowy nonce. Spróbuj ponownie",
|
||||
"username.changed": "Nazwa użytkownika została pomyślnie zmieniona",
|
||||
"auth.failed.redirect.to.login": "Uwierzytelnianie nie powiodło się. Przekierowywanie do logowania...",
|
||||
"dm.refresh.failed": "Nie udało się odświeżyć rozmów prywatnych",
|
||||
"chat.add.failed": "Nie udało się dodać czatu",
|
||||
"something.wrong.mayb.pass": "Coś poszło nie tak... (prawdopodobnie błędne hasło)",
|
||||
"something.wrong": "Coś poszło nie tak...",
|
||||
"passwords.not.match": "Hasła nie są zgodne",
|
||||
"password.cant.empty": "Hasło nie może być puste",
|
||||
"username.cant.empty": "Nazwa użytkownika nie może być pusta",
|
||||
"bad.request": "Nieprawidłowe żądanie",
|
||||
"letters": "litery",
|
||||
"numbers": "cyfry",
|
||||
"underscores": "podkreślenia",
|
||||
"loading.connecting": "Łączenie...",
|
||||
"loading.loading": "Ładowanie...",
|
||||
"loading.done": "Gotowe!",
|
||||
"title.home": "Strona główna",
|
||||
"title.dms": "Wiadomości prywatne",
|
||||
"title.groups": "Grupy",
|
||||
"title.welcome.splash": "Witamy w Miarven",
|
||||
"desc.welcome.splash": "Pierwszy klient Larpix",
|
||||
"title.splash": "Ekran powitalny",
|
||||
"title.create.dm": "Zaproś do rozmowy prywatnej",
|
||||
"title.create.space": "Utwórz społeczność",
|
||||
"title.create.group": "Utwórz grupę",
|
||||
"title.add.chat": "Dodaj czat",
|
||||
"desc.add.chat": "Dodaj prywatny, szyfrowany czat, wpisując nazwę użytkownika",
|
||||
"desc.create.group": "Utwórz prywatną, szyfrowaną grupę",
|
||||
"placeholder.create.group.input": "Moja grupa",
|
||||
"placeholder.create.space.input": "Moja społeczność",
|
||||
"title.name": "Nazwa",
|
||||
"desc.create.space": "Utwórz społeczność dla swojej grupy",
|
||||
"desc.join.space": "Dołącz do społeczności, która Ci odpowiada",
|
||||
"title.join.space": "Dołącz do społeczności",
|
||||
"title.space.id": "Identyfikator społeczności",
|
||||
"title.inbox": "Skrzynka odbiorcza",
|
||||
"title.invites": "Zaproszenia",
|
||||
"title.notifications": "Powiadomienia",
|
||||
"title.received": "Odebrane",
|
||||
"title.sent": "Wysłane",
|
||||
"title.all": "Wszystkie",
|
||||
"title.unread": "Nieprzeczytane",
|
||||
"desc.no.invites": "Brak zaproszeń",
|
||||
"desc.no.notifications": "Brak powiadomień",
|
||||
"desc.fetching.invites": "Pobieranie zaproszeń...",
|
||||
"desc.fetching.notifications": "Pobieranie powiadomień...",
|
||||
"desc.invite.dm.received": "{0} ({1}) zaprosił(a) Cię do rozmowy",
|
||||
"desc.invite.dm.sent": "Zaprosiłeś(-aś) {0} ({1}) do rozmowy",
|
||||
"desc.invite.group.received": "{0} ({1}) zaprosił(a) Cię do grupy",
|
||||
"desc.invite.group.sent": "Zaprosiłeś(-aś) {0} ({1}) do grupy",
|
||||
"action.invite.sending": "Wysyłanie zaproszenia...",
|
||||
"action.processing": "Przetwarzanie...",
|
||||
"action.fetching.invites.sent": "Pobieranie wysłanych zaproszeń...",
|
||||
"action.fetching.invites.recv": "Pobieranie otrzymanych zaproszeń...",
|
||||
"action.dm.fetch": "Pobieranie rozmów prywatnych...",
|
||||
"action.auth": "Uwierzytelnianie...",
|
||||
"action.dm.adding": "Dodawanie...",
|
||||
"action.invite.revoking": "Cofanie zaproszenia...",
|
||||
"action.invite.accepting": "Akceptowanie zaproszenia...",
|
||||
"action.invite.declining": "Odrzucanie zaproszenia...",
|
||||
"title.sign.up": "Zarejestruj się",
|
||||
"title.sign.in": "Zaloguj się",
|
||||
"title.sign.in.to": "Zaloguj się do swojej instancji Larpix",
|
||||
"title.server.host": "Adres serwera",
|
||||
"title.username": "Nazwa użytkownika",
|
||||
"title.password": "Hasło",
|
||||
"title.new.here.?": "Nowy tutaj?",
|
||||
"title.create.an.account": "Utwórz konto",
|
||||
"join.larpix": "Dołącz do Larpix",
|
||||
"title.create.new.account": "Utwórz nowe konto Larpix",
|
||||
"notice.use.strong.pass": "Pamiętaj o użyciu silnego hasła! Posłuży ono do szyfrowania Twoich kluczy.",
|
||||
"title.confirm.password": "Potwierdź hasło",
|
||||
"title.already.registered.?": "Masz już konto?",
|
||||
"title.back.to.login": "Powrót do logowania",
|
||||
"title.verify": "Weryfikacja",
|
||||
"title.captcha.desc": "Udowodnij, że jesteś człowiekiem",
|
||||
"title.captcha.code": "Kod CAPTCHA",
|
||||
"title.invitation.code": "Kod zaproszenia",
|
||||
"title.back.to.register": "Powrót do rejestracji",
|
||||
"placeholder.username": "nazwa użytkownika",
|
||||
"placeholder.captcha.code": "kod captcha",
|
||||
"placeholder.message.input": "Wiadomość...",
|
||||
"desc.messages.loading": "Pobieranie wiadomości...",
|
||||
"desc.no.dms": "Brak wiadomości prywatnych",
|
||||
"action.dm.opening": "Otwieranie rozmowy...",
|
||||
"dm.open.failed": "Nie udało się otworzyć rozmowy",
|
||||
"keys.local.server.mismatch": "To urządzenie ma inne klucze szyfrowania niż serwer. Użyj urządzenia, na którym zalogowano się po raz pierwszy, lub przywróć klucze z kopii zapasowej.",
|
||||
"keys.server.decrypt.failed": "Nie udało się odszyfrować kluczy konta przy użyciu tego hasła.",
|
||||
"dm.messages.fetch.failed": "Nie udało się pobrać wiadomości",
|
||||
"messages.decrypt.failed": "Nie udało się odszyfrować wiadomości",
|
||||
"title.reply.message": "Odpowiedz",
|
||||
"title.react.message": "Zareaguj",
|
||||
"title.text.react": "Reakcja tekstowa",
|
||||
"title.delete.message": "Usuń",
|
||||
"title.replied.to": "W odpowiedzi do",
|
||||
"title.replying.to": "Odpowiadasz na",
|
||||
"action.message.deleting": "Usuwanie wiadomości...",
|
||||
"action.message.sending": "Wysyłanie wiadomości...",
|
||||
"action.message.reacting": "Dodawanie reakcji...",
|
||||
"error:message.delete.failed": "Nie udało się usunąć wiadomości",
|
||||
"error:message.send.failed": "Nie udało się wysłać wiadomości",
|
||||
"error:message.react.failed": "Nie udało się dodać reakcji",
|
||||
"info.sending.message": "Wysyłanie...",
|
||||
"larp.redacted": "Ta wiadomość została usunięta.",
|
||||
"message.already.deleted": "Ta wiadomość została już usunięta.",
|
||||
"rate.limit": "Wysyłasz żądania zbyt szybko. Spróbuj ponownie później.",
|
||||
"placeholder.invitation.code": "kod zaproszenia",
|
||||
"info.messages.loading.older": "Ładowanie starszych wiadomości...",
|
||||
"error:message.not.found": "Nie znaleziono wiadomości",
|
||||
"title.profile": "Profil",
|
||||
"title.settings": "Ustawienia",
|
||||
"title.logout": "Wyloguj",
|
||||
"title.loading": "Ładowanie...",
|
||||
"title.details": "Szczegóły",
|
||||
"title.members": "Członkowie",
|
||||
"action.edit.profile": "Edytuj profil",
|
||||
"action.open.dm": "Otwórz rozmowę",
|
||||
"action.invite.accept": "Akceptuj zaproszenie",
|
||||
"action.invite.cancel": "Anuluj zaproszenie",
|
||||
"action.invite.send": "Zaproś do rozmowy",
|
||||
"action.profile.loading": "Ładowanie profilu...",
|
||||
"error.profile.load.failed": "Nie udało się załadować profilu.",
|
||||
"unknown.author": "Ktoś",
|
||||
"title.account": "Konto",
|
||||
"title.delete.account": "Usuń konto",
|
||||
"desc.delete.account": "Po usunięciu konta nie będzie możliwości jego odzyskania. Upewnij się, że na pewno chcesz to zrobić.",
|
||||
"title.avatar": "Awatar",
|
||||
"title.banner": "Baner",
|
||||
"title.bio": "Opis",
|
||||
"title.appearance": "Wygląd",
|
||||
"title.language": "Język",
|
||||
"action.save.profile": "Zapisz profil",
|
||||
"action.save.bio": "Zapisz opis",
|
||||
"action.uploading": "Przesyłanie...",
|
||||
"action.bio.saving": "Zapisywanie opisu...",
|
||||
"action.account.saving": "Zapisywanie konta...",
|
||||
"action.account.deleting": "Usuwanie konta...",
|
||||
"profile.updated": "Profil został pomyślnie zaktualizowany",
|
||||
"avatar.updated": "Awatar został pomyślnie zaktualizowany",
|
||||
"banner.updated": "Baner został pomyślnie zaktualizowany",
|
||||
"action.save": "Zapisz",
|
||||
"action.delete.account": "Usuń konto",
|
||||
"account.deleted.scheduled": "Konto zostało oznaczone do usunięcia. Zostanie trwale usunięte po miesiącu braku aktywności. Zalogowanie się w tym czasie anuluje proces usuwania.",
|
||||
"action.attachment.take.photo": "Zrób zdjęcie",
|
||||
"action.attachment.media": "Multimedia",
|
||||
"action.attachment.file": "Plik",
|
||||
"action.attachment.poll": "Ankieta",
|
||||
"action.attachment.uploading": "Przesyłanie załączników...",
|
||||
"attachment.legacy": "Starszy załącznik",
|
||||
"warning.unencrypted": "Ta wiadomość nie jest szyfrowana",
|
||||
"action.change.avatar": "Zmień awatar",
|
||||
"action.change.banner": "Zmień baner",
|
||||
"placeholder.type.text.emoji": "Wpisz tekst / emoji...",
|
||||
"action.cancel": "Anuluj",
|
||||
"title.crop.image": "Przytnij obraz",
|
||||
"title.zoom": "Przybliżenie"
|
||||
}
|
||||
|
|
@ -3,7 +3,6 @@
|
|||
const ICONS = {
|
||||
_create: function(content, defaultProps, customProps = {}) {
|
||||
let p = { ...defaultProps, ...customProps };
|
||||
if (customProps.width && !customProps.height) p.height = customProps.width;
|
||||
let strokeAttrs = p.strokeWidth ? ` stroke-width="${p.strokeWidth}" stroke-linecap="${p.strokeLinecap}" stroke-linejoin="${p.strokeLinejoin}"` : "";
|
||||
let classAttr = p.className ? ` class="${p.className}"` : "";
|
||||
let styleAttr = p.style ? ` style="${p.style}"` : "";
|
||||
|
|
|
|||
|
|
@ -93,17 +93,17 @@
|
|||
<div id="cropper-popup-container" class="profile-popup-container" style="z-index: 9999;">
|
||||
<div class="profile-popup-bg" onclick="closeCropper()"></div>
|
||||
<div class="profile-popup-content" style="max-width: 40rem; padding: 2rem; display: flex; flex-direction: column; align-items: center; gap: 1rem; height: auto;">
|
||||
<h2><blah>title.crop.image</blah></h2>
|
||||
<h2>Crop Image</h2>
|
||||
<div id="cropper-viewport-container" style="position: relative; overflow: hidden; background: #000; width: 100%; max-width: 30rem; border-radius: 0.8rem; border: var(--border-width) solid rgba(255,255,255,0.2);">
|
||||
<img id="cropper-image" src="" style="position: absolute; transform-origin: 0 0; cursor: move;">
|
||||
</div>
|
||||
<div style="display: flex; align-items: center; gap: 1rem; width: 100%; max-width: 30rem;">
|
||||
<span><blah>title.zoom</blah></span>
|
||||
<span>Zoom</span>
|
||||
<input type="range" id="cropper-zoom" min="0.1" max="5" step="0.01" value="1" style="flex: 1;" oninput="updateCropperZoom()">
|
||||
</div>
|
||||
<div style="display: flex; gap: 1rem; margin-top: 1rem; width: 100%; max-width: 30rem;">
|
||||
<button class="submit-button blah" style="background: rgba(255,255,255,0.1); color: var(--text-color); flex: 1;" onclick="closeCropper()">action.cancel</button>
|
||||
<button class="submit-button blah" style="flex: 1;" onclick="confirmCropper()">action.save</button>
|
||||
<button class="submit-button" style="background: rgba(255,255,255,0.1); color: var(--text-color); flex: 1;" onclick="closeCropper()">Cancel</button>
|
||||
<button class="submit-button" style="flex: 1;" onclick="confirmCropper()">Save</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -2598,18 +2598,8 @@ async function renderMessages(messages, isPrepend = false) {
|
|||
|
||||
let oldText = existingChild.querySelector('.chat-message-text');
|
||||
let newText = newChild.querySelector('.chat-message-text');
|
||||
if (oldText && newText) {
|
||||
if (oldText.innerHTML !== newText.innerHTML) {
|
||||
oldText.innerHTML = newText.innerHTML;
|
||||
}
|
||||
if (oldText.getAttribute('style') !== newText.getAttribute('style')) {
|
||||
let newStyle = newText.getAttribute('style');
|
||||
if (newStyle) {
|
||||
oldText.setAttribute('style', newStyle);
|
||||
} else {
|
||||
oldText.removeAttribute('style');
|
||||
}
|
||||
}
|
||||
if (oldText && newText && oldText.innerHTML !== newText.innerHTML) {
|
||||
oldText.innerHTML = newText.innerHTML;
|
||||
}
|
||||
|
||||
let oldReactions = existingChild.querySelector('.chat-message-reactions');
|
||||
|
|
@ -3228,7 +3218,7 @@ async function loadEmotes() {
|
|||
|
||||
reactionPickerMenuHtml = `
|
||||
<div style="display: flex; flex-direction: column; gap: 0.4rem; padding: 0.2rem; min-width: 14rem;">
|
||||
<input type="text" id="reaction-picker-search" placeholder="{blah(placeholder.type.text.emoji)}" oninput="filterReactions(this.value)" onkeydown="if(event.key === 'Enter') { if(this.value.trim() !== '') reactMessagePrompt(currentContextMenuMsgId, encodeURIComponent(this.value)); }" style="width: auto; align-self: stretch; margin: 0; box-sizing: border-box; padding: 0.5rem 0.6rem; border-radius: 0.65rem; border: var(--border-width) solid var(--light-border-color); background: transparent; color: var(--text-color); font-family: inherit;">
|
||||
<input type="text" id="reaction-picker-search" placeholder="Type text / emoji..." oninput="filterReactions(this.value)" onkeydown="if(event.key === 'Enter') { if(this.value.trim() !== '') reactMessagePrompt(currentContextMenuMsgId, encodeURIComponent(this.value)); }" style="width: auto; align-self: stretch; margin: 0; box-sizing: border-box; padding: 0.5rem 0.6rem; border-radius: 0.65rem; border: var(--border-width) solid var(--light-border-color); background: transparent; color: var(--text-color); font-family: inherit;">
|
||||
<div id="reaction-picker-grid" style="display: grid; grid-template-columns: repeat(5, 1fr); gap: 0.2rem; max-height: 12rem; overflow-y: auto; overflow-x: hidden;">
|
||||
${loadedEmotes.map(emoji => `<button onclick="reactMessagePrompt(currentContextMenuMsgId, encodeURIComponent('${emoji.char}'))" data-name="${emoji.name}" style="min-width: unset; width: 100%; aspect-ratio: 1; display: flex; justify-content: center; align-items: center; padding: 0; font-size: 1.2rem; border-radius: 0.65rem;" class="reaction-emoji-btn">${emoji.char}</button>`).join('')}
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -331,7 +331,7 @@ var profileSettings = `
|
|||
<img id="settings-avatar-preview" src="" style="width: 4.5rem; height: 4.5rem; border-radius: 0.8rem; border: var(--border-width) solid rgba(255, 255, 255, 0.2); object-fit: cover; background: var(--main-bg-color);">
|
||||
<div style="display: flex; flex-direction: column; align-items: flex-end; justify-content: space-between; padding: 0.1rem 0;">
|
||||
<div style="font-weight: bold;"><blah>title.avatar</blah></div>
|
||||
<button class="submit-button blah" style="margin: 0; padding: 0.5rem 1rem; width: auto;" onclick="document.getElementById('settings-avatar-input').click()">action.change.avatar</button>
|
||||
<button class="submit-button" style="margin: 0; padding: 0.5rem 1rem; width: auto;" onclick="document.getElementById('settings-avatar-input').click()">Change Avatar</button>
|
||||
<input type="file" id="settings-avatar-input" style="display: none;" accept="image/*" onchange="openCropper(this, 'avatar')">
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -342,7 +342,7 @@ var profileSettings = `
|
|||
</div>
|
||||
<div style="display: flex; flex-direction: column; align-items: flex-end; justify-content: space-between; padding: 0.1rem 0;">
|
||||
<div style="font-weight: bold;"><blah>title.banner</blah></div>
|
||||
<button class="submit-button blah" style="margin: 0; padding: 0.5rem 1rem; width: auto;" onclick="document.getElementById('settings-banner-input').click()">action.change.banner</button>
|
||||
<button class="submit-button" style="margin: 0; padding: 0.5rem 1rem; width: auto;" onclick="document.getElementById('settings-banner-input').click()">Change Banner</button>
|
||||
<input type="file" id="settings-banner-input" style="display: none;" accept="image/*" onchange="openCropper(this, 'banner')">
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
"dm.key.too.large": "meowchat key too large :o",
|
||||
"dm.key.not.found": "meowchat key not found :c",
|
||||
"dm.key.updated": "meowchat key updated successfully :3",
|
||||
"body.too.large": "request too large ><",
|
||||
"body.too.large": "request body too large ><",
|
||||
"invite.revoked": "invite revoked successfully",
|
||||
"invite.declined": "invite declined successfully",
|
||||
"account.creation.request.expired": "cat creation request expired. try again",
|
||||
|
|
@ -33,8 +33,12 @@
|
|||
"username.conditions.allowed": "cat name can only include {all}",
|
||||
"password.not.hashed.properly": "meow word is not hashed properly",
|
||||
"invalid.username.or.password": "invalid cat name or meow word",
|
||||
"error.account.not.exist": "Meowccount Does Not Exist",
|
||||
"error.storage.limit.exceeded": "Storage Limit Exceeded, purr",
|
||||
"error.username.taken": "Meowname is Taken",
|
||||
"error.network.error": "Network error, check connection or file size, meow.",
|
||||
"error.body.too.large": "File is too large, meow! (max 10MB)",
|
||||
"error.unknown.error": "Unknown error, purr",
|
||||
"account.not.exist": "cat with this name doesn't exist",
|
||||
"invalid.nonce": "invalid nonce. try again",
|
||||
"username.changed": "cat name changed successfully",
|
||||
|
|
@ -118,6 +122,7 @@
|
|||
"title.back.to.register": "back to registration",
|
||||
"title.details": "details",
|
||||
"title.members": "cats",
|
||||
|
||||
"placeholder.username": "cat name",
|
||||
"placeholder.captcha.code": "captcha code",
|
||||
"desc.messages.loading": "loading meows...",
|
||||
|
|
@ -186,11 +191,5 @@
|
|||
"action.attachment.poll": "Meowll",
|
||||
"action.attachment.uploading": "Uploading meowttachments...",
|
||||
"attachment.legacy": "Legacy meowttachment",
|
||||
"warning.unencrypted": "This meowsage is not encrypted",
|
||||
"action.change.avatar": "Change Cat Picture",
|
||||
"action.change.banner": "Change Cat Banner",
|
||||
"placeholder.type.text.emoji": "Type purr / meow...",
|
||||
"action.cancel": "Cancel",
|
||||
"title.crop.image": "Crop Image",
|
||||
"title.zoom": "Zoom"
|
||||
"warning.unencrypted": "This meowsage is not encrypted"
|
||||
}
|
||||
|
|
@ -14,7 +14,7 @@
|
|||
"dm.key.too.large": "DM key too large",
|
||||
"dm.key.not.found": "DM key not found",
|
||||
"dm.key.updated": "DM key updated successfully",
|
||||
"body.too.large": "Request too large",
|
||||
"body.too.large": "Request body too large",
|
||||
"invite.revoked": "Invite revoked successfully",
|
||||
"invite.declined": "Invite declined successfully",
|
||||
"account.creation.request.expired": "Account creation request expired. Try again",
|
||||
|
|
@ -33,8 +33,12 @@
|
|||
"username.conditions.allowed": "Username can only include {all}",
|
||||
"password.not.hashed.properly": "Password is not hashed properly",
|
||||
"invalid.username.or.password": "Invalid username or password",
|
||||
"error.account.not.exist": "Account Does Not Exist",
|
||||
"error.storage.limit.exceeded": "Storage Limit Exceeded",
|
||||
"error.username.taken": "Username is Taken",
|
||||
"error.network.error": "Network error, check connection or file size.",
|
||||
"error.body.too.large": "File is too large (max 10MB)",
|
||||
"error.unknown.error": "Unknown error",
|
||||
"account.not.exist": "Account with this name doesn't exist",
|
||||
"invalid.nonce": "Invalid nonce. Try again",
|
||||
"username.changed": "Username changed successfully",
|
||||
|
|
@ -152,6 +156,7 @@
|
|||
"title.loading": "Loading...",
|
||||
"title.details": "Details",
|
||||
"title.members": "Members",
|
||||
|
||||
"action.edit.profile": "Edit profile",
|
||||
"action.open.dm": "Open DM",
|
||||
"action.invite.accept": "Accept invite",
|
||||
|
|
@ -186,11 +191,5 @@
|
|||
"action.attachment.poll": "Poll",
|
||||
"action.attachment.uploading": "Uploading attachments...",
|
||||
"attachment.legacy": "Legacy attachment",
|
||||
"warning.unencrypted": "This message is not encrypted",
|
||||
"action.change.avatar": "Change Avatar",
|
||||
"action.change.banner": "Change Banner",
|
||||
"placeholder.type.text.emoji": "Type text / emoji...",
|
||||
"action.cancel": "Cancel",
|
||||
"title.crop.image": "Crop Image",
|
||||
"title.zoom": "Zoom"
|
||||
"warning.unencrypted": "This message is not encrypted"
|
||||
}
|
||||
|
|
@ -33,8 +33,12 @@
|
|||
"username.conditions.allowed": "Nazwa użytkownika może zawierać tylko: {all}",
|
||||
"password.not.hashed.properly": "Hasło nie zostało poprawnie zahaszowane",
|
||||
"invalid.username.or.password": "Nieprawidłowa nazwa użytkownika lub hasło",
|
||||
"error.account.not.exist": "Konto nie istnieje",
|
||||
"error.storage.limit.exceeded": "Przekroczono limit pamięci",
|
||||
"error.username.taken": "Nazwa użytkownika jest już zajęta",
|
||||
"error.network.error": "Błąd sieci. Sprawdź połączenie lub rozmiar pliku.",
|
||||
"error.body.too.large": "Plik jest zbyt duży (maks. 10 MB)",
|
||||
"error.unknown.error": "Nieznany błąd",
|
||||
"account.not.exist": "Konto o tej nazwie nie istnieje",
|
||||
"invalid.nonce": "Nieprawidłowy nonce. Spróbuj ponownie",
|
||||
"username.changed": "Nazwa użytkownika została pomyślnie zmieniona",
|
||||
|
|
@ -152,6 +156,7 @@
|
|||
"title.loading": "Ładowanie...",
|
||||
"title.details": "Szczegóły",
|
||||
"title.members": "Członkowie",
|
||||
|
||||
"action.edit.profile": "Edytuj profil",
|
||||
"action.open.dm": "Otwórz rozmowę",
|
||||
"action.invite.accept": "Akceptuj zaproszenie",
|
||||
|
|
@ -186,11 +191,5 @@
|
|||
"action.attachment.poll": "Ankieta",
|
||||
"action.attachment.uploading": "Przesyłanie załączników...",
|
||||
"attachment.legacy": "Starszy załącznik",
|
||||
"warning.unencrypted": "Ta wiadomość nie jest szyfrowana",
|
||||
"action.change.avatar": "Zmień awatar",
|
||||
"action.change.banner": "Zmień baner",
|
||||
"placeholder.type.text.emoji": "Wpisz tekst / emoji...",
|
||||
"action.cancel": "Anuluj",
|
||||
"title.crop.image": "Przytnij obraz",
|
||||
"title.zoom": "Przybliżenie"
|
||||
"warning.unencrypted": "Ta wiadomość nie jest szyfrowana"
|
||||
}
|
||||
|
|
@ -3,7 +3,6 @@
|
|||
const ICONS = {
|
||||
_create: function(content, defaultProps, customProps = {}) {
|
||||
let p = { ...defaultProps, ...customProps };
|
||||
if (customProps.width && !customProps.height) p.height = customProps.width;
|
||||
let strokeAttrs = p.strokeWidth ? ` stroke-width="${p.strokeWidth}" stroke-linecap="${p.strokeLinecap}" stroke-linejoin="${p.strokeLinejoin}"` : "";
|
||||
let classAttr = p.className ? ` class="${p.className}"` : "";
|
||||
let styleAttr = p.style ? ` style="${p.style}"` : "";
|
||||
|
|
|
|||
|
|
@ -93,17 +93,17 @@
|
|||
<div id="cropper-popup-container" class="profile-popup-container" style="z-index: 9999;">
|
||||
<div class="profile-popup-bg" onclick="closeCropper()"></div>
|
||||
<div class="profile-popup-content" style="max-width: 40rem; padding: 2rem; display: flex; flex-direction: column; align-items: center; gap: 1rem; height: auto;">
|
||||
<h2><blah>title.crop.image</blah></h2>
|
||||
<h2>Crop Image</h2>
|
||||
<div id="cropper-viewport-container" style="position: relative; overflow: hidden; background: #000; width: 100%; max-width: 30rem; border-radius: 0.8rem; border: var(--border-width) solid rgba(255,255,255,0.2);">
|
||||
<img id="cropper-image" src="" style="position: absolute; transform-origin: 0 0; cursor: move;">
|
||||
</div>
|
||||
<div style="display: flex; align-items: center; gap: 1rem; width: 100%; max-width: 30rem;">
|
||||
<span><blah>title.zoom</blah></span>
|
||||
<span>Zoom</span>
|
||||
<input type="range" id="cropper-zoom" min="0.1" max="5" step="0.01" value="1" style="flex: 1;" oninput="updateCropperZoom()">
|
||||
</div>
|
||||
<div style="display: flex; gap: 1rem; margin-top: 1rem; width: 100%; max-width: 30rem;">
|
||||
<button class="submit-button blah" style="background: rgba(255,255,255,0.1); color: var(--text-color); flex: 1;" onclick="closeCropper()">action.cancel</button>
|
||||
<button class="submit-button blah" style="flex: 1;" onclick="confirmCropper()">action.save</button>
|
||||
<button class="submit-button" style="background: rgba(255,255,255,0.1); color: var(--text-color); flex: 1;" onclick="closeCropper()">Cancel</button>
|
||||
<button class="submit-button" style="flex: 1;" onclick="confirmCropper()">Save</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -2598,18 +2598,8 @@ async function renderMessages(messages, isPrepend = false) {
|
|||
|
||||
let oldText = existingChild.querySelector('.chat-message-text');
|
||||
let newText = newChild.querySelector('.chat-message-text');
|
||||
if (oldText && newText) {
|
||||
if (oldText.innerHTML !== newText.innerHTML) {
|
||||
oldText.innerHTML = newText.innerHTML;
|
||||
}
|
||||
if (oldText.getAttribute('style') !== newText.getAttribute('style')) {
|
||||
let newStyle = newText.getAttribute('style');
|
||||
if (newStyle) {
|
||||
oldText.setAttribute('style', newStyle);
|
||||
} else {
|
||||
oldText.removeAttribute('style');
|
||||
}
|
||||
}
|
||||
if (oldText && newText && oldText.innerHTML !== newText.innerHTML) {
|
||||
oldText.innerHTML = newText.innerHTML;
|
||||
}
|
||||
|
||||
let oldReactions = existingChild.querySelector('.chat-message-reactions');
|
||||
|
|
@ -3228,7 +3218,7 @@ async function loadEmotes() {
|
|||
|
||||
reactionPickerMenuHtml = `
|
||||
<div style="display: flex; flex-direction: column; gap: 0.4rem; padding: 0.2rem; min-width: 14rem;">
|
||||
<input type="text" id="reaction-picker-search" placeholder="{blah(placeholder.type.text.emoji)}" oninput="filterReactions(this.value)" onkeydown="if(event.key === 'Enter') { if(this.value.trim() !== '') reactMessagePrompt(currentContextMenuMsgId, encodeURIComponent(this.value)); }" style="width: auto; align-self: stretch; margin: 0; box-sizing: border-box; padding: 0.5rem 0.6rem; border-radius: 0.65rem; border: var(--border-width) solid var(--light-border-color); background: transparent; color: var(--text-color); font-family: inherit;">
|
||||
<input type="text" id="reaction-picker-search" placeholder="Type text / emoji..." oninput="filterReactions(this.value)" onkeydown="if(event.key === 'Enter') { if(this.value.trim() !== '') reactMessagePrompt(currentContextMenuMsgId, encodeURIComponent(this.value)); }" style="width: auto; align-self: stretch; margin: 0; box-sizing: border-box; padding: 0.5rem 0.6rem; border-radius: 0.65rem; border: var(--border-width) solid var(--light-border-color); background: transparent; color: var(--text-color); font-family: inherit;">
|
||||
<div id="reaction-picker-grid" style="display: grid; grid-template-columns: repeat(5, 1fr); gap: 0.2rem; max-height: 12rem; overflow-y: auto; overflow-x: hidden;">
|
||||
${loadedEmotes.map(emoji => `<button onclick="reactMessagePrompt(currentContextMenuMsgId, encodeURIComponent('${emoji.char}'))" data-name="${emoji.name}" style="min-width: unset; width: 100%; aspect-ratio: 1; display: flex; justify-content: center; align-items: center; padding: 0; font-size: 1.2rem; border-radius: 0.65rem;" class="reaction-emoji-btn">${emoji.char}</button>`).join('')}
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -331,7 +331,7 @@ var profileSettings = `
|
|||
<img id="settings-avatar-preview" src="" style="width: 4.5rem; height: 4.5rem; border-radius: 0.8rem; border: var(--border-width) solid rgba(255, 255, 255, 0.2); object-fit: cover; background: var(--main-bg-color);">
|
||||
<div style="display: flex; flex-direction: column; align-items: flex-end; justify-content: space-between; padding: 0.1rem 0;">
|
||||
<div style="font-weight: bold;"><blah>title.avatar</blah></div>
|
||||
<button class="submit-button blah" style="margin: 0; padding: 0.5rem 1rem; width: auto;" onclick="document.getElementById('settings-avatar-input').click()">action.change.avatar</button>
|
||||
<button class="submit-button" style="margin: 0; padding: 0.5rem 1rem; width: auto;" onclick="document.getElementById('settings-avatar-input').click()">Change Avatar</button>
|
||||
<input type="file" id="settings-avatar-input" style="display: none;" accept="image/*" onchange="openCropper(this, 'avatar')">
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -342,7 +342,7 @@ var profileSettings = `
|
|||
</div>
|
||||
<div style="display: flex; flex-direction: column; align-items: flex-end; justify-content: space-between; padding: 0.1rem 0;">
|
||||
<div style="font-weight: bold;"><blah>title.banner</blah></div>
|
||||
<button class="submit-button blah" style="margin: 0; padding: 0.5rem 1rem; width: auto;" onclick="document.getElementById('settings-banner-input').click()">action.change.banner</button>
|
||||
<button class="submit-button" style="margin: 0; padding: 0.5rem 1rem; width: auto;" onclick="document.getElementById('settings-banner-input').click()">Change Banner</button>
|
||||
<input type="file" id="settings-banner-input" style="display: none;" accept="image/*" onchange="openCropper(this, 'banner')">
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue