generated from tpl/obsidian-sample-plugin
			Fix text not having fixed width and fix books having wrong title
This commit is contained in:
		
							parent
							
								
									18aa687647
								
							
						
					
					
						commit
						a1956078d8
					
				| 
						 | 
					@ -15,12 +15,13 @@
 | 
				
			||||||
		setSettingsContext,
 | 
							setSettingsContext,
 | 
				
			||||||
	} from "@ui/stores/settings.svelte";
 | 
						} from "@ui/stores/settings.svelte";
 | 
				
			||||||
	import { COLOR_NAMES, type ColorName } from "@utils/color";
 | 
						import { COLOR_NAMES, type ColorName } from "@utils/color";
 | 
				
			||||||
	import { randomElement, randomFloat, randomInt } from "@utils/rand";
 | 
						import { randomElement, randomFloat } from "@utils/rand";
 | 
				
			||||||
	import { onDestroy } from "svelte";
 | 
						import { onDestroy } from "svelte";
 | 
				
			||||||
	import { ShelfSettingsSchema } from "./ShelfCodeBlock";
 | 
						import { ShelfSettingsSchema } from "./ShelfCodeBlock";
 | 
				
			||||||
	import { parseYaml, TFile } from "obsidian";
 | 
						import { getLinkpath, parseYaml, TFile } from "obsidian";
 | 
				
			||||||
	import DateFilter from "@ui/components/DateFilter.svelte";
 | 
						import DateFilter from "@ui/components/DateFilter.svelte";
 | 
				
			||||||
	import Rating from "@ui/components/Rating.svelte";
 | 
						import Rating from "@ui/components/Rating.svelte";
 | 
				
			||||||
 | 
						import { v4 as uuidv4 } from "uuid";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	interface Props {
 | 
						interface Props {
 | 
				
			||||||
		plugin: BookTrackerPlugin;
 | 
							plugin: BookTrackerPlugin;
 | 
				
			||||||
| 
						 | 
					@ -28,6 +29,7 @@
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	interface BookData {
 | 
						interface BookData {
 | 
				
			||||||
 | 
							id: string;
 | 
				
			||||||
		title: string;
 | 
							title: string;
 | 
				
			||||||
		subtitle?: string;
 | 
							subtitle?: string;
 | 
				
			||||||
		author: string;
 | 
							author: string;
 | 
				
			||||||
| 
						 | 
					@ -38,6 +40,11 @@
 | 
				
			||||||
		file: TFile;
 | 
							file: TFile;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						interface BookStackData {
 | 
				
			||||||
 | 
							id: string;
 | 
				
			||||||
 | 
							books: BookData[];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const { plugin, source }: Props = $props();
 | 
						const { plugin, source }: Props = $props();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	const settings = ShelfSettingsSchema.parse(parseYaml(source));
 | 
						const settings = ShelfSettingsSchema.parse(parseYaml(source));
 | 
				
			||||||
| 
						 | 
					@ -71,13 +78,13 @@
 | 
				
			||||||
	const randomStackChance = () => randomFloat() > 0.9;
 | 
						const randomStackChance = () => randomFloat() > 0.9;
 | 
				
			||||||
	function randomStackSize() {
 | 
						function randomStackSize() {
 | 
				
			||||||
		const n = randomFloat();
 | 
							const n = randomFloat();
 | 
				
			||||||
		if (n < 0.2) {
 | 
							if (n < 0.15) {
 | 
				
			||||||
			return 5;
 | 
								return 5;
 | 
				
			||||||
		} else if (n < 0.5) {
 | 
							} else if (n < 0.3) {
 | 
				
			||||||
			return 4;
 | 
								return 4;
 | 
				
			||||||
		} else if (n < 0.8) {
 | 
							} else if (n < 0.5) {
 | 
				
			||||||
			return 3;
 | 
								return 3;
 | 
				
			||||||
		} else if (n < 0.98) {
 | 
							} else if (n < 0.8) {
 | 
				
			||||||
			return 2;
 | 
								return 2;
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			return 1;
 | 
								return 1;
 | 
				
			||||||
| 
						 | 
					@ -86,6 +93,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	function getBookData(metadata: FileMetadata): BookData {
 | 
						function getBookData(metadata: FileMetadata): BookData {
 | 
				
			||||||
		return {
 | 
							return {
 | 
				
			||||||
 | 
								id: metadata.file.path,
 | 
				
			||||||
			title: metadata.frontmatter[settings.titleProperty],
 | 
								title: metadata.frontmatter[settings.titleProperty],
 | 
				
			||||||
			subtitle: settings.subtitleProperty
 | 
								subtitle: settings.subtitleProperty
 | 
				
			||||||
				? metadata.frontmatter[settings.subtitleProperty]
 | 
									? metadata.frontmatter[settings.subtitleProperty]
 | 
				
			||||||
| 
						 | 
					@ -102,29 +110,29 @@
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	let view = $state(settings.defaultView);
 | 
						let view = $state(settings.defaultView);
 | 
				
			||||||
	const books = $derived.by(() => {
 | 
						let books: (BookData | BookStackData)[] = $state([]);
 | 
				
			||||||
		let books: (BookData | BookData[])[] = [];
 | 
					
 | 
				
			||||||
 | 
						$effect(() => {
 | 
				
			||||||
 | 
							let newBooks: (BookData | BookStackData)[] = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for (let i = 0; i < metadataStore.metadata.length; i++) {
 | 
							for (let i = 0; i < metadataStore.metadata.length; i++) {
 | 
				
			||||||
			if (randomStackChance()) {
 | 
								if (randomStackChance()) {
 | 
				
			||||||
				const booksRemaining = metadataStore.metadata.length - i;
 | 
									const booksRemaining = metadataStore.metadata.length - i;
 | 
				
			||||||
				const stackSize = randomInt(
 | 
									const stackSize = Math.min(booksRemaining, randomStackSize());
 | 
				
			||||||
					1,
 | 
					 | 
				
			||||||
					Math.min(booksRemaining, randomStackSize()),
 | 
					 | 
				
			||||||
				);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
				books.push(
 | 
									newBooks.push({
 | 
				
			||||||
					metadataStore.metadata
 | 
										id: uuidv4(),
 | 
				
			||||||
 | 
										books: metadataStore.metadata
 | 
				
			||||||
						.slice(i, i + stackSize)
 | 
											.slice(i, i + stackSize)
 | 
				
			||||||
						.map(getBookData),
 | 
											.map(getBookData),
 | 
				
			||||||
				);
 | 
									});
 | 
				
			||||||
				i += stackSize - 1;
 | 
									i += stackSize - 1;
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
				books.push(getBookData(metadataStore.metadata[i]));
 | 
									newBooks.push(getBookData(metadataStore.metadata[i]));
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		return books;
 | 
							books = newBooks;
 | 
				
			||||||
	});
 | 
						});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	onDestroy(() => metadataStore.destroy());
 | 
						onDestroy(() => metadataStore.destroy());
 | 
				
			||||||
| 
						 | 
					@ -146,21 +154,19 @@
 | 
				
			||||||
	</div>
 | 
						</div>
 | 
				
			||||||
	{#if view === "bookshelf"}
 | 
						{#if view === "bookshelf"}
 | 
				
			||||||
		<Bookshelf>
 | 
							<Bookshelf>
 | 
				
			||||||
			{#each books as book}
 | 
								{#each books as book (book.id)}
 | 
				
			||||||
				{#if Array.isArray(book)}
 | 
									{#if "books" in book}
 | 
				
			||||||
					<BookStack totalChildren={book.length}>
 | 
										<BookStack totalChildren={book.books.length}>
 | 
				
			||||||
						{#each book as bookData}
 | 
											{#each book.books as bookData (bookData.id)}
 | 
				
			||||||
							<BookStackElement
 | 
												<BookStackElement
 | 
				
			||||||
								title={bookData.title}
 | 
													title={bookData.title}
 | 
				
			||||||
								subtitle={bookData.subtitle}
 | 
													subtitle={bookData.subtitle}
 | 
				
			||||||
								color={bookData.color}
 | 
													color={bookData.color}
 | 
				
			||||||
								design={bookData.design}
 | 
													design={bookData.design}
 | 
				
			||||||
								onClick={() =>
 | 
													onClick={() =>
 | 
				
			||||||
									plugin.app.workspace.openLinkText(
 | 
														plugin.app.workspace
 | 
				
			||||||
										bookData.file.path,
 | 
															.getLeaf("tab")
 | 
				
			||||||
										"",
 | 
															.openFile(bookData.file)}
 | 
				
			||||||
										true,
 | 
					 | 
				
			||||||
									)}
 | 
					 | 
				
			||||||
							/>
 | 
												/>
 | 
				
			||||||
						{/each}
 | 
											{/each}
 | 
				
			||||||
					</BookStack>
 | 
										</BookStack>
 | 
				
			||||||
| 
						 | 
					@ -174,11 +180,9 @@
 | 
				
			||||||
						design={book.design}
 | 
											design={book.design}
 | 
				
			||||||
						orientation={book.orientation}
 | 
											orientation={book.orientation}
 | 
				
			||||||
						onClick={() =>
 | 
											onClick={() =>
 | 
				
			||||||
							plugin.app.workspace.openLinkText(
 | 
												plugin.app.workspace
 | 
				
			||||||
								book.file.path,
 | 
													.getLeaf("tab")
 | 
				
			||||||
								"",
 | 
													.openFile(book.file)}
 | 
				
			||||||
								true,
 | 
					 | 
				
			||||||
							)}
 | 
					 | 
				
			||||||
					/>
 | 
										/>
 | 
				
			||||||
				{/if}
 | 
									{/if}
 | 
				
			||||||
			{/each}
 | 
								{/each}
 | 
				
			||||||
| 
						 | 
					@ -221,7 +225,11 @@
 | 
				
			||||||
								width="50"
 | 
													width="50"
 | 
				
			||||||
							/>
 | 
												/>
 | 
				
			||||||
						</td>
 | 
											</td>
 | 
				
			||||||
						<td>{book.frontmatter[settings.titleProperty]}</td>
 | 
											<td>
 | 
				
			||||||
 | 
												<a href={getLinkpath(book.file.path)}>
 | 
				
			||||||
 | 
													{book.frontmatter[settings.titleProperty]}
 | 
				
			||||||
 | 
												</a>
 | 
				
			||||||
 | 
											</td>
 | 
				
			||||||
						<td>
 | 
											<td>
 | 
				
			||||||
							{book.frontmatter[settings.authorsProperty].join(
 | 
												{book.frontmatter[settings.authorsProperty].join(
 | 
				
			||||||
								", ",
 | 
													", ",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -151,7 +151,8 @@
 | 
				
			||||||
				z-index: 2;
 | 
									z-index: 2;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			:global(.bookshelf__book-content) {
 | 
								:global(.bookshelf__book-content),
 | 
				
			||||||
 | 
								:global(.fit-text) {
 | 
				
			||||||
				height: calc(var(--book-width));
 | 
									height: calc(var(--book-width));
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -167,8 +168,12 @@
 | 
				
			||||||
				top: 26px;
 | 
									top: 26px;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			:global(.bookshelf__book-content) {
 | 
								:global(.bookshelf__book-content),
 | 
				
			||||||
 | 
								:global(.fit-text) {
 | 
				
			||||||
				width: calc(200px - 61px) !important;
 | 
									width: calc(200px - 61px) !important;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								:global(.bookshelf__book-content) {
 | 
				
			||||||
				margin: 40px var(--book-width);
 | 
									margin: 40px var(--book-width);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -187,8 +192,12 @@
 | 
				
			||||||
				bottom: 10px;
 | 
									bottom: 10px;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			:global(.bookshelf__book-content) {
 | 
								:global(.bookshelf__book-content),
 | 
				
			||||||
 | 
								:global(.fit-text) {
 | 
				
			||||||
				width: calc(200px - 62px) !important;
 | 
									width: calc(200px - 62px) !important;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								:global(.bookshelf__book-content) {
 | 
				
			||||||
				margin: 30px var(--book-width);
 | 
									margin: 30px var(--book-width);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -107,8 +107,12 @@
 | 
				
			||||||
				right: 10px;
 | 
									right: 10px;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			:global(.bookshelf__book-content) {
 | 
								:global(.bookshelf__book-content),
 | 
				
			||||||
 | 
								:global(.fit-text) {
 | 
				
			||||||
				width: calc(200px - 60px) !important;
 | 
									width: calc(200px - 60px) !important;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								:global(.bookshelf__book-content) {
 | 
				
			||||||
				margin: 0 30px;
 | 
									margin: 0 30px;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -125,8 +129,12 @@
 | 
				
			||||||
				z-index: 2;
 | 
									z-index: 2;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			:global(.bookshelf__book-content) {
 | 
								:global(.bookshelf__book-content),
 | 
				
			||||||
 | 
								:global(.fit-text) {
 | 
				
			||||||
				width: calc(200px - 31px) !important;
 | 
									width: calc(200px - 31px) !important;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								:global(.bookshelf__book-content) {
 | 
				
			||||||
				margin: 0 31px;
 | 
									margin: 0 31px;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,12 +17,13 @@
 | 
				
			||||||
>
 | 
					>
 | 
				
			||||||
	{#if title}
 | 
						{#if title}
 | 
				
			||||||
		<h2
 | 
							<h2
 | 
				
			||||||
			class="bookshelf__book-title"
 | 
								class="bookshelf__book-title fit-text"
 | 
				
			||||||
			class:wrap={allowWrap}
 | 
								class:wrap={allowWrap}
 | 
				
			||||||
			use:fitText={{
 | 
								use:fitText={{
 | 
				
			||||||
				minFontSize: 12,
 | 
									minFontSize: 12,
 | 
				
			||||||
				maxFontSize: 16,
 | 
									maxFontSize: 16,
 | 
				
			||||||
				multiLine: allowWrap,
 | 
									multiLine: allowWrap,
 | 
				
			||||||
 | 
									detectMultiLine: false,
 | 
				
			||||||
			}}
 | 
								}}
 | 
				
			||||||
		>
 | 
							>
 | 
				
			||||||
			{title}
 | 
								{title}
 | 
				
			||||||
| 
						 | 
					@ -30,11 +31,12 @@
 | 
				
			||||||
	{/if}
 | 
						{/if}
 | 
				
			||||||
	{#if subtitle}
 | 
						{#if subtitle}
 | 
				
			||||||
		<h4
 | 
							<h4
 | 
				
			||||||
			class="bookshelf__book-subtitle"
 | 
								class="bookshelf__book-subtitle fit-text"
 | 
				
			||||||
			use:fitText={{
 | 
								use:fitText={{
 | 
				
			||||||
				minFontSize: 10,
 | 
									minFontSize: 10,
 | 
				
			||||||
				maxFontSize: 14,
 | 
									maxFontSize: 14,
 | 
				
			||||||
				multiLine: allowWrap,
 | 
									multiLine: allowWrap,
 | 
				
			||||||
 | 
									detectMultiLine: false,
 | 
				
			||||||
			}}
 | 
								}}
 | 
				
			||||||
		>
 | 
							>
 | 
				
			||||||
			{subtitle}
 | 
								{subtitle}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -38,9 +38,13 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<style lang="scss">
 | 
					<style lang="scss">
 | 
				
			||||||
	div {
 | 
						div {
 | 
				
			||||||
		:global(.bookshelf__book-content) {
 | 
							:global(.bookshelf__book-content),
 | 
				
			||||||
 | 
							:global(.fit-text) {
 | 
				
			||||||
			height: calc(var(--book-tilted-width));
 | 
								height: calc(var(--book-tilted-width));
 | 
				
			||||||
			width: calc(200px - 60px);
 | 
								width: calc(200px - 60px);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							:global(.bookshelf__book-content) {
 | 
				
			||||||
			margin: var(--book-tilted-top-margin) var(--book-tilted-width);
 | 
								margin: var(--book-tilted-top-margin) var(--book-tilted-width);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue