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