+
{#each Object.keys(options) as opt}
{#if options[opt].visible}
@@ -50,9 +56,8 @@ A component to display tabbed menus.
style:background="none"
role="button"
>
- {#if options[opt].tab}
- {@const TabComponent = options[opt].tab?.component}
-
+ {#if options[opt].tab?.icon}
+ {@render options[opt].tab.icon(opt)}
{:else}
{opt}
{/if}
@@ -62,10 +67,10 @@ A component to display tabbed menus.
{/if}
-
+ {@render ActiveComponent?.(active, handleMenuaction)}
diff --git a/src/lib/components/TextAppearanceSelector.svelte b/src/lib/components/TextAppearanceSelector.svelte
index e4c7587b4..7376dd329 100644
--- a/src/lib/components/TextAppearanceSelector.svelte
+++ b/src/lib/components/TextAppearanceSelector.svelte
@@ -3,28 +3,21 @@
The navbar component. We have sliders that update reactively to both font size and line height.
3 buttons to change the style from normal, sepia and dark.
-->
-
-
-
-
-
-
-
diff --git a/src/lib/data/stores/collection.ts b/src/lib/data/stores/collection.ts
index 14bd64ce5..17cb7c85d 100644
--- a/src/lib/data/stores/collection.ts
+++ b/src/lib/data/stores/collection.ts
@@ -1,6 +1,6 @@
import { scriptureConfig } from '$assets/config';
import { get, writable } from 'svelte/store';
-import { LAYOUT_SINGLE, LAYOUT_TWO, LAYOUT_VERSE_BY_VERSE } from './view.js';
+import { Layout } from './view';
function findCollection(id: string): App.CollectionEntry | undefined {
const ds = scriptureConfig.bookCollections?.find((x) => x.id === id);
@@ -8,9 +8,8 @@ function findCollection(id: string): App.CollectionEntry | undefined {
ds && {
id: ds.languageCode + '_' + ds.id,
name: ds.collectionName,
- singlePane:
- ds.features['bc-allow-single-pane'] ??
- (ds.features['bc-layout-allow-single-pane'] as boolean),
+ singlePane: (ds.features['bc-allow-single-pane'] ??
+ ds.features['bc-layout-allow-single-pane']) as boolean,
description: ds.collectionDescription,
image: ds.collectionImage
}
@@ -63,20 +62,15 @@ function createSelectedLayouts() {
return {
subscribe: external.subscribe,
set: external.set,
- collections: (mode) => {
- let value;
+ collections: (mode: Layout) => {
switch (mode) {
- case LAYOUT_SINGLE:
- value = [get(external).singlePane];
- break;
- case LAYOUT_TWO:
- value = get(external).sideBySide;
- break;
- case LAYOUT_VERSE_BY_VERSE:
- value = get(external).verseByVerse;
- break;
+ case Layout.Single:
+ return [get(external).singlePane];
+ case Layout.Two:
+ return get(external).sideBySide;
+ case Layout.VerseByVerse:
+ return get(external).verseByVerse;
}
- return value;
},
reset: () => {
external.set(initCollections);
diff --git a/src/lib/data/stores/interface.ts b/src/lib/data/stores/interface.ts
index 3febf526d..45199c951 100644
--- a/src/lib/data/stores/interface.ts
+++ b/src/lib/data/stores/interface.ts
@@ -4,17 +4,20 @@ import { refs } from './scripture';
import { userSettings } from './setting';
export const direction = derived([refs, userSettings], ([$refs, $userSettings]) => {
- let direction = config.mainFeatures['settings-app-layout-direction']
- ? $userSettings['app-layout-direction']
- : config.mainFeatures['app-layout-direction'];
+ let direction = (
+ config.mainFeatures['settings-app-layout-direction']
+ ? $userSettings['app-layout-direction']
+ : config.mainFeatures['app-layout-direction']
+ ) as string;
if (direction === 'interface-language') {
- const code = $userSettings['interface-language'];
+ const code = $userSettings['interface-language'] as string;
if (code) {
- direction = config.interfaceLanguages?.writingSystems[code].textDirection;
+ direction = config.interfaceLanguages?.writingSystems[code].textDirection ?? direction;
}
} else if (direction === 'text') {
- direction = scriptureConfig.bookCollections?.find((x) => x.id === $refs.collection)?.style
- ?.textDirection;
+ direction =
+ scriptureConfig.bookCollections?.find((x) => x.id === $refs.collection)?.style
+ ?.textDirection ?? direction;
}
- return direction.toLowerCase();
+ return direction.toLowerCase() as 'ltr' | 'rtl';
});
diff --git a/src/lib/data/stores/localization.ts b/src/lib/data/stores/localization.ts
index 737a63ec7..d91b94bb7 100644
--- a/src/lib/data/stores/localization.ts
+++ b/src/lib/data/stores/localization.ts
@@ -6,12 +6,12 @@ import { userSettings } from './setting';
/** localization */
// If a word can't be translated in the current language, use languageDefault.
-export const languageDefault = config.translationMappings?.defaultLang;
+export const languageDefault = config.translationMappings?.defaultLang ?? '';
export const languages = getLanguages();
export const language = derived(
userSettings,
- ($userSettings) => $userSettings['interface-language'] ?? languageDefault
+ ($userSettings) => ($userSettings['interface-language'] as string) || languageDefault
);
export const t = derived(
diff --git a/src/lib/data/stores/reference.ts b/src/lib/data/stores/reference.ts
index 3dcfc0c53..c821c3143 100644
--- a/src/lib/data/stores/reference.ts
+++ b/src/lib/data/stores/reference.ts
@@ -3,12 +3,15 @@ import { NavigationContext } from '$lib/data/navigation';
import { derived, writable } from 'svelte/store';
import type { CatalogData } from '../catalogData';
-interface ReferenceStore {
+export interface Reference {
docSet: string;
- collection: string;
book: string;
chapter: string;
- verse: string;
+ verse?: string;
+}
+
+interface ReferenceStore extends Reference {
+ collection: string;
chapterVerses: string;
numVerses: number;
hasAudio: any;
@@ -49,7 +52,7 @@ export const referenceStore = () => {
localStorage.package = config.package;
};
- const set = async ({ docSet, book, chapter, verse }) => {
+ const set = async ({ docSet, book, chapter, verse }: Reference) => {
await nav.goto(docSet, book, chapter, verse);
update();
};
diff --git a/src/lib/data/stores/setting.ts b/src/lib/data/stores/setting.ts
index 2e80a01be..f8a2422a6 100644
--- a/src/lib/data/stores/setting.ts
+++ b/src/lib/data/stores/setting.ts
@@ -4,11 +4,14 @@ import { getDefaultLanguage } from '$lib/data/language';
import { mergeDefaultStorage, setDefaultStorage } from '$lib/data/stores/storage';
import { derived, readable, writable } from 'svelte/store';
-export const SETTINGS_CATEGORY_INTERFACE = 'Settings_Category_Interface';
-export const SETTINGS_CATEGORY_NAVIGATION = 'Settings_Category_Navigation';
-export const SETTINGS_CATEGORY_NOTIFICATIONS = 'Settings_Category_Notifications';
-export const SETTINGS_CATEGORY_AUDIO = 'Settings_Category_Audio';
-export const SETTINGS_CATEGORY_TEXT_DISPLAY = 'Settings_Category_Text_Display';
+export const SettingsCategory = {
+ Interface: 'Settings_Category_Interface',
+ Navigation: 'Settings_Category_Navigation',
+ Notifications: 'Settings_Category_Notifications',
+ Audio: 'Settings_Category_Audio',
+ TextDisplay: 'Settings_Category_Text_Display'
+} as const;
+export type SettingsCategory = (typeof SettingsCategory)[keyof typeof SettingsCategory];
setDefaultStorage('development', 'false');
export const development = readable(localStorage.development === 'true');
@@ -63,7 +66,7 @@ export const devPreferenceSettings = ((): Array
=> {
if (isSAB(config)) {
settings.push({
type: 'checkbox',
- category: SETTINGS_CATEGORY_INTERFACE,
+ category: SettingsCategory.Interface,
title: 'Scripture Logs',
key: 'scripture-logs'
});
@@ -81,7 +84,7 @@ export const userPreferenceSettings = ((): Array => {
// Verse Numbers
settings.push({
type: 'checkbox',
- category: SETTINGS_CATEGORY_TEXT_DISPLAY,
+ category: SettingsCategory.TextDisplay,
title: 'Settings_Verse_Numbers',
key: 'verse-numbers'
});
@@ -91,7 +94,7 @@ export const userPreferenceSettings = ((): Array => {
// Verse Layout
settings.push({
type: 'list',
- category: SETTINGS_CATEGORY_TEXT_DISPLAY,
+ category: SettingsCategory.TextDisplay,
title: 'Settings_Verse_Layout',
key: 'verse-layout',
entries: ['Settings_Verse_Layout_Paragraphs', 'Settings_Verse_Layout_One_Per_Line'],
@@ -103,7 +106,7 @@ export const userPreferenceSettings = ((): Array => {
// Show Border
settings.push({
type: 'checkbox',
- category: SETTINGS_CATEGORY_TEXT_DISPLAY,
+ category: SettingsCategory.TextDisplay,
title: 'Settings_Show_Border',
summary: 'Settings_Show_Border_Summary',
key: 'show-border'
@@ -114,7 +117,7 @@ export const userPreferenceSettings = ((): Array => {
// Red letters
settings.push({
type: 'checkbox',
- category: SETTINGS_CATEGORY_TEXT_DISPLAY,
+ category: SettingsCategory.TextDisplay,
title: 'Settings_Red_Letters',
summary: 'Settings_Red_Letters_Summary',
key: 'red-letters'
@@ -124,7 +127,7 @@ export const userPreferenceSettings = ((): Array => {
if (config.mainFeatures['settings-glossary-links'] && config.traits['has-glossary']) {
settings.push({
type: 'checkbox',
- category: SETTINGS_CATEGORY_TEXT_DISPLAY,
+ category: SettingsCategory.TextDisplay,
title: 'Settings_Glossary_Words',
key: 'glossary-words'
});
@@ -138,7 +141,7 @@ export const userPreferenceSettings = ((): Array => {
// Images in Bible Text
settings.push({
type: 'list',
- category: SETTINGS_CATEGORY_TEXT_DISPLAY,
+ category: SettingsCategory.TextDisplay,
title: 'Settings_Display_Images_In_Bible_Text',
key: 'display-images-in-bible-text',
entries: ['Settings_Display_Images_Normal', 'Settings_Display_Images_Hidden'],
@@ -153,7 +156,7 @@ export const userPreferenceSettings = ((): Array => {
// Videos in Bible Text
settings.push({
type: 'list',
- category: SETTINGS_CATEGORY_TEXT_DISPLAY,
+ category: SettingsCategory.TextDisplay,
title: 'Settings_Display_Videos_In_Bible_Text',
key: 'display-videos-in-bible-text',
entries: ['Settings_Display_Videos_Normal', 'Settings_Display_Videos_Hidden'],
@@ -169,7 +172,7 @@ export const userPreferenceSettings = ((): Array => {
// Synchronised phrase highlighting
settings.push({
type: 'checkbox',
- category: SETTINGS_CATEGORY_AUDIO,
+ category: SettingsCategory.Audio,
title: 'Settings_Audio_Highlight_Phrase',
summary: 'Settings_Audio_Highlight_Phrase_Summary',
key: 'audio-highlight-phrase'
@@ -180,7 +183,7 @@ export const userPreferenceSettings = ((): Array => {
// Playback speed
settings.push({
type: 'list',
- category: SETTINGS_CATEGORY_AUDIO,
+ category: SettingsCategory.Audio,
title: 'Settings_Audio_Speed',
key: 'audio-speed',
entries: [
@@ -205,7 +208,7 @@ export const userPreferenceSettings = ((): Array => {
if (config.mainFeatures['settings-audio-access-method'] && hasAudioSourceWithAccessModeChoice) {
settings.push({
type: 'list',
- category: SETTINGS_CATEGORY_AUDIO,
+ category: SettingsCategory.Audio,
title: 'Settings_Audio_Access_Method',
key: 'audio-access-method',
entries: [
@@ -223,7 +226,7 @@ export const userPreferenceSettings = ((): Array => {
if (config.mainFeatures['settings-audio-download-mode'] && hasAudioSourceWitbDownload) {
settings.push({
type: 'list',
- category: SETTINGS_CATEGORY_AUDIO,
+ category: SettingsCategory.Audio,
title: 'Settings_Audio_Download_Mode',
key: 'audio-auto-download',
entries: [
@@ -240,7 +243,7 @@ export const userPreferenceSettings = ((): Array => {
if (config.mainFeatures['settings-verse-of-the-day'] && hasVerses) {
settings.push({
type: 'checkbox',
- category: SETTINGS_CATEGORY_NOTIFICATIONS,
+ category: SettingsCategory.Notifications,
title: 'Settings_Verse_Of_The_Day',
key: 'verse-of-the-day'
});
@@ -250,7 +253,7 @@ export const userPreferenceSettings = ((): Array => {
// "Time for verse of the day
settings.push({
type: 'time',
- category: SETTINGS_CATEGORY_NOTIFICATIONS,
+ category: SettingsCategory.Notifications,
title: 'Settings_Verse_Of_The_Day_Time',
key: 'verse-of-the-day-time'
});
@@ -273,7 +276,7 @@ export const userPreferenceSettings = ((): Array => {
settings.push({
type: 'list',
- category: SETTINGS_CATEGORY_NOTIFICATIONS,
+ category: SettingsCategory.Notifications,
title: 'Settings_Verse_Of_The_Day_Book_Collection',
key: 'verse-of-the-day-book-collection',
defaultValue,
@@ -287,7 +290,7 @@ export const userPreferenceSettings = ((): Array => {
// "Daily reminder"
settings.push({
type: 'checkbox',
- category: SETTINGS_CATEGORY_NOTIFICATIONS,
+ category: SettingsCategory.Notifications,
title: 'Settings_Daily_Reminder',
key: 'daily-reminder'
});
@@ -297,7 +300,7 @@ export const userPreferenceSettings = ((): Array => {
// "Time for daily reminder"
settings.push({
type: 'time',
- category: SETTINGS_CATEGORY_NOTIFICATIONS,
+ category: SettingsCategory.Notifications,
title: 'Settings_Daily_Reminder_Time',
key: 'daily-reminder-time'
});
@@ -308,7 +311,7 @@ export const userPreferenceSettings = ((): Array => {
// Book Selection
settings.push({
type: 'list',
- category: SETTINGS_CATEGORY_NAVIGATION,
+ category: SettingsCategory.Navigation,
title: 'Settings_Book_Selection',
key: 'book-selection',
entries: ['Settings_Book_Selection_List', 'Settings_Book_Selection_Grid'],
@@ -320,7 +323,7 @@ export const userPreferenceSettings = ((): Array => {
// Verse Selector
settings.push({
type: 'checkbox',
- category: SETTINGS_CATEGORY_NAVIGATION,
+ category: SettingsCategory.Navigation,
title: 'Settings_Verse_Selection',
key: 'verse-selection'
});
@@ -333,7 +336,7 @@ export const userPreferenceSettings = ((): Array => {
// Keep Screen on
settings.push({
type: 'checkbox',
- category: SETTINGS_CATEGORY_INTERFACE,
+ category: SettingsCategory.Interface,
title: 'Settings_Keep_Screen_On',
key: 'keep-screen-on'
});
@@ -344,7 +347,7 @@ export const userPreferenceSettings = ((): Array => {
// Share app usage data
settings.push({
type: 'checkbox',
- category: SETTINGS_CATEGORY_INTERFACE,
+ category: SettingsCategory.Interface,
title: 'Settings_Share_Usage_Data',
key: 'share-usage-data'
});
@@ -362,7 +365,7 @@ export const userPreferenceSettings = ((): Array => {
settings.push({
type: 'list',
- category: SETTINGS_CATEGORY_INTERFACE,
+ category: SettingsCategory.Interface,
title: 'Settings_Interface_Language',
key: 'interface-language',
defaultValue: getDefaultLanguage(),
@@ -375,7 +378,7 @@ export const userPreferenceSettings = ((): Array => {
// App Layout Direction
settings.push({
type: 'list',
- category: SETTINGS_CATEGORY_INTERFACE,
+ category: SettingsCategory.Interface,
title: 'Settings_Layout_Direction',
key: 'app-layout-direction',
entries: [
@@ -401,7 +404,7 @@ function defaultUserSettings() {
);
}
mergeDefaultStorage('userSettings', defaultUserSettings());
-export const userSettings = writable(JSON.parse(localStorage.userSettings));
+export const userSettings = writable(JSON.parse(localStorage.userSettings) as FeatureConfig);
userSettings.subscribe((value) => (localStorage.userSettings = JSON.stringify(value)));
export const userSettingsOrDefault = derived(userSettings, ($userSettings) => {
diff --git a/src/lib/data/stores/theme.ts b/src/lib/data/stores/theme.ts
index a26c101ee..83164292e 100644
--- a/src/lib/data/stores/theme.ts
+++ b/src/lib/data/stores/theme.ts
@@ -37,10 +37,12 @@ const resolveColor = (colorValue: string, colors: Record) => {
};
// Convert style to string format for inline styling
-export const convertStyle = (style: Record) => {
+export const convertStyle = (style?: Record) => {
let result = '';
- for (const x in style) {
- result += `${x}:${style[x]};`;
+ if (style) {
+ for (const x in style) {
+ result += `${x}:${style[x]};`;
+ }
}
return result;
};
diff --git a/src/lib/data/stores/view.ts b/src/lib/data/stores/view.ts
index d6a34c898..749fcf817 100644
--- a/src/lib/data/stores/view.ts
+++ b/src/lib/data/stores/view.ts
@@ -15,12 +15,15 @@ export const isFirstLaunch = derived(
);
/**the current view/layout mode*/
-export const LAYOUT_SINGLE = 'single';
-export const LAYOUT_TWO = 'two';
-export const LAYOUT_VERSE_BY_VERSE = 'verse-by-verse';
+export const Layout = {
+ Single: 'single',
+ Two: 'two',
+ VerseByVerse: 'verse-by-verse'
+} as const;
+export type Layout = (typeof Layout)[keyof typeof Layout];
-const singleLayout = { mode: LAYOUT_SINGLE, auxDocSets: [] };
-export const layout = writable(singleLayout);
+const singleLayout = { mode: Layout.Single, auxDocSets: [] };
+export const layout = writable<{ mode: Layout; auxDocSets?: string[] }>(singleLayout);
export const ModalType = {
Collection: 'collection',
@@ -89,16 +92,16 @@ export const windowSize = createWindowSizeStore();
export const mainScroll = writable({ top: 0, height: 0 });
/**Font size of body elements */
setDefaultStorage('bodyFontSize', '17');
-export const bodyFontSize = writable(localStorage.bodyFontSize);
+export const bodyFontSize = writable(Number(localStorage.bodyFontSize));
bodyFontSize.subscribe((fontSize) => (localStorage.bodyFontSize = fontSize));
/**line height of body elements */
setDefaultStorage('bodyLineHeight', '175');
-export const bodyLineHeight = writable(localStorage.bodyLineHeight);
+export const bodyLineHeight = writable(Number(localStorage.bodyLineHeight));
bodyLineHeight.subscribe((lineHeight) => (localStorage.bodyLineHeight = lineHeight));
/**Font size of contents elements */
setDefaultStorage('contentsFontSize', '17');
-export const contentsFontSize = writable(localStorage.contentsFontSize);
+export const contentsFontSize = writable(Number(localStorage.contentsFontSize));
contentsFontSize.subscribe((fontSize) => (localStorage.contentsFontSize = fontSize));
export const showDesktopSidebar = derived(
@@ -136,4 +139,4 @@ function createStackStore() {
};
}
-export const contentsStack = createStackStore();
+export const contentsStack = createStackStore();
diff --git a/src/lib/navigate/index.ts b/src/lib/navigate/index.ts
index 85f8b0dfd..afba3f217 100644
--- a/src/lib/navigate/index.ts
+++ b/src/lib/navigate/index.ts
@@ -28,22 +28,22 @@ export function navigateToUrl(item: { collection: string; book: string; url: str
export async function navigateToText(item: {
docSet?: string;
collection?: string;
- book: string;
- chapter: string;
+ book?: string;
+ chapter?: string;
verse?: string;
}) {
- playStop();
- await refs.set({
- docSet: item.docSet,
- book: item.book,
- chapter: item.chapter,
- verse: item.verse
- });
- addHistory(
- { collection: item.collection, book: item.book, chapter: item.chapter, verse: item.verse },
- logHistoryItemAdded
- );
- gotoRoute(`/text`);
+ const { docSet, collection, book, chapter, verse } = item;
+ if (docSet && collection && book && chapter) {
+ playStop();
+ await refs.set({
+ docSet,
+ book,
+ chapter,
+ verse
+ });
+ addHistory({ collection, book, chapter, verse }, logHistoryItemAdded);
+ gotoRoute(`/text`);
+ }
}
export async function navigateToTextReference(reference: string) {
diff --git a/src/lib/scripts/configUtils.ts b/src/lib/scripts/configUtils.ts
index bda239ccd..8ccb989e2 100644
--- a/src/lib/scripts/configUtils.ts
+++ b/src/lib/scripts/configUtils.ts
@@ -44,7 +44,7 @@ export function getFeatureValueString(feature: string, bc: string, book: string)
if (bookCollectionFeatures != null) {
const bookCollectionFeature = bookCollectionFeatures[feature];
if (bookCollectionFeature != null && bookCollectionFeature != 'inherit') {
- value = bookCollectionFeatures[feature];
+ value = bookCollectionFeatures[feature] as string;
}
}
const bookFeatures = scriptureConfig.bookCollections
diff --git a/src/lib/scripts/numeralSystem.ts b/src/lib/scripts/numeralSystem.ts
index 35e026622..3e9a6bf50 100644
--- a/src/lib/scripts/numeralSystem.ts
+++ b/src/lib/scripts/numeralSystem.ts
@@ -71,7 +71,7 @@ export function formatNumberRange(system: NumeralSystem, value: string, directio
: `${formattedFirst}${separator}${formattedSecond}`;
}
-export function formatNumber(system: NumeralSystem, value: string): any {
+export function formatNumber(system: NumeralSystem, value: string): string {
let fmt = '';
for (let i = 0; i < value.length; i++) {
const digit = Number(value.charAt(i));
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte
index 3bb890f1e..7a28f27e9 100644
--- a/src/routes/+layout.svelte
+++ b/src/routes/+layout.svelte
@@ -66,26 +66,28 @@
$modal.forEach(({ modalType, data }) => {
switch (modalType) {
case ModalType.Collection:
- collectionSelector.showModal();
+ collectionSelector?.showModal();
break;
case ModalType.Note:
- noteDialog?.showModal(
- data as Parameters<(typeof noteDialog)['showModal']>[0]
- );
+ noteDialog?.showModal(data as Parameters[0]);
break;
case ModalType.TextAppearance:
- textAppearanceSelector.options = data;
- textAppearanceSelector.showModal();
+ if (textAppearanceSelector) {
+ textAppearanceSelector.setOptions(
+ data as Parameters[0]
+ );
+ textAppearanceSelector.showModal();
+ }
break;
case ModalType.Font:
- fontSelector.showModal();
+ fontSelector?.showModal();
break;
case ModalType.StopPlan:
planStopId = data as string;
planStopDialog?.showModal();
break;
case ModalType.PlaybackSpeed:
- audioPlaybackSpeed.showModal();
+ audioPlaybackSpeed?.showModal();
break;
}
});
@@ -103,13 +105,13 @@
}
});
- let textAppearanceSelector: TextAppearanceSelector = $state();
- let collectionSelector: CollectionSelector = $state();
- let fontSelector: FontSelector = $state();
+ let textAppearanceSelector: TextAppearanceSelector | undefined = $state();
+ let collectionSelector: CollectionSelector | undefined = $state();
+ let fontSelector: FontSelector | undefined = $state();
let noteDialog: NoteDialog | undefined = $state();
let planStopDialog: PlanStopDialog | undefined = $state(undefined);
let planStopId: string = $state('');
- let audioPlaybackSpeed: AudioPlaybackSpeed = $state();
+ let audioPlaybackSpeed: AudioPlaybackSpeed | undefined = $state();
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte
index 56f4eea70..d77f05d03 100644
--- a/src/routes/+page.svelte
+++ b/src/routes/+page.svelte
@@ -1,4 +1,4 @@
-
[code, Array.from(alpha.keys())])
+ reversals.entries().map(([code, alpha]) => [code, Array.from(alpha?.keys() ?? [])])
),
vernacular: vernacularAlphabet
- };
+ });
- let selectedLetter = alphabets.vernacular[0];
+ let selectedLetter = $derived(alphabets.vernacular?.[0]);
let scrollContainer: HTMLDivElement | undefined = $state(undefined);
//$: selectedLanguage = currentReversal.selectedLanguage;
@@ -45,7 +45,9 @@
currentReversal.languageId = vernacularLanguageId.value;
});
- const validReversal = $derived(reversals.has(currentReversal.languageId));
+ const validReversal = $derived(
+ !!currentReversal.languageId && reversals.has(currentReversal.languageId)
+ );
async function scrollToLetter(letter: string) {
await tick();
@@ -68,7 +70,7 @@
function switchLanguage(language: string) {
currentReversal.languageId = language;
- selectedLetter = currentAlphabet[0];
+ selectedLetter = currentAlphabet?.[0];
const scrollableDiv = document.querySelector('.flex-1.overflow-y-auto.bg-base-100');
if (scrollableDiv) {
scrollableDiv.scrollTop = 0;
@@ -90,16 +92,16 @@
const threshold = 100;
if (div.scrollHeight - div.scrollTop - div.clientHeight < threshold) {
- const currentIndex = currentAlphabet.indexOf(selectedLetter);
- if (!currentReversal.letters.has(currentAlphabet[currentIndex + 1])) {
- if (currentIndex < currentAlphabet.length - 1) {
+ const currentIndex = currentAlphabet?.indexOf(selectedLetter ?? '') ?? -1;
+ if (!currentReversal.letters.has(currentAlphabet?.[currentIndex + 1] ?? '')) {
+ if (currentIndex < (currentAlphabet?.length ?? 0) - 1) {
isFetching = true;
isFetching = false;
}
}
} else if (
- (validReversal && currentReversal.letters.has(selectedLetter)) ||
+ (validReversal && currentReversal.letters.has(selectedLetter ?? '')) ||
currentReversal.languageId === vernacularLanguageId.value
) {
const allLetters = div.querySelectorAll('[id^="letter-"]');
@@ -120,7 +122,9 @@
}
let currentAlphabet = $derived(
- validReversal ? alphabets.reversal[currentReversal.languageId] : alphabets.vernacular
+ validReversal && currentReversal.languageId
+ ? alphabets.reversal[currentReversal.languageId]
+ : alphabets.vernacular
);
onMount(() => {
@@ -136,7 +140,7 @@
{:else}
{@const tabs = [vernacularLanguageId.value, ...reversals.keys()]}
- {@const indexOfPrevious = tabs.indexOf(previousLanguage)}
+ {@const indexOfPrevious = previousLanguage ? tabs.indexOf(previousLanguage) : 0}
{#each tabs as lang, i}
w.length)}
onclick={() => handleLetterChange(letter)}
>
diff --git a/src/routes/notes/edit/[noteid]/+page.svelte b/src/routes/notes/edit/[noteid]/+page.svelte
index 13baf68de..62f5c58c9 100644
--- a/src/routes/notes/edit/[noteid]/+page.svelte
+++ b/src/routes/notes/edit/[noteid]/+page.svelte
@@ -1,30 +1,36 @@
-
-
+
{#snippet center()}
diff --git a/src/routes/plans/+page.svelte b/src/routes/plans/+page.svelte
index 7f7a156bd..895415064 100644
--- a/src/routes/plans/+page.svelte
+++ b/src/routes/plans/+page.svelte
@@ -1,5 +1,6 @@
-