diff --git a/ts/ChangeNotetype/NotetypeSelector.svelte b/ts/ChangeNotetype/NotetypeSelector.svelte
index 0f272b3f9..e6de9aab6 100644
--- a/ts/ChangeNotetype/NotetypeSelector.svelte
+++ b/ts/ChangeNotetype/NotetypeSelector.svelte
@@ -7,7 +7,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import StickyBar from "components/StickyBar.svelte";
import ButtonToolbar from "components/ButtonToolbar.svelte";
- import ButtonToolbarItem from "components/ButtonToolbarItem.svelte";
+ import Item from "components/Item.svelte";
import ButtonGroup from "components/ButtonGroup.svelte";
import ButtonGroupItem from "components/ButtonGroupItem.svelte";
@@ -27,7 +27,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
-
+ -
@@ -42,10 +42,10 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
-
+
-
+ -
-
+
diff --git a/ts/components/ButtonGroup.svelte b/ts/components/ButtonGroup.svelte
index 41c03267a..d6577d958 100644
--- a/ts/components/ButtonGroup.svelte
+++ b/ts/components/ButtonGroup.svelte
@@ -8,7 +8,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import { writable } from "svelte/store";
import { buttonGroupKey } from "./contextKeys";
import type { Identifier } from "./identifier";
- import { insert, add } from "./identifier";
+ import { insertElement, appendElement } from "./identifier";
import type { ButtonRegistration } from "./buttons";
import { ButtonPosition } from "./buttons";
import type { SvelteComponent } from "./registration";
@@ -62,9 +62,13 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
getDynamicInterface(buttonGroupRef);
const insertButton = (button: SvelteComponent, position: Identifier = 0) =>
- addComponent(button, (added, parent) => insert(added, parent, position));
+ addComponent(button, (added, parent) =>
+ insertElement(added, parent, position)
+ );
const appendButton = (button: SvelteComponent, position: Identifier = -1) =>
- addComponent(button, (added, parent) => add(added, parent, position));
+ addComponent(button, (added, parent) =>
+ appendElement(added, parent, position)
+ );
const showButton = (id: Identifier) =>
updateRegistration(({ detach }) => detach.set(false), id);
diff --git a/ts/components/ButtonToolbar.svelte b/ts/components/ButtonToolbar.svelte
index f1685cfb0..bbdf968ad 100644
--- a/ts/components/ButtonToolbar.svelte
+++ b/ts/components/ButtonToolbar.svelte
@@ -5,12 +5,11 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
+
+
+
+
diff --git a/ts/components/ButtonToolbarItem.svelte b/ts/components/Item.svelte
similarity index 68%
rename from ts/components/ButtonToolbarItem.svelte
rename to ts/components/Item.svelte
index 5d77dd16a..09e086f3a 100644
--- a/ts/components/ButtonToolbarItem.svelte
+++ b/ts/components/Item.svelte
@@ -5,23 +5,21 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
+
+
+
+ {#each $dynamicItems as item}
+ -
+
+
+ {/each}
+
+
+
diff --git a/ts/components/SelectButton.svelte b/ts/components/SelectButton.svelte
index adfb198e8..f4c0230a9 100644
--- a/ts/components/SelectButton.svelte
+++ b/ts/components/SelectButton.svelte
@@ -35,6 +35,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
class="{className} form-select"
class:btn-day={!nightMode}
class:btn-night={nightMode}
+ class:visible-down-arrow={nightMode}
title={tooltip}
on:change
>
@@ -50,6 +51,11 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
overflow-x: hidden;
}
+ .visible-down-arrow {
+ /* override the default down arrow */
+ background-image: button.down-arrow(white);
+ }
+
@include button.btn-day($with-hover: false);
@include button.btn-night($with-hover: false);
diff --git a/ts/components/StickyBar.svelte b/ts/components/StickyBar.svelte
index c6adc0b20..86eda6f6a 100644
--- a/ts/components/StickyBar.svelte
+++ b/ts/components/StickyBar.svelte
@@ -4,11 +4,11 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
-->
-
+
diff --git a/ts/components/WithDropdownMenu.svelte b/ts/components/WithDropdownMenu.svelte
index 068942b2b..df09e20c4 100644
--- a/ts/components/WithDropdownMenu.svelte
+++ b/ts/components/WithDropdownMenu.svelte
@@ -8,6 +8,8 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import { setContext } from "svelte";
import { dropdownKey } from "./contextKeys";
+ export let disabled = false;
+
setContext(dropdownKey, {
dropdown: true,
"data-bs-toggle": "dropdown",
@@ -17,26 +19,26 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
const menuId = Math.random().toString(36).substring(2);
let dropdown: Dropdown;
- function activateDropdown(_event: MouseEvent): void {
- dropdown.toggle();
+ function activateDropdown(): void {
+ if (!disabled) {
+ dropdown.toggle();
+ }
}
/* Normally dropdown and trigger are associated with a
/* common ancestor with .dropdown class */
- function createDropdown(event: CustomEvent): void {
- const button: HTMLButtonElement = event.detail.button;
-
+ function createDropdown(element: HTMLElement): void {
/* Prevent focus on menu activation */
const noop = () => {};
- Object.defineProperty(button, "focus", { value: noop });
+ Object.defineProperty(element, "focus", { value: noop });
- const menu = (button.getRootNode() as Document) /* or shadow root */
+ const menu = (element.getRootNode() as Document) /* or shadow root */
.getElementById(menuId);
if (!menu) {
console.log(`Could not find menu "${menuId}" for dropdown menu.`);
} else {
- dropdown = new Dropdown(button);
+ dropdown = new Dropdown(element);
/* Set custom menu without using common element with .dropdown */
(dropdown as any)._menu = menu;
diff --git a/ts/components/buttons.ts b/ts/components/buttons.ts
index abe6ee34e..cd64bb1ca 100644
--- a/ts/components/buttons.ts
+++ b/ts/components/buttons.ts
@@ -1,6 +1,7 @@
// Copyright: Ankitects Pty Ltd and contributors
// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import type { Writable } from "svelte/store";
+import type { Registration } from "./registration";
export enum ButtonPosition {
Standalone,
@@ -9,11 +10,6 @@ export enum ButtonPosition {
Rightmost,
}
-export interface ButtonRegistration {
- detach: Writable;
+export interface ButtonRegistration extends Registration {
position: Writable;
}
-
-export interface ButtonGroupRegistration {
- detach: Writable;
-}
diff --git a/ts/components/contextKeys.ts b/ts/components/contextKeys.ts
index 008569399..0f0851843 100644
--- a/ts/components/contextKeys.ts
+++ b/ts/components/contextKeys.ts
@@ -1,9 +1,10 @@
// Copyright: Ankitects Pty Ltd and contributors
// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
export const nightModeKey = Symbol("nightMode");
+export const touchDeviceKey = Symbol("touchDevice");
export const disabledKey = Symbol("disabled");
-export const buttonToolbarKey = Symbol("buttonToolbar");
+export const sectionKey = Symbol("section");
export const buttonGroupKey = Symbol("buttonGroup");
export const dropdownKey = Symbol("dropdown");
export const modalsKey = Symbol("modals");
diff --git a/ts/components/identifier.ts b/ts/components/identifier.ts
index deee14436..977d69a89 100644
--- a/ts/components/identifier.ts
+++ b/ts/components/identifier.ts
@@ -2,7 +2,7 @@
// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
export type Identifier = string | number;
-export function find(
+export function findElement(
collection: HTMLCollection,
idOrIndex: Identifier
): [number, Element] | null {
@@ -34,12 +34,12 @@ export function find(
return result;
}
-export function insert(
+export function insertElement(
element: Element,
collection: Element,
idOrIndex: Identifier
): number {
- const match = find(collection.children, idOrIndex);
+ const match = findElement(collection.children, idOrIndex);
if (match) {
const [index, reference] = match;
@@ -51,12 +51,12 @@ export function insert(
return -1;
}
-export function add(
+export function appendElement(
element: Element,
collection: Element,
idOrIndex: Identifier
): number {
- const match = find(collection.children, idOrIndex);
+ const match = findElement(collection.children, idOrIndex);
if (match) {
const [index, before] = match;
@@ -69,12 +69,12 @@ export function add(
return -1;
}
-export function update(
+export function updateElement(
f: (element: Element) => void,
collection: Element,
idOrIndex: Identifier
): number {
- const match = find(collection.children, idOrIndex);
+ const match = findElement(collection.children, idOrIndex);
if (match) {
const [index, element] = match;
diff --git a/ts/components/registration.ts b/ts/components/registration.ts
index 06f03c009..5b03b5f02 100644
--- a/ts/components/registration.ts
+++ b/ts/components/registration.ts
@@ -1,10 +1,10 @@
// Copyright: Ankitects Pty Ltd and contributors
// License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import type { SvelteComponentTyped } from "svelte/internal";
-import type { Readable } from "svelte/store";
+import type { Writable, Readable } from "svelte/store";
import { writable } from "svelte/store";
import type { Identifier } from "./identifier";
-import { find } from "./identifier";
+import { findElement } from "./identifier";
export interface SvelteComponent {
component: SvelteComponentTyped;
@@ -12,9 +12,13 @@ export interface SvelteComponent {
props: Record | undefined;
}
-export type Register = (index?: number, registration?: T) => T;
+export interface Registration {
+ detach: Writable;
+}
-export interface RegistrationAPI {
+export type Register = (index?: number, registration?: T) => T;
+
+export interface RegistrationAPI {
registerComponent: Register;
items: Readable;
dynamicItems: Readable<[SvelteComponent, T][]>;
@@ -36,7 +40,9 @@ export function nodeIsElement(node: Node): node is Element {
return node.nodeType === Node.ELEMENT_NODE;
}
-export function makeInterface(makeRegistration: () => T): RegistrationAPI {
+export function makeInterface(
+ makeRegistration: () => T
+): RegistrationAPI {
const registrations: T[] = [];
const items = writable(registrations);
@@ -92,7 +98,7 @@ export function makeInterface(makeRegistration: () => T): RegistrationAPI
update: (registration: T) => void,
position: Identifier
): void {
- const match = find(elementRef.children, position);
+ const match = findElement(elementRef.children, position);
if (match) {
const [index] = match;
diff --git a/ts/deckoptions/Addons.svelte b/ts/deckoptions/Addons.svelte
index 19dd1220e..871748d2f 100644
--- a/ts/deckoptions/Addons.svelte
+++ b/ts/deckoptions/Addons.svelte
@@ -3,18 +3,18 @@ Copyright: Ankitects Pty Ltd and contributors
License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
-->
{#if $components.length || state.haveAddons}
-
-
Add-ons
-
+
If you're using an add-on that hasn't been updated to use this new screen
yet, you can access the old deck options screen by holding down the shift
@@ -24,5 +24,5 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
{#each $components as addon}
{/each}
-
+
{/if}
diff --git a/ts/deckoptions/AdvancedOptions.svelte b/ts/deckoptions/AdvancedOptions.svelte
index d445cf014..ed953b260 100644
--- a/ts/deckoptions/AdvancedOptions.svelte
+++ b/ts/deckoptions/AdvancedOptions.svelte
@@ -4,72 +4,88 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
-->
-{tr.deckConfigAdvancedTitle()}
+
+ -
+
+ {tr.schedulingMaximumInterval()}
+
+
-
+ -
+
+ {tr.schedulingStartingEase()}
+
+
- ($config.initialEase = evt.detail.value)}
-/>
+ -
+
+ {tr.schedulingEasyBonus()}
+
+
- ($config.easyMultiplier = evt.detail.value)}
-/>
+ -
+
+ {tr.schedulingIntervalModifier()}
+
+
- ($config.intervalMultiplier = evt.detail.value)}
-/>
+ -
+
+ {tr.schedulingHardInterval()}
+
+
- ($config.hardMultiplier = evt.detail.value)}
-/>
-
- ($config.lapseMultiplier = evt.detail.value)}
-/>
+ -
+
+ {tr.schedulingNewInterval()}
+
+
+
diff --git a/ts/deckoptions/AudioOptions.svelte b/ts/deckoptions/AudioOptions.svelte
new file mode 100644
index 000000000..3b678d542
--- /dev/null
+++ b/ts/deckoptions/AudioOptions.svelte
@@ -0,0 +1,38 @@
+
+
+
+
+ -
+
+ {tr.deckConfigDisableAutoplay()}
+
+
+
+ -
+
+ {tr.schedulingAlwaysIncludeQuestionSideWhenReplaying()}
+
+
+
diff --git a/ts/deckoptions/BUILD.bazel b/ts/deckoptions/BUILD.bazel
index cb6d275fb..688733c84 100644
--- a/ts/deckoptions/BUILD.bazel
+++ b/ts/deckoptions/BUILD.bazel
@@ -38,6 +38,7 @@ copy_bootstrap_icons(
icons = [
"arrow-counterclockwise.svg",
"info-circle.svg",
+ "gear.svg",
],
)
@@ -133,6 +134,7 @@ svelte_check(
"*.svelte",
]) + [
"//ts/sass:button_mixins_lib",
+ "//ts/sass:night_mode_lib",
"//ts/sass/bootstrap",
"@npm//@types/bootstrap",
"@npm//@types/lodash-es",
diff --git a/ts/deckoptions/Badge.svelte b/ts/deckoptions/Badge.svelte
new file mode 100644
index 000000000..5fbfa4d4b
--- /dev/null
+++ b/ts/deckoptions/Badge.svelte
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
diff --git a/ts/deckoptions/BuryOptions.svelte b/ts/deckoptions/BuryOptions.svelte
index 7786f3119..9191265a7 100644
--- a/ts/deckoptions/BuryOptions.svelte
+++ b/ts/deckoptions/BuryOptions.svelte
@@ -4,26 +4,36 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
-->
-{tr.deckConfigBuryTitle()}
+
+ -
+
+ {tr.deckConfigBuryNewSiblings()}
+
+
-
-
-
+ -
+
+ {tr.deckConfigBuryReviewSiblings()}
+
+
+
diff --git a/ts/deckoptions/CheckBox.svelte b/ts/deckoptions/CheckBox.svelte
index 20dec648c..cd707ed49 100644
--- a/ts/deckoptions/CheckBox.svelte
+++ b/ts/deckoptions/CheckBox.svelte
@@ -3,26 +3,7 @@ Copyright: Ankitects Pty Ltd and contributors
License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
-->
-
-
- {label}
- {#if tooltip}
-
- {/if}
-
-
-
-
+
diff --git a/ts/deckoptions/CheckBoxRow.svelte b/ts/deckoptions/CheckBoxRow.svelte
new file mode 100644
index 000000000..fcb1122bc
--- /dev/null
+++ b/ts/deckoptions/CheckBoxRow.svelte
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+ {#if markdownTooltip} {:else} {/if}
+
+
diff --git a/ts/deckoptions/Col.svelte b/ts/deckoptions/Col.svelte
new file mode 100644
index 000000000..2242fa8e9
--- /dev/null
+++ b/ts/deckoptions/Col.svelte
@@ -0,0 +1,22 @@
+
+
+
+
+
+
diff --git a/ts/deckoptions/ConfigEditor.svelte b/ts/deckoptions/ConfigEditor.svelte
deleted file mode 100644
index 8f3c143a2..000000000
--- a/ts/deckoptions/ConfigEditor.svelte
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-
-
-
-
-
- {#if state.v3Scheduler}
-
- {/if}
-
-
-
-
-
-
diff --git a/ts/deckoptions/ConfigEntry.svelte b/ts/deckoptions/ConfigEntry.svelte
deleted file mode 100644
index c2d1abf88..000000000
--- a/ts/deckoptions/ConfigEntry.svelte
+++ /dev/null
@@ -1,80 +0,0 @@
-
-
-
-
- {#if label}
-
-
- {label}
- {#if renderedTooltip}
-
- {/if}
-
-
- {/if}
-
-
-
-
-
-
-
- {#each warnings as warning}
- {#if warning}
-
{warning}
- {/if}
- {/each}
-
-
-
-
diff --git a/ts/deckoptions/ConfigSelector.svelte b/ts/deckoptions/ConfigSelector.svelte
index 524717d49..9d51bd886 100644
--- a/ts/deckoptions/ConfigSelector.svelte
+++ b/ts/deckoptions/ConfigSelector.svelte
@@ -12,7 +12,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import TextInputModal from "./TextInputModal.svelte";
import StickyBar from "components/StickyBar.svelte";
import ButtonToolbar from "components/ButtonToolbar.svelte";
- import ButtonToolbarItem from "components/ButtonToolbarItem.svelte";
+ import Item from "components/Item.svelte";
import ButtonGroup from "components/ButtonGroup.svelte";
import ButtonGroupItem from "components/ButtonGroupItem.svelte";
@@ -87,9 +87,9 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
bind:modalKey
/>
-
+
-
+ -
@@ -104,15 +104,15 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
-
+
-
+ -
-
+
diff --git a/ts/deckoptions/DailyLimits.svelte b/ts/deckoptions/DailyLimits.svelte
index fa197f4d7..c9e765ad4 100644
--- a/ts/deckoptions/DailyLimits.svelte
+++ b/ts/deckoptions/DailyLimits.svelte
@@ -1,13 +1,18 @@
-{tr.deckConfigDailyLimits()}
+
+ -
+
+ {tr.schedulingNewCardsday()}
+
-
+
+
-
+ -
+
+ {tr.schedulingMaximumReviewsday()}
+
+
+
+
+
diff --git a/ts/deckoptions/DeckOptionsPage.svelte b/ts/deckoptions/DeckOptionsPage.svelte
index 520335f69..9838c2e84 100644
--- a/ts/deckoptions/DeckOptionsPage.svelte
+++ b/ts/deckoptions/DeckOptionsPage.svelte
@@ -4,7 +4,18 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
-->
-
+
+
+ -
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+ {#if state.v3Scheduler}
+ -
+
+
+ {/if}
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
diff --git a/ts/deckoptions/DisplayOrder.svelte b/ts/deckoptions/DisplayOrder.svelte
index 0b31e12f6..c158fba1f 100644
--- a/ts/deckoptions/DisplayOrder.svelte
+++ b/ts/deckoptions/DisplayOrder.svelte
@@ -4,12 +4,16 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
-->
-{tr.deckConfigOrderingTitle()}
+
+ -
+
+ {tr.deckConfigNewGatherPriority()}
+
+
-
+ -
+
+ {tr.deckConfigNewCardSortOrder()}
+
+
-
+ -
+
+ {tr.deckConfigNewReviewPriority()}
+
+
-
+ -
+
+ {tr.deckConfigInterdayStepPriority()}
+
+
-
-
-
+ -
+
+ {tr.deckConfigReviewSortOrder()}
+
+
+
diff --git a/ts/deckoptions/EnumSelector.svelte b/ts/deckoptions/EnumSelector.svelte
index 75fd0224b..b5725ed86 100644
--- a/ts/deckoptions/EnumSelector.svelte
+++ b/ts/deckoptions/EnumSelector.svelte
@@ -3,19 +3,36 @@ Copyright: Ankitects Pty Ltd and contributors
License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
-->
-
-
- {#each choices as choice, idx}
- {choice}
- {/each}
-
-
+
+ {#each choices as choice, idx}
+ {choice}
+ {/each}
+
+
+
diff --git a/ts/deckoptions/EnumSelectorRow.svelte b/ts/deckoptions/EnumSelectorRow.svelte
new file mode 100644
index 000000000..6d07f9953
--- /dev/null
+++ b/ts/deckoptions/EnumSelectorRow.svelte
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/ts/deckoptions/GeneralOptions.svelte b/ts/deckoptions/GeneralOptions.svelte
deleted file mode 100644
index e1b2729e7..000000000
--- a/ts/deckoptions/GeneralOptions.svelte
+++ /dev/null
@@ -1,48 +0,0 @@
-
-
-
-{tr.deckConfigTimerTitle()}
-
-
-
-
-
-{tr.deckConfigAudioTitle()}
-
-
-
-
diff --git a/ts/deckoptions/HelpPopup.svelte b/ts/deckoptions/HelpPopup.svelte
deleted file mode 100644
index ddb1265d8..000000000
--- a/ts/deckoptions/HelpPopup.svelte
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
- {@html infoCircle}
-
-
-
diff --git a/ts/deckoptions/Label.svelte b/ts/deckoptions/Label.svelte
new file mode 100644
index 000000000..ff8d78eb2
--- /dev/null
+++ b/ts/deckoptions/Label.svelte
@@ -0,0 +1,20 @@
+
+
+
+
diff --git a/ts/deckoptions/LapseOptions.svelte b/ts/deckoptions/LapseOptions.svelte
index 2fee6b80f..f3c5d0872 100644
--- a/ts/deckoptions/LapseOptions.svelte
+++ b/ts/deckoptions/LapseOptions.svelte
@@ -4,12 +4,17 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
-->
-
-
{tr.schedulingLapses()}
+
+ -
+
+ {tr.deckConfigRelearningSteps()}
+
+
- ($config.relearnSteps = evt.detail.value)}
- />
+ -
+
+ {tr.schedulingMinimumInterval()}
+
-
+
+
-
+ -
+
+ {tr.schedulingLeechThreshold()}
+
+
-
-
+ -
+
+ {tr.schedulingLeechAction()}
+
+
+
diff --git a/ts/deckoptions/NewOptions.svelte b/ts/deckoptions/NewOptions.svelte
index a2e680bd7..b52a11d04 100644
--- a/ts/deckoptions/NewOptions.svelte
+++ b/ts/deckoptions/NewOptions.svelte
@@ -4,12 +4,17 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
-->
-{tr.schedulingNewCards()}
+
+ -
+
+ {tr.deckConfigLearningSteps()}
+
+
- ($config.learnSteps = evt.detail.value)}
-/>
+ -
+
+ {tr.schedulingGraduatingInterval()}
+
-
+
+
-
+ -
+
+ {tr.schedulingEasyInterval()}
+
-
+
+
+
+ -
+
+ {tr.deckConfigNewInsertionOrder()}
+
+
+
diff --git a/ts/deckoptions/RevertButton.svelte b/ts/deckoptions/RevertButton.svelte
index 29176ff95..4ac271012 100644
--- a/ts/deckoptions/RevertButton.svelte
+++ b/ts/deckoptions/RevertButton.svelte
@@ -4,68 +4,84 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
-->
-{#if modified}
-
+ createDropdown(event.detail.span)}
+ on:click={activateDropdown}
>
- {@html revertIcon}
-
-{/if}
+ {@html gearIcon}
+
+
+
+
diff --git a/ts/deckoptions/Row.svelte b/ts/deckoptions/Row.svelte
new file mode 100644
index 000000000..9acc04a48
--- /dev/null
+++ b/ts/deckoptions/Row.svelte
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/ts/deckoptions/SaveButton.svelte b/ts/deckoptions/SaveButton.svelte
index 945043dbc..52cda318b 100644
--- a/ts/deckoptions/SaveButton.svelte
+++ b/ts/deckoptions/SaveButton.svelte
@@ -69,7 +69,10 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
-
+ createDropdown(event.detail.button)}
+ on:click={activateDropdown}
+ />
diff --git a/ts/sass/BUILD.bazel b/ts/sass/BUILD.bazel
index 9c61c0b79..947413cd9 100644
--- a/ts/sass/BUILD.bazel
+++ b/ts/sass/BUILD.bazel
@@ -53,6 +53,14 @@ sass_library(
visibility = ["//visibility:public"],
)
+sass_library(
+ name = "night_mode_lib",
+ srcs = [
+ "night_mode.scss",
+ ],
+ visibility = ["//visibility:public"],
+)
+
exports_files(
["_vars.scss"],
visibility = ["//visibility:public"],
diff --git a/ts/sass/base.scss b/ts/sass/base.scss
index f3db5884e..5139aebeb 100644
--- a/ts/sass/base.scss
+++ b/ts/sass/base.scss
@@ -6,6 +6,19 @@ $body-bg: var(--window-bg);
$link-hover-color: var(--link);
$link-hover-decoration: none;
+$utilities: (
+ "opacity": (
+ property: opacity,
+ values: (
+ 0: 0,
+ 25: 0.25,
+ 50: 0.5,
+ 75: 0.75,
+ 100: 1,
+ ),
+ ),
+);
+
@import "ts/sass/bootstrap/bootstrap-reboot";
@import "ts/sass/bootstrap/bootstrap-utilities";
diff --git a/ts/sass/button_mixins.scss b/ts/sass/button_mixins.scss
index 3314b7056..9ca989f28 100644
--- a/ts/sass/button_mixins.scss
+++ b/ts/sass/button_mixins.scss
@@ -116,3 +116,7 @@ $focus-color: $blue;
box-shadow: inset 0 calc(var(--buttons-size) / 15) calc(var(--buttons-size) / 5)
rgba(black, $intensity);
}
+
+@function down-arrow($color) {
+ @return url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='transparent' stroke='#{$color}' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e");
+}
diff --git a/ts/sass/night_mode.scss b/ts/sass/night_mode.scss
new file mode 100644
index 000000000..3a7eff2dd
--- /dev/null
+++ b/ts/sass/night_mode.scss
@@ -0,0 +1,11 @@
+/* Copyright: Ankitects Pty Ltd and contributors
+ * License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html */
+
+@mixin input {
+ background-color: var(--frame-bg);
+ border-color: var(--border);
+
+ &:focus {
+ background-color: var(--window-bg);
+ }
+}