improve UI

This commit is contained in:
marlon-erler
2026-09-30 15:34:42 +02:00
parent 71b7983a1a
commit ec135e6d26
13 changed files with 203 additions and 168 deletions
+38 -39
View File
@@ -179,8 +179,6 @@ body[theme=black] * {
#background-wrapper { #background-wrapper {
position: fixed; position: fixed;
inset: 0px; inset: 0px;
transform: scale(1.2);
filter: blur(40px);
z-index: 1; z-index: 1;
pointer-events: none; pointer-events: none;
overflow: hidden; overflow: hidden;
@@ -189,18 +187,22 @@ body[theme=black] * {
main { main {
z-index: 2; z-index: 2;
} }
#background-wrapper div { #background-wrapper > div {
content: "";
position: absolute; position: absolute;
inset: 0px; inset: -100px;
z-index: -1; z-index: -1;
pointer-events: none; pointer-events: none;
opacity: .3;
}
#background-wrapper > div > div {
position: absolute;
inset: 0px;
filter: blur(80px);
} }
#background-wrapper #sky { #background-wrapper #sky {
left: -100%; left: -100%;
bottom: -50%; bottom: -50%;
background-image: radial-gradient(var(--sky-1), var(--sky-2)); background-image: radial-gradient(var(--sky-1), var(--sky-2));
opacity: 0.4;
} }
body { body {
transition: --sky-1 1s, --sky-2 5s; transition: --sky-1 1s, --sky-2 5s;
@@ -209,27 +211,25 @@ body {
--color-1: hsl(104.61, 100%, 46.85%); --color-1: hsl(104.61, 100%, 46.85%);
--color-2: hsl(37.43, 88.75%, 53.58%); --color-2: hsl(37.43, 88.75%, 53.58%);
filter: var(--backdrop-grass-filter); filter: var(--backdrop-grass-filter);
opacity: 0.3;
background-image: background-image:
linear-gradient( linear-gradient(
350deg, 350deg,
var(--color-1), var(--color-1),
var(--color-2) 30%, var(--color-2) 30%,
transparent 40%); transparent 50%);
} }
#background-wrapper #grass-2 { #background-wrapper #grass-2 {
--color-1: hsl(110, 60%, 40%); --color-1: hsl(110, 60%, 40%);
--color-2: hsl(110, 60%, 35%); --color-2: hsl(110, 60%, 35%);
filter: var(--backdrop-grass-filter); filter: var(--backdrop-grass-filter);
opacity: 0.3;
background-image: background-image:
linear-gradient( linear-gradient(
9deg, 9deg,
var(--color-1), var(--color-1),
var(--color-2) 30%, var(--color-2) 30%,
transparent 35%); transparent 45%);
} }
body[theme=dark] #background-wrapper { body[theme=dark] #background-wrapper > div {
opacity: 0.5; opacity: 0.5;
} }
body[theme=dark] #background-wrapper #sky { body[theme=dark] #background-wrapper #sky {
@@ -274,47 +274,51 @@ body[theme=dark] #background-wrapper #grass-2 {
transition: all calc(var(--animation-duration) / 2); transition: all calc(var(--animation-duration) / 2);
} }
body[keystroke-active] [ctkeystroke]::after { body[keystroke-active] [ctkeystroke]::after {
opacity: 1; opacity: .7;
transform: translateY(0px); transform: translateY(0px);
} }
/* src/View/homePage.css */ /* src/View/homePage.css */
#home-page {
overflow: auto;
padding: var(--content-padding);
min-width: unset;
max-width: 1000px;
}
#home-page > h1 {
font-size: 3rem;
font-family: IBM Plex Sans Thin;
}
#home-page > div { #home-page > div {
position: relative;
display: flex; display: flex;
flex-direction: row; flex-direction: row;
gap: var(--large-gap); flex-wrap: wrap;
scroll-snap-type: x mandatory;
scroll-behavior: smooth;
overflow: hidden;
overflow-x: scroll;
padding: 0px; padding: 0px;
height: auto;
overflow: visible;
} }
#home-page > div > div { #home-page > div > div {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: start; justify-content: start;
gap: var(--gap-between-tiles);
padding: var(--content-padding);
padding-top: calc(var(--header-height) + var(--content-margin));
width: 100%; width: 100%;
min-width: 100%; min-width: 100%;
height: 100%;
overflow-y: auto;
scroll-snap-align: center;
} }
#home-page #overview-section, #home-page #overview-section {
#home-page #chat-section { gap: var(--gap-between-tiles);
padding-bottom: calc(var(--content-padding) + var(--header-height) + var(--safe-area-bottom)); }
#home-page #chat-section > button {
margin-bottom: var(--gap-between-tiles);
} }
#home-page #chat-grid { #home-page #chat-grid {
margin-top: var(--content-padding);
display: grid; display: grid;
gap: var(--gap-between-tiles); gap: var(--gap-between-tiles);
grid-template-columns: repeat(auto-fill, minmax(12rem, 1fr)); grid-template-columns: repeat(auto-fill, minmax(12rem, 1fr));
} }
@media (min-width: 640px) { @media (min-width: 640px) {
#home-page > div { #home-page > div {
overflow-x: hidden; gap: var(--content-padding);
} }
#home-page #overview-section { #home-page #overview-section {
width: 20rem; width: 20rem;
@@ -325,18 +329,13 @@ body[keystroke-active] [ctkeystroke]::after {
min-width: unset; min-width: unset;
} }
} }
@media (min-width: 1200px) { @media (min-width: 1000px) {
#home-page #overview-section, #home-page > div {
#home-page #chat-section { gap: var(--large-gap);
padding-left: 3rem;
padding-right: 3rem;
} }
#home-page #chat-grid { #home-page > h1 {
margin-top: 3rem; padding-top: 3rem;
} padding-bottom: 1rem;
#home-page #overview-section {
width: var(--max-input-width);
min-width: var(--max-input-width);
} }
} }
+79 -87
View File
@@ -318,7 +318,7 @@
refreshButton: "Refresh", refreshButton: "Refresh",
saveButton: "Save", saveButton: "Save",
setButton: "Set", setButton: "Set",
filterOrCreateLabel: "Search or create", filterOrCreateLabel: (type) => `Search or create ${type}`,
createLabel: (query) => `Create "${query}"`, createLabel: (query) => `Create "${query}"`,
reloadAppButton: "Reload App", reloadAppButton: "Reload App",
fileVersionLabel: "Version", fileVersionLabel: "Version",
@@ -344,8 +344,8 @@
}, },
homePage: { homePage: {
appName: "Coordination Tool", appName: "Coordination Tool",
greeting: (name) => `Hi ${name}`,
/// ///
overviewHeadline: "Overview",
serverAddress: "Server address", serverAddress: "Server address",
serverAddressPlaceholder: "wss://192.168.0.69:3000", serverAddressPlaceholder: "wss://192.168.0.69:3000",
connectAudioLabel: "connect to server", connectAudioLabel: "connect to server",
@@ -355,11 +355,8 @@
manageStorageButton: "Manage storage", manageStorageButton: "Manage storage",
transferDataButton: "Transfer or export data", transferDataButton: "Transfer or export data",
updateButton: (version) => `Update to ${version}`, updateButton: (version) => `Update to ${version}`,
scrollToChatButton: "Chats",
/// ///
backToOverviewAudioLabel: "go back to overview", typeChat: "chat",
chatsHeadline: "Chats",
addChatAudioLabel: "name of new chat",
addChatPlaceholder: "Add chat", addChatPlaceholder: "Add chat",
addChatButton: "Add chat" addChatButton: "Add chat"
}, },
@@ -520,6 +517,7 @@
task: { task: {
noBoardSelected: "No board selected", noBoardSelected: "No board selected",
boardNotFound: "Board not found", boardNotFound: "Board not found",
typeBoard: "board",
/// ///
closeBoardButtonAudioLabel: "close board", closeBoardButtonAudioLabel: "close board",
toggleBoardButtonAudioLabel: "toggle board list", toggleBoardButtonAudioLabel: "toggle board list",
@@ -593,7 +591,7 @@
refreshButton: "Aktualisieren", refreshButton: "Aktualisieren",
saveButton: "Speichern", saveButton: "Speichern",
setButton: "OK", setButton: "OK",
filterOrCreateLabel: "Suchen oder erstellen", filterOrCreateLabel: (type) => `${type} suchen oder erstellen`,
createLabel: (query) => `"${query}" erstellen`, createLabel: (query) => `"${query}" erstellen`,
reloadAppButton: "Neu laden", reloadAppButton: "Neu laden",
fileVersionLabel: "Version", fileVersionLabel: "Version",
@@ -619,7 +617,7 @@
}, },
homePage: { homePage: {
appName: "Coordination Tool", appName: "Coordination Tool",
overviewHeadline: "\xDCbersicht", greeting: (name) => `Hi ${name}!`,
serverAddress: "Serveradresse", serverAddress: "Serveradresse",
serverAddressPlaceholder: "wss://192.168.0.69:3000", serverAddressPlaceholder: "wss://192.168.0.69:3000",
connectAudioLabel: "mit Server verbinden", connectAudioLabel: "mit Server verbinden",
@@ -629,10 +627,7 @@
manageStorageButton: "Daten verwalten", manageStorageButton: "Daten verwalten",
transferDataButton: "Daten \xFCbertragen", transferDataButton: "Daten \xFCbertragen",
updateButton: (version) => `Aktualisieren: ${version}`, updateButton: (version) => `Aktualisieren: ${version}`,
scrollToChatButton: "Chats", typeChat: "Chat",
backToOverviewAudioLabel: "zur\xFCck zur \xFCbersicht",
chatsHeadline: "Chats",
addChatAudioLabel: "Name des neuen Chats",
addChatPlaceholder: "Chat hinzuf\xFCgen", addChatPlaceholder: "Chat hinzuf\xFCgen",
addChatButton: "Chat hinzuf\xFCgen" addChatButton: "Chat hinzuf\xFCgen"
}, },
@@ -784,6 +779,7 @@
task: { task: {
noBoardSelected: "Kein Board ausgew\xE4hlt", noBoardSelected: "Kein Board ausgew\xE4hlt",
boardNotFound: "Board nicht gefunden", boardNotFound: "Board nicht gefunden",
typeBoard: "Board",
closeBoardButtonAudioLabel: "board schlie\xDFen", closeBoardButtonAudioLabel: "board schlie\xDFen",
toggleBoardButtonAudioLabel: "board-liste ein/ausblenden", toggleBoardButtonAudioLabel: "board-liste ein/ausblenden",
showBoardSettingsButtonAudioLabel: "Board-Einstellungen anzeigen", showBoardSettingsButtonAudioLabel: "Board-Einstellungen anzeigen",
@@ -847,7 +843,7 @@
refreshButton: "Actualizar", refreshButton: "Actualizar",
saveButton: "Guardar", saveButton: "Guardar",
setButton: "OK", setButton: "OK",
filterOrCreateLabel: "Buscar o crear", filterOrCreateLabel: (type) => `Buscar o crear ${type}`,
createLabel: (query) => `Crear "${query}"`, createLabel: (query) => `Crear "${query}"`,
reloadAppButton: "Recargar app", reloadAppButton: "Recargar app",
fileVersionLabel: "Versi\xF3n", fileVersionLabel: "Versi\xF3n",
@@ -873,7 +869,7 @@
}, },
homePage: { homePage: {
appName: "Coordination Tool", appName: "Coordination Tool",
overviewHeadline: "Resumen", greeting: (name) => `Hola ${name}!`,
serverAddress: "Direcci\xF3n del servidor", serverAddress: "Direcci\xF3n del servidor",
serverAddressPlaceholder: "wss://192.168.0.69:3000", serverAddressPlaceholder: "wss://192.168.0.69:3000",
connectAudioLabel: "conectar al servidor", connectAudioLabel: "conectar al servidor",
@@ -883,10 +879,7 @@
manageStorageButton: "Gestionar almacenamiento", manageStorageButton: "Gestionar almacenamiento",
transferDataButton: "Enviar o exportar archivos", transferDataButton: "Enviar o exportar archivos",
updateButton: (version) => `Actualizar a ${version}`, updateButton: (version) => `Actualizar a ${version}`,
scrollToChatButton: "Chats", typeChat: "chat",
backToOverviewAudioLabel: "volver al resumen",
chatsHeadline: "Chats",
addChatAudioLabel: "nombre del nuevo chat",
addChatPlaceholder: "A\xF1adir chat", addChatPlaceholder: "A\xF1adir chat",
addChatButton: "A\xF1adir chat" addChatButton: "A\xF1adir chat"
}, },
@@ -1038,6 +1031,7 @@
task: { task: {
noBoardSelected: "Ning\xFAn tablero seleccionado", noBoardSelected: "Ning\xFAn tablero seleccionado",
boardNotFound: "Tablero no encontrado", boardNotFound: "Tablero no encontrado",
typeBoard: "board",
closeBoardButtonAudioLabel: "cerrar tablero", closeBoardButtonAudioLabel: "cerrar tablero",
toggleBoardButtonAudioLabel: "mostrar o ocultar lista de tableros", toggleBoardButtonAudioLabel: "mostrar o ocultar lista de tableros",
showBoardSettingsButtonAudioLabel: "mostrar configuraci\xF3n del tablero", showBoardSettingsButtonAudioLabel: "mostrar configuraci\xF3n del tablero",
@@ -1441,12 +1435,21 @@
this.closeContext = (contextId, fromHistoryEvent = false) => { this.closeContext = (contextId, fromHistoryEvent = false) => {
if (!this.contexts.map((context) => context.contextId).includes(contextId)) if (!this.contexts.map((context) => context.contextId).includes(contextId))
return; return;
let exitNext = false;
while (this.contexts.length > 0) { while (this.contexts.length > 0) {
const currentContext = this.context; const currentContext = this.context;
if (!currentContext) return; if (!currentContext) return;
currentContext.handleContextClose(fromHistoryEvent); const response = currentContext.handleContextClose(fromHistoryEvent);
if (response == false) return;
this.contextStack.delete(currentContext.contextId); this.contextStack.delete(currentContext.contextId);
if (currentContext.contextId == contextId) break; if (response == true) {
exitNext = true;
continue;
} else if (exitNext == true) {
break;
} else if (currentContext.contextId == contextId) {
break;
}
} }
}; };
this.handleKeyDown = (e) => { this.handleKeyDown = (e) => {
@@ -2838,6 +2841,11 @@
}; };
this.loadData = () => { this.loadData = () => {
}; };
// context
this.handleContextClose = (fromHistoryEvent) => {
if (!fromHistoryEvent) return;
return true;
};
this.calendarModel = calendarModel; this.calendarModel = calendarModel;
this.boardsAndTasksModel = boardsAndTasksModel; this.boardsAndTasksModel = boardsAndTasksModel;
this.chatViewModel = chatViewModel; this.chatViewModel = chatViewModel;
@@ -4492,6 +4500,11 @@
this.updateBoardIndices(); this.updateBoardIndices();
this.openLastUsedBoard(); this.openLastUsedBoard();
}; };
// context
this.handleContextClose = (fromHistoryEvent) => {
if (!fromHistoryEvent) return;
return true;
};
this.loadData(); this.loadData();
this.chatViewModel = chatViewModel; this.chatViewModel = chatViewModel;
implementFilter( implementFilter(
@@ -4946,6 +4959,12 @@
if (Object.values(ReactionSymbols).includes(previousFilter)) if (Object.values(ReactionSymbols).includes(previousFilter))
this.setReactionFilter(previousFilter); this.setReactionFilter(previousFilter);
}; };
// context
this.handleContextClose = (fromHistoryEvent) => {
if (this.replyViewSelectedMessage.value == void 0 && fromHistoryEvent) return true;
this.resetReplyView();
return false;
};
this.restoreFilter(); this.restoreFilter();
this.cannotSendMessage = createProxyState( this.cannotSendMessage = createProxyState(
[ [
@@ -5231,22 +5250,23 @@
(chatViewModel) => chatViewModel.settingsPageViewModel.name.value (chatViewModel) => chatViewModel.settingsPageViewModel.name.value
); );
// state // state
this.newChatPrimaryChannel = new State(""); this.chatQuery = new State("");
this.chatViewModels = new ListState(); this.chatViewModels = new ListState();
this.chatMatches = new ListState();
this.selectedChat = new State( this.selectedChat = new State(
void 0 void 0
); );
// guards // guards
this.cannotCreateChat = createProxyState( this.cannotCreateChat = createProxyState(
[this.newChatPrimaryChannel], [this.chatQuery],
() => this.newChatPrimaryChannel.value == "" () => this.chatQuery.value == ""
); );
// methods // methods
this.createChat = () => { this.createChat = () => {
const chatModel = this.coreViewModel.chatListModel.createChat( const chatModel = this.coreViewModel.chatListModel.createChat(
this.newChatPrimaryChannel.value this.chatQuery.value
); );
this.newChatPrimaryChannel.value = ""; this.chatQuery.value = "";
const chatViewModel = this.createChatViewModel(chatModel); const chatViewModel = this.createChatViewModel(chatModel);
this.trackChat(chatViewModel); this.trackChat(chatViewModel);
this.updateIndices(); this.updateIndices();
@@ -5305,6 +5325,7 @@
this.settingsViewModel this.settingsViewModel
); );
this.loadChats(); this.loadChats();
implementFilter(this.chatViewModels, this.chatMatches, this.chatQuery, (chat) => chat.chatModel.info.name);
} }
}; };
@@ -5324,16 +5345,7 @@
// src/View/Components/homePageButton.tsx // src/View/Components/homePageButton.tsx
function HomePageButton(action, label, icon, key) { function HomePageButton(action, label, icon, key) {
return /* @__PURE__ */ createElement( return /* @__PURE__ */ createElement("button", { class: "tile flex-no", "on:click": action, ctkeystroke: key }, /* @__PURE__ */ createElement("span", { class: "icon" }, icon), /* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement("span", null, label)));
"button",
{
class: "tile flex-no",
"on:click": action,
ctkeystroke: key
},
/* @__PURE__ */ createElement("span", { class: "icon" }, icon),
/* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement("span", null, label))
);
} }
// src/View/Components/chatEntry.tsx // src/View/Components/chatEntry.tsx
@@ -5341,7 +5353,7 @@
const view = /* @__PURE__ */ createElement( const view = /* @__PURE__ */ createElement(
"button", "button",
{ {
class: "tile colored-tile chat-entry animate-highlight", class: "tile colored-tile chat-entry animate-highlight slide-up",
"set:color": chatViewModel.settingsPageViewModel.color, "set:color": chatViewModel.settingsPageViewModel.color,
style: "height: 8rem", style: "height: 8rem",
"on:click": chatViewModel.open, "on:click": chatViewModel.open,
@@ -5370,9 +5382,29 @@
return ChatEntry(chatViewModel); return ChatEntry(chatViewModel);
}; };
// src/View/Components/newItemEntry.tsx
function NewItemEntry(coreViewModel2, query, fn) {
const isHidden = createProxyState([query], () => query.value == "");
const label = createProxyState(
[query],
() => coreViewModel2.translations.general.createLabel(query.value)
);
return /* @__PURE__ */ createElement(
"button",
{
class: "standard slide-up",
"toggle:hidden": isHidden,
"on:click": fn
},
/* @__PURE__ */ createElement("span", { "subscribe:innerText": label }),
/* @__PURE__ */ createElement("span", { class: "icon" }, "add")
);
}
// src/View/homePage.tsx // src/View/homePage.tsx
function HomePage(coreViewModel2, storageViewModel2, settingsViewModel2, connectionViewModel2, fileTransferViewModel2, chatListViewModel2) { function HomePage(coreViewModel2, storageViewModel2, settingsViewModel2, connectionViewModel2, fileTransferViewModel2, chatListViewModel2) {
const overviewSection = /* @__PURE__ */ createElement("div", { id: "overview-section" }, /* @__PURE__ */ createElement("h2", null, coreViewModel2.translations.homePage.overviewHeadline), /* @__PURE__ */ createElement("label", { class: "tile flex-no" }, /* @__PURE__ */ createElement("span", { class: "icon" }, "cell_tower"), /* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement("span", null, coreViewModel2.translations.homePage.serverAddress), /* @__PURE__ */ createElement( const greeting = createProxyState([settingsViewModel2.username], () => coreViewModel2.translations.homePage.greeting(settingsViewModel2.username.value));
const overviewSection = /* @__PURE__ */ createElement("div", { id: "overview-section" }, /* @__PURE__ */ createElement("label", { class: "tile flex-no" }, /* @__PURE__ */ createElement("span", { class: "icon" }, "cell_tower"), /* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement("span", null, coreViewModel2.translations.homePage.serverAddress), /* @__PURE__ */ createElement(
"input", "input",
{ {
list: "previous-connection-list", list: "previous-connection-list",
@@ -5443,38 +5475,25 @@
}, },
/* @__PURE__ */ createElement("span", { "subscribe:innerText": coreViewModel2.updateText }), /* @__PURE__ */ createElement("span", { "subscribe:innerText": coreViewModel2.updateText }),
/* @__PURE__ */ createElement("span", { class: "icon" }, "update") /* @__PURE__ */ createElement("span", { class: "icon" }, "update")
), /* @__PURE__ */ createElement("div", { class: "mobile-only" }, /* @__PURE__ */ createElement("hr", null), /* @__PURE__ */ createElement("div", { class: "flex-row justify-end" }, /* @__PURE__ */ createElement("button", { class: "ghost width-50", "on:click": scrollToChat }, coreViewModel2.translations.homePage.scrollToChatButton, /* @__PURE__ */ createElement("span", { class: "icon" }, "arrow_forward"))))); ), /* @__PURE__ */ createElement("hr", { class: "mobile-only" }));
const chatSection = /* @__PURE__ */ createElement("div", { id: "chat-section" }, /* @__PURE__ */ createElement("h2", null, coreViewModel2.translations.homePage.chatsHeadline), /* @__PURE__ */ createElement("div", { class: "flex-row width-input" }, /* @__PURE__ */ createElement( const chatSection = /* @__PURE__ */ createElement("div", { id: "chat-section" }, /* @__PURE__ */ createElement("div", { class: "flex-row width-input" }, /* @__PURE__ */ createElement(
"input", "input",
{ {
placeholder: coreViewModel2.translations.homePage.addChatPlaceholder, placeholder: coreViewModel2.translations.general.filterOrCreateLabel(coreViewModel2.translations.homePage.typeChat),
"aria-label": coreViewModel2.translations.homePage.addChatAudioLabel, "bind:value": chatListViewModel2.chatQuery,
"bind:value": chatListViewModel2.newChatPrimaryChannel,
"on:enter": chatListViewModel2.createChat "on:enter": chatListViewModel2.createChat
} }
), /* @__PURE__ */ createElement( )), /* @__PURE__ */ createElement("hr", null), NewItemEntry(coreViewModel2, chatListViewModel2.chatQuery, chatListViewModel2.createChat), /* @__PURE__ */ createElement(
"button",
{
class: "primary",
"aria-label": coreViewModel2.translations.homePage.addChatButton,
"on:click": chatListViewModel2.createChat,
"toggle:disabled": chatListViewModel2.cannotCreateChat
},
/* @__PURE__ */ createElement("span", { class: "icon" }, "add")
)), /* @__PURE__ */ createElement(
"div", "div",
{ {
id: "chat-grid", id: "chat-grid",
"children:append": [ "children:append": [
chatListViewModel2.chatViewModels, chatListViewModel2.chatMatches,
ChatViewModelToChatEntry ChatViewModelToChatEntry
] ]
} }
)); ));
function scrollToChat() { return /* @__PURE__ */ createElement("article", { id: "home-page" }, /* @__PURE__ */ createElement("h1", { "subscribe:innerText": greeting }), /* @__PURE__ */ createElement("div", null, overviewSection, chatSection));
chatSection.scrollIntoView();
}
return /* @__PURE__ */ createElement("article", { id: "home-page" }, /* @__PURE__ */ createElement("div", null, overviewSection, chatSection));
} }
// src/View/Components/ribbonButton.tsx // src/View/Components/ribbonButton.tsx
@@ -6413,25 +6432,6 @@
return /* @__PURE__ */ createElement("div", { class: "width-100 height-100 flex-column justify-center align-center" }, /* @__PURE__ */ createElement("span", { class: "secondary slide-up" }, text)); return /* @__PURE__ */ createElement("div", { class: "width-100 height-100 flex-column justify-center align-center" }, /* @__PURE__ */ createElement("span", { class: "secondary slide-up" }, text));
} }
// src/View/Components/newItemEntry.tsx
function NewItemEntry(coreViewModel2, query, fn) {
const isHidden = createProxyState([query], () => query.value == "");
const label = createProxyState(
[query],
() => coreViewModel2.translations.general.createLabel(query.value)
);
return /* @__PURE__ */ createElement(
"button",
{
class: "standard slide-up",
"toggle:hidden": isHidden,
"on:click": fn
},
/* @__PURE__ */ createElement("span", { "subscribe:innerText": label }),
/* @__PURE__ */ createElement("span", { class: "icon" }, "add")
);
}
// src/View/Components/boardEntry.tsx // src/View/Components/boardEntry.tsx
function BoardEntry(boardViewModel) { function BoardEntry(boardViewModel) {
const view = /* @__PURE__ */ createElement( const view = /* @__PURE__ */ createElement(
@@ -6506,7 +6506,7 @@
class: "no-outline", class: "no-outline",
"bind:value": taskPageViewModel.boardQuery, "bind:value": taskPageViewModel.boardQuery,
"on:enter": taskPageViewModel.createBoard, "on:enter": taskPageViewModel.createBoard,
placeholder: coreViewModel2.translations.general.filterOrCreateLabel placeholder: coreViewModel2.translations.general.filterOrCreateLabel(coreViewModel2.translations.chatPage.task.typeBoard)
} }
))), /* @__PURE__ */ createElement("div", { class: "content gap" }, NewItemEntry( ))), /* @__PURE__ */ createElement("div", { class: "content gap" }, NewItemEntry(
coreViewModel2, coreViewModel2,
@@ -8018,15 +8018,7 @@
function toggle() { function toggle() {
isSelected.value = !isSelected.value; isSelected.value = !isSelected.value;
} }
return /* @__PURE__ */ createElement( return /* @__PURE__ */ createElement("button", { class: "tile", "toggle:selected": isSelected, "on:click": toggle }, /* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement("b", { class: "ellipsis" }, fileOption.label), /* @__PURE__ */ createElement("span", { class: "secondary ellipsis" }, StorageModel.pathComponentsToString(...fileOption.path))));
"button",
{
class: "tile",
"toggle:selected": isSelected,
"on:click": toggle
},
/* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement("b", { class: "ellipsis" }, fileOption.label), /* @__PURE__ */ createElement("span", { class: "secondary ellipsis" }, StorageModel.pathComponentsToString(...fileOption.path)))
);
} }
function DirectionSelectionModal(coreViewModel2, connectionViewModel2, fileTransferViewModel2) { function DirectionSelectionModal(coreViewModel2, connectionViewModel2, fileTransferViewModel2) {
const isPresented = createProxyState( const isPresented = createProxyState(
@@ -9116,7 +9108,7 @@
); );
}); });
document.body.append( document.body.append(
/* @__PURE__ */ createElement("div", { id: "background-wrapper" }, /* @__PURE__ */ createElement("div", { id: "sky" }), /* @__PURE__ */ createElement("div", { id: "grass-1" }), /* @__PURE__ */ createElement("div", { id: "grass-2" })) /* @__PURE__ */ createElement("div", { id: "background-wrapper" }, /* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement("div", { id: "sky" }), /* @__PURE__ */ createElement("div", { id: "grass-1" }), /* @__PURE__ */ createElement("div", { id: "grass-2" })))
); );
document.querySelector("main").append( document.querySelector("main").append(
HomePage( HomePage(
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "CT", "name": "CT",
"display": "fullscreen", "display": "standalone",
"theme_color": "black", "theme_color": "black",
"background_color": "black", "background_color": "black",
"icons": [ "icons": [
+12
View File
@@ -8,6 +8,7 @@ BASIC
outline: none; outline: none;
margin: 0px; margin: 0px;
padding: 0px; padding: 0px;
font-synthesis: none !important;
} }
html { html {
@@ -325,6 +326,12 @@ body {
TYPE TYPE
*/ */
@font-face {
font-family: IBM Plex Sans Thin;
src: url("Fonts/IBMPlexSans-Thin.ttf");
font-weight: thin;
}
@font-face { @font-face {
font-family: IBM Plex Sans; font-family: IBM Plex Sans;
src: url("Fonts/IBMPlexSans-Regular.ttf"); src: url("Fonts/IBMPlexSans-Regular.ttf");
@@ -494,6 +501,11 @@ textarea {
display: none !important; display: none !important;
} }
body > main {
align-items: safe center;
justify-content: safe center;
}
main, main,
.tile, .tile,
.tile > div { .tile > div {
Vendored
+1 -1
View File
@@ -1,4 +1,4 @@
const VERSION = "2610 Beta 20" const VERSION = "2610 Beta 21.9"
function processUrl(event) { function processUrl(event) {
const url = event.request.url; const url = event.request.url;
+1 -1
View File
@@ -1 +1 @@
2610 Beta 20 2610 Beta 21.9
+1 -1
View File
@@ -54,7 +54,7 @@ const englishTranslations = {
homePage: { homePage: {
appName: "Coordination Tool", appName: "Coordination Tool",
greeting: (name: string) => `Hi ${name}!`, greeting: (name: string) => `Hi ${name}`,
/// ///
+14 -3
View File
@@ -52,12 +52,23 @@ export default class CoreViewModel {
) )
return; return;
let exitNext: boolean = false;
while (this.contexts.length > 0) { while (this.contexts.length > 0) {
const currentContext: Context | undefined = this.context; const currentContext: Context | undefined = this.context;
if (!currentContext) return; if (!currentContext) return;
currentContext.handleContextClose(fromHistoryEvent); const response = currentContext.handleContextClose(fromHistoryEvent);
if (response == false) return;
this.contextStack.delete(currentContext.contextId); this.contextStack.delete(currentContext.contextId);
if (currentContext.contextId == contextId) break; if (response == true) {
exitNext = true;
continue;
} else if (exitNext == true) {
break
}
else if (currentContext.contextId == contextId) {
break;
}
} }
}; };
@@ -196,7 +207,7 @@ export class Context {
}; };
close = (): void => {}; close = (): void => {};
handleContextClose = (fromHistoryEvent: boolean): void => {}; handleContextClose = (fromHistoryEvent: boolean): void|boolean=> {};
registerKeyStroke = (key: string, fn: () => void): void => { registerKeyStroke = (key: string, fn: () => void): void => {
this.keystrokes.set(key, fn); this.keystrokes.set(key, fn);
@@ -219,6 +219,12 @@ export default class CalendarPageViewModel extends TaskContainingPageViewModel {
}; };
loadData = (): void => {}; loadData = (): void => {};
// context
handleContextClose = (fromHistoryEvent: boolean): void | boolean => {
if (!fromHistoryEvent) return;
return true;
}
// init // init
constructor( constructor(
@@ -196,6 +196,13 @@ export default class MessagePageViewModel extends Context {
this.setReactionFilter(previousFilter); this.setReactionFilter(previousFilter);
}; };
// context
handleContextClose = (fromHistoryEvent: boolean):boolean=> {
if (this.replyViewSelectedMessage.value == undefined && fromHistoryEvent) return true;
this.resetReplyView();
return false;
}
// init // init
constructor( constructor(
public readonly coreViewModel: CoreViewModel, public readonly coreViewModel: CoreViewModel,
+6
View File
@@ -165,6 +165,12 @@ export default class TaskPageViewModel extends ContextHost<string> {
this.updateBoardIndices(); this.updateBoardIndices();
this.openLastUsedBoard(); this.openLastUsedBoard();
}; };
// context
handleContextClose = (fromHistoryEvent: boolean): void | boolean => {
if (!fromHistoryEvent) return;
return true;
}
// init // init
constructor( constructor(
+14 -14
View File
@@ -9,9 +9,7 @@
/* Gradient */ /* Gradient */
#background-wrapper { #background-wrapper {
position: fixed; position: fixed;
inset: -80px; inset: 0px;
filter: blur(40px);
z-index: 1; z-index: 1;
pointer-events: none; pointer-events: none;
@@ -25,14 +23,20 @@ main {
z-index: 2; z-index: 2;
} }
#background-wrapper div { #background-wrapper > div {
content: "";
position: absolute; position: absolute;
inset: 0px; inset: -100px;
z-index: -1; z-index: -1;
pointer-events: none; pointer-events: none;
opacity: .3;
}
#background-wrapper > div > div {
position: absolute;
inset: 0px;
filter: blur(80px);
} }
#background-wrapper #sky { #background-wrapper #sky {
@@ -40,8 +44,6 @@ main {
bottom: -50%; bottom: -50%;
background-image: radial-gradient(var(--sky-1), var(--sky-2)); background-image: radial-gradient(var(--sky-1), var(--sky-2));
opacity: 0.4;
} }
body { body {
@@ -55,13 +57,12 @@ body {
--color-2: hsl(37.43, 88.75%, 53.58%); --color-2: hsl(37.43, 88.75%, 53.58%);
filter: var(--backdrop-grass-filter); filter: var(--backdrop-grass-filter);
opacity: 0.3;
background-image: linear-gradient( background-image: linear-gradient(
350deg, 350deg,
var(--color-1), var(--color-1),
var(--color-2) 30%, var(--color-2) 30%,
transparent 40% transparent 50%
); );
} }
@@ -70,17 +71,16 @@ body {
--color-2: hsl(110, 60%, 35%); --color-2: hsl(110, 60%, 35%);
filter: var(--backdrop-grass-filter); filter: var(--backdrop-grass-filter);
opacity: 0.3;
background-image: linear-gradient( background-image: linear-gradient(
9deg, 9deg,
var(--color-1), var(--color-1),
var(--color-2) 30%, var(--color-2) 30%,
transparent 35% transparent 45%
); );
} }
body[theme="dark"] #background-wrapper { body[theme="dark"] #background-wrapper > div {
opacity: 0.5; opacity: 0.5;
} }
+23 -21
View File
@@ -85,30 +85,32 @@ chatListViewModel.selectedChat.subscribe(() => {
document.body.append( document.body.append(
<div id="background-wrapper"> <div id="background-wrapper">
<div id="sky"></div> <div>
<div id="grass-1"></div> <div id="sky"></div>
<div id="grass-2"></div> <div id="grass-1"></div>
<div id="grass-2"></div>
</div>
</div>, </div>,
); );
document document
.querySelector("main")! .querySelector("main")!
.append( .append(
HomePage( HomePage(
coreViewModel, coreViewModel,
storageViewModel, storageViewModel,
settingsViewModel, settingsViewModel,
connectionViewModel, connectionViewModel,
fileTransferViewModel, fileTransferViewModel,
chatListViewModel, chatListViewModel,
), ),
ChatPageWrapper(coreViewModel, chatListViewModel), ChatPageWrapper(coreViewModel, chatListViewModel),
OnboardingModalWrapper(coreViewModel, onboardingViewModel), OnboardingModalWrapper(coreViewModel, onboardingViewModel),
ConnectionModal(coreViewModel, connectionViewModel), ConnectionModal(coreViewModel, connectionViewModel),
DataTransferModalWrapper( DataTransferModalWrapper(
coreViewModel, coreViewModel,
connectionViewModel, connectionViewModel,
fileTransferViewModel, fileTransferViewModel,
), ),
StorageModal(coreViewModel, storageViewModel), StorageModal(coreViewModel, storageViewModel),
SettingsModal(coreViewModel, settingsViewModel), SettingsModal(coreViewModel, settingsViewModel),
); );