generated from tpl/obsidian-sample-plugin
			Add random colors and designs to bookshelf
This commit is contained in:
		
							parent
							
								
									b5b9a3fd31
								
							
						
					
					
						commit
						cfcde1dc5c
					
				| 
						 | 
				
			
			@ -1,3 +1,5 @@
 | 
			
		|||
import type { IN_PROGRESS_STATE, READ_STATE, TO_BE_READ_STATE } from "./const";
 | 
			
		||||
 | 
			
		||||
export interface Author {
 | 
			
		||||
	name: string;
 | 
			
		||||
	description: string;
 | 
			
		||||
| 
						 | 
				
			
			@ -21,3 +23,9 @@ export interface Book {
 | 
			
		|||
	isbn: string;
 | 
			
		||||
	isbn13: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export type ToBeReadState = typeof TO_BE_READ_STATE;
 | 
			
		||||
export type InProgressState = typeof IN_PROGRESS_STATE;
 | 
			
		||||
export type ReadState = typeof READ_STATE;
 | 
			
		||||
 | 
			
		||||
export type ReadingState = ToBeReadState | InProgressState | ReadState;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,131 +1,194 @@
 | 
			
		|||
<script lang="ts">
 | 
			
		||||
	import { READ_STATE } from "@src/const";
 | 
			
		||||
	import type BookTrackerPlugin from "@src/main";
 | 
			
		||||
	import type { ReadingState } from "@src/types";
 | 
			
		||||
	import Book from "@ui/components/bookshelf/Book.svelte";
 | 
			
		||||
	import Bookshelf from "@ui/components/bookshelf/Bookshelf.svelte";
 | 
			
		||||
	import BookStack from "@ui/components/bookshelf/BookStack.svelte";
 | 
			
		||||
	import BookStackElement from "@ui/components/bookshelf/BookStackElement.svelte";
 | 
			
		||||
	import {
 | 
			
		||||
		createMetadata,
 | 
			
		||||
		setMetadataContext,
 | 
			
		||||
	} from "@ui/stores/metadata.svelte";
 | 
			
		||||
	import {
 | 
			
		||||
		createSettings,
 | 
			
		||||
		setSettingsContext,
 | 
			
		||||
	} from "@ui/stores/settings.svelte";
 | 
			
		||||
	import { COLOR_NAMES } from "@utils/color";
 | 
			
		||||
	import { randomElement } from "@utils/rand";
 | 
			
		||||
	import { onDestroy } from "svelte";
 | 
			
		||||
 | 
			
		||||
	interface Props {
 | 
			
		||||
		plugin: BookTrackerPlugin;
 | 
			
		||||
		source: string;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	const { plugin }: Props = $props();
 | 
			
		||||
 | 
			
		||||
	const settingsStore = createSettings(plugin);
 | 
			
		||||
	setSettingsContext(settingsStore);
 | 
			
		||||
 | 
			
		||||
	let stateFilter: ReadingState = $state(READ_STATE);
 | 
			
		||||
 | 
			
		||||
	const metadataStore = createMetadata(plugin, stateFilter);
 | 
			
		||||
	setMetadataContext(metadataStore);
 | 
			
		||||
 | 
			
		||||
	const designs = [
 | 
			
		||||
		"default",
 | 
			
		||||
		"colored-spine",
 | 
			
		||||
		"dual-top-bands",
 | 
			
		||||
		"split-bands",
 | 
			
		||||
	] as const;
 | 
			
		||||
 | 
			
		||||
	function randomDesign() {
 | 
			
		||||
		return randomElement(designs);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	function randomColor() {
 | 
			
		||||
		return randomElement(COLOR_NAMES);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	onDestroy(() => metadataStore.destroy());
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<Bookshelf>
 | 
			
		||||
	<Book
 | 
			
		||||
		title="Hello World"
 | 
			
		||||
		color="purple"
 | 
			
		||||
		width={1120}
 | 
			
		||||
		design="colored-spine"
 | 
			
		||||
		color={randomColor()}
 | 
			
		||||
		design={randomDesign()}
 | 
			
		||||
	/>
 | 
			
		||||
	<Book
 | 
			
		||||
		title="White Space"
 | 
			
		||||
		width={700}
 | 
			
		||||
		color={randomColor()}
 | 
			
		||||
		design={randomDesign()}
 | 
			
		||||
	/>
 | 
			
		||||
	<Book title="White Space" width={700} design="split-bands" color="pink" />
 | 
			
		||||
	<Book
 | 
			
		||||
		title="The Art of Computer Programming Vol 1"
 | 
			
		||||
		width={1156}
 | 
			
		||||
		design="dual-top-bands"
 | 
			
		||||
		color="cyan"
 | 
			
		||||
		color={randomColor()}
 | 
			
		||||
		design={randomDesign()}
 | 
			
		||||
	/>
 | 
			
		||||
	<Book
 | 
			
		||||
		title="Cascading Style Sheets"
 | 
			
		||||
		subtitle="Guide to Design"
 | 
			
		||||
		width={560}
 | 
			
		||||
		color={randomColor()}
 | 
			
		||||
		design={randomDesign()}
 | 
			
		||||
		orientation="tilted"
 | 
			
		||||
	/>
 | 
			
		||||
	<Book
 | 
			
		||||
		title="HTML5"
 | 
			
		||||
		subtitle="Welcome to the Web"
 | 
			
		||||
		width={1350}
 | 
			
		||||
		design="colored-spine"
 | 
			
		||||
		color={randomColor()}
 | 
			
		||||
		design={randomDesign()}
 | 
			
		||||
	/>
 | 
			
		||||
	<BookStack totalChildren={2}>
 | 
			
		||||
		<BookStackElement
 | 
			
		||||
			title="Coding for Dummies"
 | 
			
		||||
			subtitle="JS tutorial"
 | 
			
		||||
			color="blue"
 | 
			
		||||
			design="colored-spine"
 | 
			
		||||
			color={randomColor()}
 | 
			
		||||
			design={randomDesign()}
 | 
			
		||||
		/>
 | 
			
		||||
		<BookStackElement
 | 
			
		||||
			title="Coding for Dummies"
 | 
			
		||||
			subtitle="C# tutorial"
 | 
			
		||||
			color="pink"
 | 
			
		||||
			design="dual-top-bands"
 | 
			
		||||
			color={randomColor()}
 | 
			
		||||
			design={randomDesign()}
 | 
			
		||||
		/>
 | 
			
		||||
	</BookStack>
 | 
			
		||||
	<Book
 | 
			
		||||
		title="CoffeeScript"
 | 
			
		||||
		subtitle="The JS Alternative"
 | 
			
		||||
		author="The Dev Guy"
 | 
			
		||||
		design="split-bands"
 | 
			
		||||
		color="green"
 | 
			
		||||
		color={randomColor()}
 | 
			
		||||
		design={randomDesign()}
 | 
			
		||||
		orientation="on-display"
 | 
			
		||||
	/>
 | 
			
		||||
	<Book
 | 
			
		||||
		title="Cheat Sheet"
 | 
			
		||||
		subtitle="Guide to Design"
 | 
			
		||||
		color="blue"
 | 
			
		||||
		design="split-bands"
 | 
			
		||||
		width={870}
 | 
			
		||||
		color={randomColor()}
 | 
			
		||||
		design={randomDesign()}
 | 
			
		||||
	/>
 | 
			
		||||
	<Book
 | 
			
		||||
		title="Psychology of Colors"
 | 
			
		||||
		color="pink"
 | 
			
		||||
		design="dual-top-bands"
 | 
			
		||||
		width={540}
 | 
			
		||||
		color={randomColor()}
 | 
			
		||||
		design={randomDesign()}
 | 
			
		||||
	/>
 | 
			
		||||
	<Book
 | 
			
		||||
		title="TypeScript"
 | 
			
		||||
		subtitle="Intro JS to type checking"
 | 
			
		||||
		color="cyan"
 | 
			
		||||
		design="colored-spine"
 | 
			
		||||
		width={1130}
 | 
			
		||||
		color={randomColor()}
 | 
			
		||||
		design={randomDesign()}
 | 
			
		||||
	/>
 | 
			
		||||
	<Book
 | 
			
		||||
		title="Testing"
 | 
			
		||||
		width={10}
 | 
			
		||||
		color={randomColor()}
 | 
			
		||||
		design={randomDesign()}
 | 
			
		||||
	/>
 | 
			
		||||
	<Book title="Testing" width={10} />
 | 
			
		||||
	<Book
 | 
			
		||||
		title="JavaScript"
 | 
			
		||||
		subtitle="The Definitive Guide"
 | 
			
		||||
		author="David Flanagan"
 | 
			
		||||
		design="split-bands"
 | 
			
		||||
		color="purple"
 | 
			
		||||
		color={randomColor()}
 | 
			
		||||
		design={randomDesign()}
 | 
			
		||||
		orientation="on-display"
 | 
			
		||||
	/>
 | 
			
		||||
	<Book title="Pragmatic Programmer" color="red" />
 | 
			
		||||
	<Book title="White Space" color="yellow" design="split-bands" />
 | 
			
		||||
	<Book
 | 
			
		||||
		title="Pragmatic Programmer"
 | 
			
		||||
		color={randomColor()}
 | 
			
		||||
		design={randomDesign()}
 | 
			
		||||
	/>
 | 
			
		||||
	<Book title="White Space" color={randomColor()} design={randomDesign()} />
 | 
			
		||||
	<Book
 | 
			
		||||
		title="W3 Schools"
 | 
			
		||||
		subtitle="The best around"
 | 
			
		||||
		color="blue"
 | 
			
		||||
		design="split-bands"
 | 
			
		||||
		color={randomColor()}
 | 
			
		||||
		design={randomDesign()}
 | 
			
		||||
		orientation="tilted"
 | 
			
		||||
	/>
 | 
			
		||||
	<Book
 | 
			
		||||
		title="UI/UX"
 | 
			
		||||
		subtitle="Guide to Mobile Development"
 | 
			
		||||
		author="John Doe"
 | 
			
		||||
		color="purple"
 | 
			
		||||
		color={randomColor()}
 | 
			
		||||
		design={randomDesign()}
 | 
			
		||||
		orientation="on-display"
 | 
			
		||||
		design="dual-top-bands"
 | 
			
		||||
	/>
 | 
			
		||||
	<Book
 | 
			
		||||
		title="Clean Code"
 | 
			
		||||
		color="orange"
 | 
			
		||||
		color={randomColor()}
 | 
			
		||||
		design={randomDesign()}
 | 
			
		||||
		orientation="tilted"
 | 
			
		||||
		design="dual-top-bands"
 | 
			
		||||
	/>
 | 
			
		||||
	<Book title="Docs for Devs" />
 | 
			
		||||
	<Book title="Docs for Devs" color={randomColor()} design={randomDesign()} />
 | 
			
		||||
	<BookStack totalChildren={4}>
 | 
			
		||||
		<BookStackElement
 | 
			
		||||
			title="The Art of Computer Programming Vol 1"
 | 
			
		||||
			color="green"
 | 
			
		||||
			design="dual-top-bands"
 | 
			
		||||
			color={randomColor()}
 | 
			
		||||
			design={randomDesign()}
 | 
			
		||||
		/>
 | 
			
		||||
		<BookStackElement
 | 
			
		||||
			title="The Art of Computer Programming Vol 2"
 | 
			
		||||
			color="red"
 | 
			
		||||
			design="dual-top-bands"
 | 
			
		||||
			color={randomColor()}
 | 
			
		||||
			design={randomDesign()}
 | 
			
		||||
		/>
 | 
			
		||||
		<BookStackElement
 | 
			
		||||
			title="The Art of Computer Programming Vol 3"
 | 
			
		||||
			color="blue"
 | 
			
		||||
			design="dual-top-bands"
 | 
			
		||||
			color={randomColor()}
 | 
			
		||||
			design={randomDesign()}
 | 
			
		||||
		/>
 | 
			
		||||
		<BookStackElement
 | 
			
		||||
			title="The Art of Computer Programming Vol 4a"
 | 
			
		||||
			color="pink"
 | 
			
		||||
			design="dual-top-bands"
 | 
			
		||||
			color={randomColor()}
 | 
			
		||||
			design={randomDesign()}
 | 
			
		||||
		/>
 | 
			
		||||
	</BookStack>
 | 
			
		||||
</Bookshelf>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -56,7 +56,6 @@
 | 
			
		|||
	);
 | 
			
		||||
 | 
			
		||||
	const verifiedWidth = $derived(widthCheck(width));
 | 
			
		||||
	const textColor = $derived(color.contrastColor.hex);
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
{#if orientation}
 | 
			
		||||
| 
						 | 
				
			
			@ -85,19 +84,19 @@
 | 
			
		|||
		</BookOnDisplay>
 | 
			
		||||
	{/if}
 | 
			
		||||
{:else if design === "split-bands"}
 | 
			
		||||
	<BookSplitBands color={color.hex} width={verifiedWidth} {textColor}>
 | 
			
		||||
	<BookSplitBands color={color.hex} width={verifiedWidth}>
 | 
			
		||||
		<BookText {title} {subtitle} />
 | 
			
		||||
	</BookSplitBands>
 | 
			
		||||
{:else if design === "dual-top-bands"}
 | 
			
		||||
	<BookDualTopBands color={color.hex} width={verifiedWidth} {textColor}>
 | 
			
		||||
	<BookDualTopBands color={color.hex} width={verifiedWidth}>
 | 
			
		||||
		<BookText {title} {subtitle} />
 | 
			
		||||
	</BookDualTopBands>
 | 
			
		||||
{:else if design === "colored-spine"}
 | 
			
		||||
	<BookColoredSpine color={color.hex} width={verifiedWidth} {textColor}>
 | 
			
		||||
	<BookColoredSpine color={color.hex} width={verifiedWidth}>
 | 
			
		||||
		<BookText {title} {subtitle} />
 | 
			
		||||
	</BookColoredSpine>
 | 
			
		||||
{:else}
 | 
			
		||||
	<BookDefault color={color.hex} width={verifiedWidth} {textColor}>
 | 
			
		||||
	<BookDefault color={color.hex} width={verifiedWidth}>
 | 
			
		||||
		<BookText {title} {subtitle} />
 | 
			
		||||
	</BookDefault>
 | 
			
		||||
{/if}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,24 +25,23 @@
 | 
			
		|||
			? Color.fromName(colorRaw).darken()
 | 
			
		||||
			: Color.fromCSSColor(colorRaw),
 | 
			
		||||
	);
 | 
			
		||||
	const textColor = $derived(color.contrastColor.hex);
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<li class="bookshelf__bookstack-elem">
 | 
			
		||||
	{#if design === "split-bands"}
 | 
			
		||||
		<BookStackSplitBands color={color.hex} {textColor}>
 | 
			
		||||
		<BookStackSplitBands color={color.hex}>
 | 
			
		||||
			<BookText {title} {subtitle} />
 | 
			
		||||
		</BookStackSplitBands>
 | 
			
		||||
	{:else if design === "dual-top-bands"}
 | 
			
		||||
		<BookStackDualTopBands color={color.hex} {textColor}>
 | 
			
		||||
		<BookStackDualTopBands color={color.hex}>
 | 
			
		||||
			<BookText {title} {subtitle} />
 | 
			
		||||
		</BookStackDualTopBands>
 | 
			
		||||
	{:else if design === "colored-spine"}
 | 
			
		||||
		<BookStackColoredSpine color={color.hex} {textColor}>
 | 
			
		||||
		<BookStackColoredSpine color={color.hex}>
 | 
			
		||||
			<BookText {title} {subtitle} />
 | 
			
		||||
		</BookStackColoredSpine>
 | 
			
		||||
	{:else}
 | 
			
		||||
		<BookStackDefault color={color.hex} {textColor}>
 | 
			
		||||
		<BookStackDefault color={color.hex}>
 | 
			
		||||
			<BookText {title} {subtitle} />
 | 
			
		||||
		</BookStackDefault>
 | 
			
		||||
	{/if}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,6 +19,7 @@ $bookEdge: 2px;
 | 
			
		|||
		display: inline-flex;
 | 
			
		||||
		flex-flow: column nowrap;
 | 
			
		||||
		list-style: none;
 | 
			
		||||
		margin: 0;
 | 
			
		||||
		padding: 0;
 | 
			
		||||
 | 
			
		||||
		.bookshelf__bookStack-outOfStock {
 | 
			
		||||
| 
						 | 
				
			
			@ -40,6 +41,8 @@ $bookEdge: 2px;
 | 
			
		|||
 | 
			
		||||
		.bookshelf__bookstack-elem {
 | 
			
		||||
			margin-inline-start: 0;
 | 
			
		||||
			margin: 0;
 | 
			
		||||
			padding: 0;
 | 
			
		||||
 | 
			
		||||
			.bookshelf__book-wrapper {
 | 
			
		||||
				width: 100%;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,19 +1,28 @@
 | 
			
		|||
<script lang="ts">
 | 
			
		||||
	import type { Snippet } from "svelte";
 | 
			
		||||
	import chroma from "chroma-js";
 | 
			
		||||
	import { Color } from "@utils/color";
 | 
			
		||||
 | 
			
		||||
	interface Props {
 | 
			
		||||
		children?: Snippet;
 | 
			
		||||
		color?: string;
 | 
			
		||||
		width?: number;
 | 
			
		||||
		textColor?: string;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	let { children, color = "green", width = 40, textColor }: Props = $props();
 | 
			
		||||
	let { children, color = "green", width = 40 }: Props = $props();
 | 
			
		||||
 | 
			
		||||
	const borderLeftColor = $derived(chroma(color).mix("white", 0.04));
 | 
			
		||||
	const borderRightColor = $derived(chroma(color).mix("black", 0.04));
 | 
			
		||||
	const backgroundColor = $derived(chroma(color).mix("black", 0.14));
 | 
			
		||||
	const textColor = $derived(new Color(backgroundColor).contrastColor.hex);
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<div
 | 
			
		||||
	class="bookshelf__book-wrapper"
 | 
			
		||||
	style:--book-color={color}
 | 
			
		||||
	style:--book-border-left-color={borderLeftColor.css()}
 | 
			
		||||
	style:--book-border-right-color={borderRightColor.css()}
 | 
			
		||||
	style:--book-background-color={backgroundColor.css()}
 | 
			
		||||
	style:--book-width={width + "px"}
 | 
			
		||||
	style:width={width + "px"}
 | 
			
		||||
	style:color={textColor}
 | 
			
		||||
| 
						 | 
				
			
			@ -24,13 +33,13 @@
 | 
			
		|||
<style lang="scss">
 | 
			
		||||
	div {
 | 
			
		||||
		background: var(--book-color);
 | 
			
		||||
		border-left: 2px solid color-mix(in srgb, var(--book-color), white 4%);
 | 
			
		||||
		border-right: 2px solid color-mix(in srgb, var(--book-color), black 4%);
 | 
			
		||||
		border-left: 2px solid var(--book-border-left-color);
 | 
			
		||||
		border-right: 2px solid var(--book-border-right-color);
 | 
			
		||||
 | 
			
		||||
		&:before {
 | 
			
		||||
			content: " ";
 | 
			
		||||
			display: block;
 | 
			
		||||
			background: color-mix(in srgb, var(--book-color), black 14%);
 | 
			
		||||
			background: var(--book-background-color);
 | 
			
		||||
			height: 100%;
 | 
			
		||||
			width: calc(var(--book-width));
 | 
			
		||||
			border-radius: 4px;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,19 +1,27 @@
 | 
			
		|||
<script lang="ts">
 | 
			
		||||
	import type { Snippet } from "svelte";
 | 
			
		||||
	import chroma from "chroma-js";
 | 
			
		||||
	import { Color } from "@utils/color";
 | 
			
		||||
 | 
			
		||||
	interface Props {
 | 
			
		||||
		children?: Snippet;
 | 
			
		||||
		color?: ColorName | string;
 | 
			
		||||
		color?: string;
 | 
			
		||||
		width?: number;
 | 
			
		||||
		textColor?: string;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	let { children, color = "green", width = 40, textColor }: Props = $props();
 | 
			
		||||
	let { children, color = "green", width = 40 }: Props = $props();
 | 
			
		||||
 | 
			
		||||
	const backgroundColor = $derived(chroma(color));
 | 
			
		||||
	const borderLeftColor = $derived(chroma(color).mix("white", 0.04));
 | 
			
		||||
	const borderRightColor = $derived(chroma(color).mix("black", 0.04));
 | 
			
		||||
	const textColor = $derived(new Color(backgroundColor).contrastColor.hex);
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<div
 | 
			
		||||
	class="bookshelf__book-wrapper"
 | 
			
		||||
	style:--book-color={color}
 | 
			
		||||
	style:--book-color={backgroundColor.css()}
 | 
			
		||||
	style:--book-border-left-color={borderLeftColor.css()}
 | 
			
		||||
	style:--book-border-right-color={borderRightColor.css()}
 | 
			
		||||
	style:--book-width={width + "px"}
 | 
			
		||||
	style:width={width + "px"}
 | 
			
		||||
	style:color={textColor}
 | 
			
		||||
| 
						 | 
				
			
			@ -24,8 +32,8 @@
 | 
			
		|||
<style lang="scss">
 | 
			
		||||
	div {
 | 
			
		||||
		background: var(--book-color);
 | 
			
		||||
		border-left: 2px solid color-mix(in srgb, var(--book-color), white 4%);
 | 
			
		||||
		border-right: 2px solid color-mix(in srgb, var(--book-color), black 4%);
 | 
			
		||||
		border-left: 2px solid var(--book-border-left-color);
 | 
			
		||||
		border-right: 2px solid var(--book-border-right-color);
 | 
			
		||||
 | 
			
		||||
		:global(.bookshelf__book-content) {
 | 
			
		||||
			height: calc(var(--book-width));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,19 +1,29 @@
 | 
			
		|||
<script lang="ts">
 | 
			
		||||
	import type { Snippet } from "svelte";
 | 
			
		||||
	import chroma from "chroma-js";
 | 
			
		||||
	import { Color } from "@utils/color";
 | 
			
		||||
 | 
			
		||||
	interface Props {
 | 
			
		||||
		children?: Snippet;
 | 
			
		||||
		color?: string;
 | 
			
		||||
		width?: number;
 | 
			
		||||
		textColor?: string;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	let { children, color = "green", width = 40, textColor }: Props = $props();
 | 
			
		||||
	let { children, color = "green", width = 40 }: Props = $props();
 | 
			
		||||
 | 
			
		||||
	const backgroundColor = $derived(chroma(color));
 | 
			
		||||
	const borderLeftColor = $derived(chroma(color).mix("white", 0.04));
 | 
			
		||||
	const borderRightColor = $derived(chroma(color).mix("black", 0.04));
 | 
			
		||||
	const bandColor = $derived(chroma(color).mix("black", 0.14));
 | 
			
		||||
	const textColor = $derived(new Color(backgroundColor).contrastColor.hex);
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<div
 | 
			
		||||
	class="bookshelf__book-wrapper"
 | 
			
		||||
	style:--book-color={color}
 | 
			
		||||
	style:--book-color={backgroundColor.css()}
 | 
			
		||||
	style:--book-border-left-color={borderLeftColor.css()}
 | 
			
		||||
	style:--book-border-right-color={borderRightColor.css()}
 | 
			
		||||
	style:--book-band-color={bandColor.css()}
 | 
			
		||||
	style:--book-width={width + "px"}
 | 
			
		||||
	style:width={width + "px"}
 | 
			
		||||
	style:color={textColor}
 | 
			
		||||
| 
						 | 
				
			
			@ -24,13 +34,13 @@
 | 
			
		|||
<style lang="scss">
 | 
			
		||||
	div {
 | 
			
		||||
		background: var(--book-color);
 | 
			
		||||
		border-left: 2px solid color-mix(in srgb, var(--book-color), white 4%);
 | 
			
		||||
		border-right: 2px solid color-mix(in srgb, var(--book-color), black 4%);
 | 
			
		||||
		border-left: 2px solid var(--book-border-left-color);
 | 
			
		||||
		border-right: 2px solid var(--book-border-right-color);
 | 
			
		||||
 | 
			
		||||
		&:after {
 | 
			
		||||
			content: "";
 | 
			
		||||
			display: block;
 | 
			
		||||
			background: color-mix(in srgb, var(--book-color), black 14%);
 | 
			
		||||
			background: var(--book-band-color);
 | 
			
		||||
			height: 20px;
 | 
			
		||||
			width: calc(100% + 4px);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -42,7 +52,7 @@
 | 
			
		|||
		&:before {
 | 
			
		||||
			content: "";
 | 
			
		||||
			display: block;
 | 
			
		||||
			background: color-mix(in srgb, var(--book-color), black 14%);
 | 
			
		||||
			background: var(--book-band-color);
 | 
			
		||||
			height: 20px;
 | 
			
		||||
			width: calc(100% + 4px);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,19 +1,29 @@
 | 
			
		|||
<script lang="ts">
 | 
			
		||||
	import type { Snippet } from "svelte";
 | 
			
		||||
	import chroma from "chroma-js";
 | 
			
		||||
	import { Color } from "@utils/color";
 | 
			
		||||
 | 
			
		||||
	interface Props {
 | 
			
		||||
		children?: Snippet;
 | 
			
		||||
		color?: string;
 | 
			
		||||
		width?: number;
 | 
			
		||||
		textColor?: string;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	let { children, color = "green", width = 40, textColor }: Props = $props();
 | 
			
		||||
	let { children, color = "green", width = 40 }: Props = $props();
 | 
			
		||||
 | 
			
		||||
	const backgroundColor = $derived(chroma(color));
 | 
			
		||||
	const borderLeftColor = $derived(chroma(color).mix("white", 0.04));
 | 
			
		||||
	const borderRightColor = $derived(chroma(color).mix("black", 0.04));
 | 
			
		||||
	const bandColor = $derived(chroma(color).mix("black", 0.14));
 | 
			
		||||
	const textColor = $derived(new Color(backgroundColor).contrastColor.hex);
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<div
 | 
			
		||||
	class="bookshelf__book-wrapper"
 | 
			
		||||
	style:--book-color={color}
 | 
			
		||||
	style:--book-color={backgroundColor.css()}
 | 
			
		||||
	style:--book-border-left-color={borderLeftColor.css()}
 | 
			
		||||
	style:--book-border-right-color={borderRightColor.css()}
 | 
			
		||||
	style:--book-band-color={bandColor.css()}
 | 
			
		||||
	style:--book-width={width + "px"}
 | 
			
		||||
	style:width={width + "px"}
 | 
			
		||||
	style:color={textColor}
 | 
			
		||||
| 
						 | 
				
			
			@ -24,13 +34,13 @@
 | 
			
		|||
<style lang="scss">
 | 
			
		||||
	div {
 | 
			
		||||
		background: var(--book-color);
 | 
			
		||||
		border-left: 2px solid color-mix(in srgb, var(--book-color), white 4%);
 | 
			
		||||
		border-right: 2px solid color-mix(in srgb, var(--book-color), black 4%);
 | 
			
		||||
		border-left: 2px solid var(--book-border-left-color);
 | 
			
		||||
		border-right: 2px solid var(--book-border-right-color);
 | 
			
		||||
 | 
			
		||||
		&:after {
 | 
			
		||||
			content: "";
 | 
			
		||||
			display: block;
 | 
			
		||||
			background: color-mix(in srgb, var(--book-color), black 14%);
 | 
			
		||||
			background: var(--book-band-color);
 | 
			
		||||
			height: 20px;
 | 
			
		||||
			width: calc(100% + 4px);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -42,7 +52,7 @@
 | 
			
		|||
		&:before {
 | 
			
		||||
			content: "";
 | 
			
		||||
			display: block;
 | 
			
		||||
			background: color-mix(in srgb, var(--book-color), black 14%);
 | 
			
		||||
			background: var(--book-band-color);
 | 
			
		||||
			height: 20px;
 | 
			
		||||
			width: calc(100% + 4px);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,18 +1,26 @@
 | 
			
		|||
<script lang="ts">
 | 
			
		||||
	import type { Snippet } from "svelte";
 | 
			
		||||
	import chroma from "chroma-js";
 | 
			
		||||
	import { Color } from "@utils/color";
 | 
			
		||||
 | 
			
		||||
	interface Props {
 | 
			
		||||
		children?: Snippet;
 | 
			
		||||
		color?: string;
 | 
			
		||||
		textColor?: string;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	let { children, color = "green", textColor }: Props = $props();
 | 
			
		||||
	let { children, color = "green" }: Props = $props();
 | 
			
		||||
 | 
			
		||||
	const borderLeftColor = $derived(chroma(color).mix("white", 0.04));
 | 
			
		||||
	const borderRightColor = $derived(chroma(color).mix("black", 0.04));
 | 
			
		||||
	const backgroundColor = $derived(chroma(color).mix("black", 0.14));
 | 
			
		||||
	const textColor = $derived(new Color(backgroundColor).contrastColor.hex);
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<div
 | 
			
		||||
	class="bookshelf__book-wrapper"
 | 
			
		||||
	style:--book-color={color}
 | 
			
		||||
	style:--book-border-left-color={borderLeftColor.css()}
 | 
			
		||||
	style:--book-border-right-color={borderRightColor.css()}
 | 
			
		||||
	style:--book-background-color={backgroundColor.css()}
 | 
			
		||||
	style:color={textColor}
 | 
			
		||||
>
 | 
			
		||||
	{@render children?.()}
 | 
			
		||||
| 
						 | 
				
			
			@ -21,13 +29,13 @@
 | 
			
		|||
<style lang="scss">
 | 
			
		||||
	div {
 | 
			
		||||
		background: var(--book-color);
 | 
			
		||||
		border-left: 2px solid color-mix(in srgb, var(--book-color), white 4%);
 | 
			
		||||
		border-right: 2px solid color-mix(in srgb, var(--book-color), black 4%);
 | 
			
		||||
		border-left: 2px solid var(--book-border-left-color);
 | 
			
		||||
		border-right: 2px solid var(--book-border-right-color);
 | 
			
		||||
 | 
			
		||||
		&:before {
 | 
			
		||||
			content: " ";
 | 
			
		||||
			display: block;
 | 
			
		||||
			background: color-mix(in srgb, var(--book-color), black 14%);
 | 
			
		||||
			background: var(--book-background-color);
 | 
			
		||||
			height: 40px;
 | 
			
		||||
			width: calc(100% + 4px);
 | 
			
		||||
			border-radius: 4px;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,18 +1,26 @@
 | 
			
		|||
<script lang="ts">
 | 
			
		||||
	import type { Snippet } from "svelte";
 | 
			
		||||
	import chroma from "chroma-js";
 | 
			
		||||
	import { Color } from "@utils/color";
 | 
			
		||||
 | 
			
		||||
	interface Props {
 | 
			
		||||
		children?: Snippet;
 | 
			
		||||
		color?: string;
 | 
			
		||||
		textColor?: string;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	let { children, color = "green", textColor }: Props = $props();
 | 
			
		||||
	let { children, color = "green" }: Props = $props();
 | 
			
		||||
 | 
			
		||||
	const backgroundColor = $derived(chroma(color));
 | 
			
		||||
	const borderLeftColor = $derived(chroma(color).mix("white", 0.04));
 | 
			
		||||
	const borderRightColor = $derived(chroma(color).mix("black", 0.04));
 | 
			
		||||
	const textColor = $derived(new Color(backgroundColor).contrastColor.hex);
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<div
 | 
			
		||||
	class="bookshelf__book-wrapper"
 | 
			
		||||
	style:--book-color={color}
 | 
			
		||||
	style:--book-color={backgroundColor.css()}
 | 
			
		||||
	style:--book-border-left-color={borderLeftColor.css()}
 | 
			
		||||
	style:--book-border-right-color={borderRightColor.css()}
 | 
			
		||||
	style:color={textColor}
 | 
			
		||||
>
 | 
			
		||||
	{@render children?.()}
 | 
			
		||||
| 
						 | 
				
			
			@ -21,7 +29,7 @@
 | 
			
		|||
<style lang="scss">
 | 
			
		||||
	div {
 | 
			
		||||
		background: var(--book-color);
 | 
			
		||||
		border-left: 2px solid color-mix(in srgb, var(--book-color), white 4%);
 | 
			
		||||
		border-right: 2px solid color-mix(in srgb, var(--book-color), black 4%);
 | 
			
		||||
		border-left: 2px solid var(--book-border-left-color);
 | 
			
		||||
		border-right: 2px solid var(--book-border-right-color);
 | 
			
		||||
	}
 | 
			
		||||
</style>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,18 +1,28 @@
 | 
			
		|||
<script lang="ts">
 | 
			
		||||
	import type { Snippet } from "svelte";
 | 
			
		||||
	import chroma from "chroma-js";
 | 
			
		||||
	import { Color } from "@utils/color";
 | 
			
		||||
 | 
			
		||||
	interface Props {
 | 
			
		||||
		children?: Snippet;
 | 
			
		||||
		color?: string;
 | 
			
		||||
		textColor?: string;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	let { children, color = "green", textColor }: Props = $props();
 | 
			
		||||
	let { children, color = "green" }: Props = $props();
 | 
			
		||||
 | 
			
		||||
	const backgroundColor = $derived(chroma(color));
 | 
			
		||||
	const borderLeftColor = $derived(chroma(color).mix("white", 0.04));
 | 
			
		||||
	const borderRightColor = $derived(chroma(color).mix("black", 0.04));
 | 
			
		||||
	const bandColor = $derived(chroma(color).mix("black", 0.14));
 | 
			
		||||
	const textColor = $derived(new Color(backgroundColor).contrastColor.hex);
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<div
 | 
			
		||||
	class="bookshelf__book-wrapper"
 | 
			
		||||
	style:--book-color={color}
 | 
			
		||||
	style:--book-color={backgroundColor.css()}
 | 
			
		||||
	style:--book-border-left-color={borderLeftColor.css()}
 | 
			
		||||
	style:--book-border-right-color={borderRightColor.css()}
 | 
			
		||||
	style:--book-band-color={bandColor.css()}
 | 
			
		||||
	style:color={textColor}
 | 
			
		||||
>
 | 
			
		||||
	{@render children?.()}
 | 
			
		||||
| 
						 | 
				
			
			@ -21,13 +31,13 @@
 | 
			
		|||
<style lang="scss">
 | 
			
		||||
	div {
 | 
			
		||||
		background: var(--book-color);
 | 
			
		||||
		border-left: 2px solid color-mix(in srgb, var(--book-color), white 4%);
 | 
			
		||||
		border-right: 2px solid color-mix(in srgb, var(--book-color), black 4%);
 | 
			
		||||
		border-left: 2px solid var(--book-border-left-color);
 | 
			
		||||
		border-right: 2px solid var(--book-border-right-color);
 | 
			
		||||
 | 
			
		||||
		&:after {
 | 
			
		||||
			content: " ";
 | 
			
		||||
			display: block;
 | 
			
		||||
			background: color-mix(in srgb, var(--book-color), black 14%);
 | 
			
		||||
			background: var(--book-band-color);
 | 
			
		||||
			height: 40px;
 | 
			
		||||
			width: 10px;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -39,7 +49,7 @@
 | 
			
		|||
		&:before {
 | 
			
		||||
			content: " ";
 | 
			
		||||
			display: block;
 | 
			
		||||
			background: color-mix(in srgb, var(--book-color), black 14%);
 | 
			
		||||
			background: var(--book-band-color);
 | 
			
		||||
			height: 40px;
 | 
			
		||||
			width: 15px;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,18 +1,28 @@
 | 
			
		|||
<script lang="ts">
 | 
			
		||||
	import type { Snippet } from "svelte";
 | 
			
		||||
	import chroma from "chroma-js";
 | 
			
		||||
	import { Color } from "@utils/color";
 | 
			
		||||
 | 
			
		||||
	interface Props {
 | 
			
		||||
		children?: Snippet;
 | 
			
		||||
		color?: string;
 | 
			
		||||
		textColor?: string;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	let { children, color = "green", textColor }: Props = $props();
 | 
			
		||||
	let { children, color = "green" }: Props = $props();
 | 
			
		||||
 | 
			
		||||
	const backgroundColor = $derived(chroma(color));
 | 
			
		||||
	const borderLeftColor = $derived(chroma(color).mix("white", 0.04));
 | 
			
		||||
	const borderRightColor = $derived(chroma(color).mix("black", 0.04));
 | 
			
		||||
	const bandColor = $derived(chroma(color).mix("black", 0.14));
 | 
			
		||||
	const textColor = $derived(new Color(backgroundColor).contrastColor.hex);
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
<div
 | 
			
		||||
	class="bookshelf__book-wrapper"
 | 
			
		||||
	style:--book-color={color}
 | 
			
		||||
	style:--book-color={backgroundColor.css()}
 | 
			
		||||
	style:--book-border-left-color={borderLeftColor.css()}
 | 
			
		||||
	style:--book-border-right-color={borderRightColor.css()}
 | 
			
		||||
	style:--book-band-color={bandColor.css()}
 | 
			
		||||
	style:color={textColor}
 | 
			
		||||
>
 | 
			
		||||
	{@render children?.()}
 | 
			
		||||
| 
						 | 
				
			
			@ -21,13 +31,13 @@
 | 
			
		|||
<style lang="scss">
 | 
			
		||||
	div {
 | 
			
		||||
		background: var(--book-color);
 | 
			
		||||
		border-left: 2px solid color-mix(in srgb, var(--book-color), white 4%);
 | 
			
		||||
		border-right: 2px solid color-mix(in srgb, var(--book-color), black 4%);
 | 
			
		||||
		border-left: 2px solid var(--book-border-left-color);
 | 
			
		||||
		border-right: 2px solid var(--book-border-right-color);
 | 
			
		||||
 | 
			
		||||
		&:after {
 | 
			
		||||
			content: " ";
 | 
			
		||||
			display: block;
 | 
			
		||||
			background: color-mix(in srgb, var(--book-color), black 14%);
 | 
			
		||||
			background: var(--book-band-color);
 | 
			
		||||
			height: 40px;
 | 
			
		||||
			width: 20px;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -39,7 +49,7 @@
 | 
			
		|||
		&:before {
 | 
			
		||||
			content: " ";
 | 
			
		||||
			display: block;
 | 
			
		||||
			background: color-mix(in srgb, var(--book-color), black 14%);
 | 
			
		||||
			background: var(--book-band-color);
 | 
			
		||||
			height: 40px;
 | 
			
		||||
			width: 20px;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -51,7 +51,6 @@
 | 
			
		|||
			books.set(key, bookCount + 1);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		console.log(pages);
 | 
			
		||||
		if (isMonthly && typeof store.filterMonth === "number") {
 | 
			
		||||
			// @ts-expect-error Moment is provided by Obsidian
 | 
			
		||||
			const daysInMonth = moment()
 | 
			
		||||
| 
						 | 
				
			
			@ -65,7 +64,6 @@
 | 
			
		|||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		console.log(pages);
 | 
			
		||||
 | 
			
		||||
		const labels = Array.from(books.keys())
 | 
			
		||||
			.sort((a, b) => a - b)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,6 +4,7 @@ import { getContext, setContext } from "svelte";
 | 
			
		|||
import { getSettingsContext } from "./settings.svelte";
 | 
			
		||||
import type BookTrackerPlugin from "@src/main";
 | 
			
		||||
import { createDateFilter, type DateFilterStore } from "./date-filter.svelte";
 | 
			
		||||
import type { ReadingState } from "@src/types";
 | 
			
		||||
 | 
			
		||||
export type FileMetadata = {
 | 
			
		||||
	file: TFile;
 | 
			
		||||
| 
						 | 
				
			
			@ -20,23 +21,30 @@ interface MetadataStore extends DateFilterStore {
 | 
			
		|||
 | 
			
		||||
	destroy(): void;
 | 
			
		||||
}
 | 
			
		||||
export function createMetadata(plugin: BookTrackerPlugin): MetadataStore {
 | 
			
		||||
	const settings = getSettingsContext().settings;
 | 
			
		||||
export function createMetadata(
 | 
			
		||||
	plugin: BookTrackerPlugin,
 | 
			
		||||
	state: ReadingState = READ_STATE
 | 
			
		||||
): MetadataStore {
 | 
			
		||||
	const settingsStore = getSettingsContext();
 | 
			
		||||
 | 
			
		||||
	const initialMetadata: FileMetadata[] = [];
 | 
			
		||||
	let metadata: FileMetadata[] = $state([]);
 | 
			
		||||
 | 
			
		||||
	for (const file of plugin.app.vault.getMarkdownFiles()) {
 | 
			
		||||
		const frontmatter =
 | 
			
		||||
			plugin.app.metadataCache.getFileCache(file)?.frontmatter ?? {};
 | 
			
		||||
	$effect(() => {
 | 
			
		||||
		const newMetadata: FileMetadata[] = [];
 | 
			
		||||
 | 
			
		||||
		if (frontmatter[settings.statusProperty] !== READ_STATE) {
 | 
			
		||||
			continue;
 | 
			
		||||
		for (const file of plugin.app.vault.getMarkdownFiles()) {
 | 
			
		||||
			const frontmatter =
 | 
			
		||||
				plugin.app.metadataCache.getFileCache(file)?.frontmatter ?? {};
 | 
			
		||||
 | 
			
		||||
			if (frontmatter[settingsStore.settings.statusProperty] !== state) {
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			newMetadata.push({ file, frontmatter });
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		initialMetadata.push({ file, frontmatter });
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	let metadata = $state(initialMetadata);
 | 
			
		||||
		metadata = newMetadata;
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	function onChanged(file: TFile, _data: string, cache: CachedMetadata) {
 | 
			
		||||
		metadata = metadata.map((f) => {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,7 @@
 | 
			
		|||
export function randomInt(min: number, max: number) {
 | 
			
		||||
	return Math.floor(Math.random() * (max - min + 1)) + min;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function randomElement<T>(arr: T[] | ReadonlyArray<T>): T {
 | 
			
		||||
	return arr[randomInt(0, arr.length - 1)];
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue