Anki/ts/components/DropdownItem.svelte
Henrik Giesel 8f8f3bd465
Insert symbols overlay (#2051)
* Add flag for enabling insert symbols feature

* Add symbols overlay directory

* Detect if :xy is inserted into editable

* Allow naive updating of overlay, and special handling of ':'

* First step towards better Virtual Element support

* Update floating to reference range on insert text

* Position SymbolsOverlay always on top or bottom

* Add a data-provider to emulate API

* Show correct suggestions in symbols overlay

* Rename to replacementLength

* Allow replacing via clicking in menu

* Optionally remove inline padding of Popover

* Hide Symbols overlay on blur of content editable

* Add specialKey to inputHandler and generalize how arrow movement is detected

- This way macOS users can use Ctrl-N to mean down, etc.

* Detect special key from within SymbolsOverlay

* Implement full backwards search while typing

* Allow navigating symbol menu and accepting with enter

* Add some entries to data-provider

* Satisfy eslint

* Generate symbolsTable from sources

* Use other github source, allow multiple names

In return, symbol must be unique

* Automatically scroll in symbols dropdown

* Use from npm packages rather than downloading from URL

* Remove console.log

* Remove print

* Add pointerDown event to input-handler

- so that SymbolsOverlay can reset on field click

* Make tab do the same as enter

* Make font a bit smaller but increase relative icon size

* Satisfy type requirement of handlerlist

* Revert changing default size of DropdownItems

* Remove some now unused code for bootstrap dropdowns
2022-09-10 18:46:59 +10:00

81 lines
1.7 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 { pageTheme } from "../sveltelib/theme";
export let id: string | undefined = undefined;
let className = "";
export { className as class };
let buttonRef: HTMLButtonElement;
export let tooltip: string | undefined = undefined;
export let active = false;
$: if (buttonRef && active) {
/* buttonRef.scrollIntoView({ behavior: "smooth", block: "start" }); */
/* TODO will not work on Gecko */
(buttonRef as any).scrollIntoViewIfNeeded({
behavior: "smooth",
block: "start",
});
}
export let tabbable = false;
</script>
<button
bind:this={buttonRef}
{id}
tabindex={tabbable ? 0 : -1}
class="dropdown-item {className}"
class:active
class:btn-day={!$pageTheme.isDark}
class:btn-night={$pageTheme.isDark}
title={tooltip}
on:mouseenter
on:focus
on:keydown
on:click
on:mousedown|preventDefault
>
<slot />
</button>
<style lang="scss">
@use "sass/button-mixins" as button;
button {
display: flex;
justify-content: start;
font-size: var(--dropdown-font-size, calc(0.8 * var(--base-font-size)));
background: none;
box-shadow: none !important;
border: none;
border-radius: 0;
&:active,
&.active {
background-color: button.$focus-color;
color: white;
}
}
.btn-day {
color: black;
}
.btn-night {
color: white;
&:hover,
&:focus {
@include button.btn-night-base;
}
}
</style>