[focus] call focus() as well for android

This commit is contained in:
Piotr Domański 2026-04-16 11:52:27 +02:00
parent 4eef8a0f05
commit f4cf2b89e0
7 changed files with 62 additions and 0 deletions

View file

@ -24,6 +24,16 @@
let presetOpen = $state(false); let presetOpen = $state(false);
let presetName = $state(""); let presetName = $state("");
let presetNameInput = $state<HTMLInputElement | null>(null);
let renameNameInput = $state<HTMLInputElement | null>(null);
$effect(() => {
if (presetOpen) setTimeout(() => presetNameInput?.focus(), 50);
});
$effect(() => {
if (renameOpen) setTimeout(() => renameNameInput?.focus(), 50);
});
function openRename() { function openRename() {
renameName = meal.name; renameName = meal.name;
renameOpen = true; renameOpen = true;
@ -244,6 +254,7 @@
<div> <div>
<label class="block text-sm text-zinc-400 mb-1.5">Preset name</label> <label class="block text-sm text-zinc-400 mb-1.5">Preset name</label>
<input <input
bind:this={presetNameInput}
type="text" type="text"
bind:value={presetName} bind:value={presetName}
required required
@ -268,6 +279,7 @@
> >
<form onsubmit={handleRename} class="space-y-4"> <form onsubmit={handleRename} class="space-y-4">
<input <input
bind:this={renameNameInput}
type="text" type="text"
bind:value={renameName} bind:value={renameName}
required required

View file

@ -35,6 +35,7 @@
if (open) { if (open) {
query = ""; query = "";
selectedIdx = 0; selectedIdx = 0;
setTimeout(() => inputEl?.focus(), 50);
} }
}); });

View file

@ -36,6 +36,11 @@
let gramsInput = $state<HTMLInputElement | null>(null); let gramsInput = $state<HTMLInputElement | null>(null);
$effect(() => {
if (!selectedProduct) setTimeout(() => searchInput?.focus(), 50);
else setTimeout(() => gramsInput?.focus(), 50);
});
function handleSearch(value: string) { function handleSearch(value: string) {
q = value; q = value;
clearTimeout(debounceTimer); clearTimeout(debounceTimer);

View file

@ -24,6 +24,13 @@
let presetTimer: ReturnType<typeof setTimeout>; let presetTimer: ReturnType<typeof setTimeout>;
let submitting = $state(false); let submitting = $state(false);
let error = $state(""); let error = $state("");
let mealNameInput = $state<HTMLInputElement | null>(null);
let presetQInput = $state<HTMLInputElement | null>(null);
$effect(() => {
if (tab === "new") setTimeout(() => mealNameInput?.focus(), 50);
else setTimeout(() => presetQInput?.focus(), 50);
});
function handlePresetSearch(v: string) { function handlePresetSearch(v: string) {
presetQ = v; presetQ = v;
@ -93,6 +100,7 @@
>Meal name <span class="text-zinc-600">(optional)</span></label >Meal name <span class="text-zinc-600">(optional)</span></label
> >
<input <input
bind:this={mealNameInput}
id="meal-name" id="meal-name"
type="text" type="text"
bind:value={mealName} bind:value={mealName}
@ -117,6 +125,7 @@
<!-- Preset search --> <!-- Preset search -->
<div class="px-4 py-3 border-b border-zinc-800"> <div class="px-4 py-3 border-b border-zinc-800">
<input <input
bind:this={presetQInput}
type="search" type="search"
placeholder="Search presets…" placeholder="Search presets…"
value={presetQ} value={presetQ}

View file

@ -32,6 +32,10 @@
let gramsInput = $state<HTMLInputElement | null>(null); let gramsInput = $state<HTMLInputElement | null>(null);
$effect(() => {
setTimeout(() => gramsInput?.focus(), 50);
});
const preview = $derived( const preview = $derived(
entry entry
? { ? {

View file

@ -73,6 +73,11 @@
let creating = $state<boolean>(false); let creating = $state<boolean>(false);
let creatingName = $state(""); let creatingName = $state("");
let creatingSaving = $state(false); let creatingSaving = $state(false);
let creatingNameInput = $state<HTMLInputElement | null>(null);
$effect(() => {
if (creating) setTimeout(() => creatingNameInput?.focus(), 50);
});
async function handleCreate() { async function handleCreate() {
creatingSaving = true; creatingSaving = true;
@ -105,6 +110,11 @@
let renamePreset_: Preset | null = $state(null); let renamePreset_: Preset | null = $state(null);
let renameName = $state(""); let renameName = $state("");
let renaming = $state(false); let renaming = $state(false);
let renameNameInput = $state<HTMLInputElement | null>(null);
$effect(() => {
if (renamePreset_) setTimeout(() => renameNameInput?.focus(), 50);
});
function openRename(preset: Preset) { function openRename(preset: Preset) {
renamePreset_ = preset; renamePreset_ = preset;
@ -132,6 +142,10 @@
let editSaving = $state(false); let editSaving = $state(false);
let editGramsInput = $state<HTMLInputElement | null>(null); let editGramsInput = $state<HTMLInputElement | null>(null);
$effect(() => {
if (editingEntry) setTimeout(() => editGramsInput?.focus(), 50);
});
function openEditEntry(presetId: number, entry: PresetEntry) { function openEditEntry(presetId: number, entry: PresetEntry) {
editingEntry = { presetId, entry }; editingEntry = { presetId, entry };
editGrams = entry.grams; editGrams = entry.grams;
@ -169,6 +183,14 @@
let addGrams = $state(100); let addGrams = $state(100);
let addSaving = $state(false); let addSaving = $state(false);
let addGramsInput = $state<HTMLInputElement | null>(null); let addGramsInput = $state<HTMLInputElement | null>(null);
let productQInput = $state<HTMLInputElement | null>(null);
$effect(() => {
if (addEntryPresetId !== null && selectedProduct === null)
setTimeout(() => productQInput?.focus(), 50);
else if (selectedProduct !== null)
setTimeout(() => addGramsInput?.focus(), 50);
});
function openAddEntry(presetId: number) { function openAddEntry(presetId: number) {
addEntryPresetId = presetId; addEntryPresetId = presetId;
@ -490,6 +512,7 @@
> >
<form onsubmit={handleCreate} class="space-y-4"> <form onsubmit={handleCreate} class="space-y-4">
<input <input
bind:this={creatingNameInput}
type="text" type="text"
bind:value={creatingName} bind:value={creatingName}
required required
@ -514,6 +537,7 @@
> >
<form onsubmit={handleRename} class="space-y-4"> <form onsubmit={handleRename} class="space-y-4">
<input <input
bind:this={renameNameInput}
type="text" type="text"
bind:value={renameName} bind:value={renameName}
required required
@ -597,6 +621,7 @@
<!-- Product search --> <!-- Product search -->
<div class="space-y-3"> <div class="space-y-3">
<input <input
bind:this={productQInput}
type="search" type="search"
placeholder="Search foods…" placeholder="Search foods…"
value={productQ} value={productQ}

View file

@ -11,6 +11,11 @@
let fiber = $state(0); let fiber = $state(0);
let submitting = $state(false); let submitting = $state(false);
let error = $state(""); let error = $state("");
let nameInput = $state<HTMLInputElement | null>(null);
$effect(() => {
setTimeout(() => nameInput?.focus(), 50);
});
// calories = protein×4 + carb×4 + fat×9 + fiber×2 // calories = protein×4 + carb×4 + fat×9 + fiber×2
const calories = $derived( const calories = $derived(
@ -48,6 +53,7 @@
<div> <div>
<label for="name" class="block text-sm text-zinc-400 mb-2">Name</label> <label for="name" class="block text-sm text-zinc-400 mb-2">Name</label>
<input <input
bind:this={nameInput}
id="name" id="name"
type="text" type="text"
bind:value={name} bind:value={name}