Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 59 additions & 35 deletions deno.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion packages/web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
"@sveltejs/kit": "2.43.7",
"@sveltejs/vite-plugin-svelte": "6.2.1",
"@tailwindcss/vite": "4.1.14",
"svelte": "5.39.8",
"svelte": "5.56.4",
"svelte-check": "4.3.2",
"tailwindcss": "4.1.14",
"typescript": "5.9.3",
Expand Down
5 changes: 3 additions & 2 deletions packages/web/src/lib/components/TagAutoCompleteInput.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import * as parsers from '$lib/parsers.ts'
import type { Forager } from '@forager/core'
import type { BaseController } from "$lib/base_controller.ts";
import { get_controller } from '$lib/contexts/controller.ts'
import Tag from '$lib/components/Tag.svelte'

const debounce = <Args>(fn: (...args: Args[]) => void, pause: number) => {
Expand Down Expand Up @@ -84,7 +85,6 @@
type TagModel = Awaited<ReturnType<Forager['tag']['search']>>['results'][0]

let {
controller,
kind,
sort_by = 'media_reference_count',
search_string = $bindable(),
Expand All @@ -94,7 +94,6 @@
contextual_query,
}: {
sort_by?: 'updated_at' | 'media_reference_count'
controller: BaseController
search_string: string
kind: 'search' | 'details'
placeholder?: string
Expand All @@ -104,6 +103,8 @@
contextual_query?: {}
} = $props()

const controller = get_controller<BaseController>()

let root_element: HTMLDivElement
let input_element: HTMLInputElement
let suggestions_element: HTMLUListElement | null = $state(null)
Expand Down
23 changes: 23 additions & 0 deletions packages/web/src/lib/contexts/controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { createContext } from 'svelte'
import type { BaseController } from '$lib/base_controller.ts'

const [get_controller_context, set_controller_context] = createContext<BaseController>()

/**
* Store the route's controller in component context so descendants can read it
* without prop drilling. Returns the controller for ergonomic assignment.
*/
function set_controller<T extends BaseController>(controller: T): T {
set_controller_context(controller)
return controller
}

/**
* Read the controller provided by an ancestor via {@link set_controller}. Pass
* the concrete controller type for the current route to narrow the return type.
*/
function get_controller<T extends BaseController = BaseController>(): T {
return get_controller_context() as T
}

export { set_controller, get_controller }
13 changes: 7 additions & 6 deletions packages/web/src/routes/browse/+page.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -7,27 +7,28 @@
import Header from '$lib/components/Header.svelte'

import { BrowseController } from './controller.ts'
import { set_controller } from '$lib/contexts/controller.ts'

/** @type {import('./$types').PageProps} */
let props = $props()

const controller = new BrowseController(props.data.config)
const controller = set_controller(new BrowseController(props.data.config))
let { dimensions, focus, queryparams } = controller.runes
focus.stack({component: 'BrowsePage', focus: 'page'})
</script>

<div class="h-dvh">
<Header title={queryparams.human_readable_summary || 'Forager'} bind:height={dimensions.heights.header} >
<SearchParams {controller} />
<SearchParams />
</Header>
<div class="grid grid-cols-[auto_1fr]">
<MediaDetails {controller} />
<MediaDetails />
<div class="relative">
<MediaView {controller} />
<MediaList {controller} />
<MediaView />
<MediaList />
</div>
</div>
<Footer {controller} bind:height={dimensions.heights.footer} />
<Footer bind:height={dimensions.heights.footer} />
</div>

<svelte:window
Expand Down
4 changes: 3 additions & 1 deletion packages/web/src/routes/browse/components/Footer.svelte
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
<script lang="ts">
import * as theme from '$lib/theme.ts'
import type { BrowseController } from '../controller.ts'
import { get_controller } from '$lib/contexts/controller.ts'

let {controller, height = $bindable()}: {controller: BrowseController, height: number} = $props()
let {height = $bindable()}: {height: number} = $props()
const controller = get_controller<BrowseController>()


function human_readable_number(n: number) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@
import * as datetime from '@std/datetime'
import type { Json } from '@andykais/ts-rpc/adapters/sveltekit.ts'

import { BrowseController } from '../controller.ts'
let {controller, ...props}: {
controller: BrowseController
let props: {
label: string
content: string | number | Date | null | Json
type?: "text" | "datetime-local"
Expand Down
Loading
Loading