Anki/ts/routes/deck-options/DeckOptionsPage.svelte
Damien Elmes 9f55cf26fc
Switch to SvelteKit (#3077)
* Update to latest Node LTS

* Add sveltekit

* Split tslib into separate @generated and @tslib components

SvelteKit's path aliases don't support multiple locations, so our old
approach of using @tslib to refer to both ts/lib and out/ts/lib will no
longer work. Instead, all generated sources and their includes are
placed in a separate out/ts/generated folder, and imported via @generated
instead. This also allows us to generate .ts files, instead of needing
to output separate .d.ts and .js files.

* Switch package.json to module type

* Avoid usage of baseUrl

Incompatible with SvelteKit

* Move sass into ts; use relative links

SvelteKit's default sass support doesn't allow overriding loadPaths

* jest->vitest, graphs example working with yarn dev

* most pages working in dev mode

* Some fixes after rebasing

* Fix/silence some svelte-check errors

* Get image-occlusion working with Fabric types

* Post-rebase lock changes

* Editor is now checked

* SvelteKit build integrated into ninja

* Use the new SvelteKit entrypoint for pages like congrats/deck options/etc

* Run eslint once for ts/**; fix some tests

* Fix a bunch of issues introduced when rebasing over latest main

* Run eslint fix

* Fix remaining eslint+pylint issues; tests now all pass

* Fix some issues with a clean build

* Latest bufbuild no longer requires @__PURE__ hack

* Add a few missed dependencies

* Add yarn.bat to fix Windows build

* Fix pages failing to show when ANKI_API_PORT not defined

* Fix svelte-check and vitest on Windows

* Set node path in ./yarn

* Move svelte-kit output to ts/.svelte-kit

Sadly, I couldn't figure out a way to store it in out/ if out/ is
a symlink, as it breaks module resolution when SvelteKit is run.

* Allow HMR inside Anki

* Skip SvelteKit build when HMR is defined

* Fix some post-rebase issues

I should have done a normal merge instead.
2024-03-31 09:16:31 +01:00

140 lines
4 KiB
Svelte

<!--
Copyright: Ankitects Pty Ltd and contributors
License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
-->
<script lang="ts">
import type { Writable } from "svelte/store";
import Container from "$lib/components/Container.svelte";
import Row from "$lib/components/Row.svelte";
import type { DynamicSvelteComponent } from "$lib/sveltelib/dynamicComponent";
import Addons from "./Addons.svelte";
import AdvancedOptions from "./AdvancedOptions.svelte";
import AudioOptions from "./AudioOptions.svelte";
import AutoAdvance from "./AutoAdvance.svelte";
import BuryOptions from "./BuryOptions.svelte";
import ConfigSelector from "./ConfigSelector.svelte";
import DailyLimits from "./DailyLimits.svelte";
import DisplayOrder from "./DisplayOrder.svelte";
import FsrsOptionsOuter from "./FsrsOptionsOuter.svelte";
import HtmlAddon from "./HtmlAddon.svelte";
import LapseOptions from "./LapseOptions.svelte";
import type { DeckOptionsState } from "./lib";
import NewOptions from "./NewOptions.svelte";
import TimerOptions from "./TimerOptions.svelte";
export let state: DeckOptionsState;
const addons = state.addonComponents;
export function auxData(): Writable<Record<string, unknown>> {
return state.currentAuxData;
}
export function addSvelteAddon(component: DynamicSvelteComponent): void {
$addons = [...$addons, component];
}
export function addHtmlAddon(html: string, mounted: () => void): void {
$addons = [
...$addons,
{
component: HtmlAddon,
html,
mounted,
},
];
}
export const options = {};
export const dailyLimits = {};
export const newOptions = {};
export const lapseOptions = {};
export const buryOptions = {};
export const displayOrder = {};
export const timerOptions = {};
export const audioOptions = {};
export const advancedOptions = {};
let onPresetChange: () => void;
</script>
<ConfigSelector {state} on:presetchange={onPresetChange} />
<div class="deck-options-page">
<Container
breakpoint="sm"
--gutter-inline="0.25rem"
--gutter-block="0.75rem"
class="container-columns"
>
<div>
<Row class="row-columns">
<DailyLimits {state} api={dailyLimits} bind:onPresetChange />
</Row>
<Row class="row-columns">
<NewOptions {state} api={newOptions} />
</Row>
<Row class="row-columns">
<LapseOptions {state} api={lapseOptions} />
</Row>
<Row class="row-columns">
<DisplayOrder {state} api={displayOrder} />
</Row>
<Row class="row-columns">
<BuryOptions {state} api={buryOptions} />
</Row>
</div>
<div>
<Row class="row-columns">
<AudioOptions {state} api={audioOptions} />
</Row>
<Row class="row-columns">
<TimerOptions {state} api={timerOptions} />
</Row>
<Row class="row-columns">
<AutoAdvance {state} api={timerOptions} />
</Row>
{#if $addons.length}
<Row class="row-columns">
<Addons {state} />
</Row>
{/if}
<Row class="row-columns">
<FsrsOptionsOuter {state} api={{}} />
</Row>
<Row class="row-columns">
<AdvancedOptions {state} api={advancedOptions} />
</Row>
</div>
</Container>
</div>
<style lang="scss">
@use "$lib/sass/breakpoints" as bp;
.deck-options-page {
overflow-x: hidden;
:global(.container-columns) {
display: grid;
gap: 20px;
}
@include bp.with-breakpoint("lg") {
:global(.container-columns) {
grid-template-columns: repeat(2, 1fr);
}
}
}
</style>