add NavigationButton component, use in settings

This commit is contained in:
marlon-erler
2026-04-10 19:20:47 +00:00
parent 32c58ef041
commit 8ea35bafb2
4 changed files with 64 additions and 25 deletions
+23 -12
View File
@@ -6834,6 +6834,19 @@
); );
} }
// src/View/Components/navigationButton.tsx
function NavigationButton(coreViewModel2, label, navigationState, page, arrowMobileOnly) {
const isSelected = createProxyState(
[navigationState],
() => navigationState.value == page
);
function open() {
navigationState.value = page;
}
const iconClass = `icon ${arrowMobileOnly == true ? "mobile-only" : ""}`;
return /* @__PURE__ */ createElement("button", { "toggle:selected": isSelected, "on:click": open }, label, /* @__PURE__ */ createElement("span", { class: iconClass }, "arrow_forward"));
}
// src/View/Modals/settingsModal.tsx // src/View/Modals/settingsModal.tsx
function SettingsModal(coreViewModel2, settingsViewModel2) { function SettingsModal(coreViewModel2, settingsViewModel2) {
const detailView = createProxyState( const detailView = createProxyState(
@@ -6879,31 +6892,29 @@
} }
function SettingsLeftPane(coreViewModel2, settingsViewModel2) { function SettingsLeftPane(coreViewModel2, settingsViewModel2) {
return /* @__PURE__ */ createElement("div", { class: "flex-column gap slide-up" }, /* @__PURE__ */ createElement("h2", null, coreViewModel2.translations.homePage.settingsButton), SettingsPaneButton( return /* @__PURE__ */ createElement("div", { class: "flex-column gap slide-up" }, /* @__PURE__ */ createElement("h2", null, coreViewModel2.translations.homePage.settingsButton), SettingsPaneButton(
coreViewModel2,
settingsViewModel2, settingsViewModel2,
0 /* Appearance */, 0 /* Appearance */,
coreViewModel2.translations.settings.pages.appearance coreViewModel2.translations.settings.pages.appearance
), SettingsPaneButton( ), SettingsPaneButton(
coreViewModel2,
settingsViewModel2, settingsViewModel2,
1 /* Regional */, 1 /* Regional */,
coreViewModel2.translations.settings.pages.regional coreViewModel2.translations.settings.pages.regional
), SettingsPaneButton( ), SettingsPaneButton(
coreViewModel2,
settingsViewModel2, settingsViewModel2,
2 /* Info */, 2 /* Info */,
coreViewModel2.translations.settings.pages.info coreViewModel2.translations.settings.pages.info
)); ));
} }
function SettingsPaneButton(settingsViewModel2, page, label) { function SettingsPaneButton(coreViewModel2, settingsViewModel2, page, label) {
const isSelected = createProxyState( return NavigationButton(
[settingsViewModel2.selectedModalPage], coreViewModel2,
() => settingsViewModel2.selectedModalPage.value == page label,
); settingsViewModel2.selectedModalPage,
return /* @__PURE__ */ createElement( page,
"button", true
{
"toggle:selected": isSelected,
"on:click": () => settingsViewModel2.showModalPage(page)
},
label
); );
} }
function SettingsInfoPane(coreViewModel2, settingsViewModel2) { function SettingsInfoPane(coreViewModel2, settingsViewModel2) {
+29
View File
@@ -0,0 +1,29 @@
import * as React from "bloatless-react";
import CoreViewModel from "../../ViewModel/Global/coreViewModel";
export function NavigationButton<T>(
coreViewModel: CoreViewModel,
label: string,
navigationState: React.State<T | undefined>,
page: T,
arrowMobileOnly?: boolean,
) {
const isSelected = React.createProxyState(
[navigationState],
() => navigationState.value == page,
);
function open() {
navigationState.value = page;
}
const iconClass = `icon ${arrowMobileOnly == true ? "mobile-only" : ""}`;
return (
<button toggle:selected={isSelected} on:click={open}>
{label}
<span class={iconClass}>arrow_forward</span>
</button>
);
}
+1 -1
View File
@@ -34,7 +34,7 @@
} }
.split-modal[navigation] > div, .split-modal[navigation] > div,
.split-modal[navigation] > div > .scroll-area{ .split-modal[navigation] > div > .scroll-area {
justify-content: start; justify-content: start;
} }
+11 -12
View File
@@ -12,6 +12,7 @@ import { Languages, ThemeSettings } from "../../Model/Global/settingsModel";
import { OptionButtonList } from "../Components/optionButtonList"; import { OptionButtonList } from "../Components/optionButtonList";
import { stringify } from "../../Model/Utility/utility"; import { stringify } from "../../Model/Utility/utility";
import { PlaceholderView } from "../Components/placeholderView"; import { PlaceholderView } from "../Components/placeholderView";
import { NavigationButton } from "../Components/navigationButton";
export function SettingsModal( export function SettingsModal(
coreViewModel: CoreViewModel, coreViewModel: CoreViewModel,
@@ -76,16 +77,19 @@ function SettingsLeftPane(
<div class="flex-column gap slide-up"> <div class="flex-column gap slide-up">
<h2>{coreViewModel.translations.homePage.settingsButton}</h2> <h2>{coreViewModel.translations.homePage.settingsButton}</h2>
{SettingsPaneButton( {SettingsPaneButton(
coreViewModel,
settingsViewModel, settingsViewModel,
SettingsModalPages.Appearance, SettingsModalPages.Appearance,
coreViewModel.translations.settings.pages.appearance, coreViewModel.translations.settings.pages.appearance,
)} )}
{SettingsPaneButton( {SettingsPaneButton(
coreViewModel,
settingsViewModel, settingsViewModel,
SettingsModalPages.Regional, SettingsModalPages.Regional,
coreViewModel.translations.settings.pages.regional, coreViewModel.translations.settings.pages.regional,
)} )}
{SettingsPaneButton( {SettingsPaneButton(
coreViewModel,
settingsViewModel, settingsViewModel,
SettingsModalPages.Info, SettingsModalPages.Info,
coreViewModel.translations.settings.pages.info, coreViewModel.translations.settings.pages.info,
@@ -95,22 +99,17 @@ function SettingsLeftPane(
} }
function SettingsPaneButton( function SettingsPaneButton(
coreViewModel: CoreViewModel,
settingsViewModel: SettingsViewModel, settingsViewModel: SettingsViewModel,
page: SettingsModalPages, page: SettingsModalPages,
label: string, label: string,
) { ) {
const isSelected = React.createProxyState( return NavigationButton(
[settingsViewModel.selectedModalPage], coreViewModel,
() => settingsViewModel.selectedModalPage.value == page, label,
); settingsViewModel.selectedModalPage,
page,
return ( true
<button
toggle:selected={isSelected}
on:click={() => settingsViewModel.showModalPage(page)}
>
{label}
</button>
); );
} }