feat(voice): microphone in the add-task and add-item rows; phone fixes in the column dialog
MindSift CI & Docker Release / Build, Test in Container & Push (push) Successful in 1m38s

VoiceInputButton brings the Quick Dump microphone into other input rows (useVoiceInput, appends
to the text already there, hidden when voice input is off or unsupported): the add-task row above
the task list and the add-item field of lists (desktop row and phone sheet).

Column dialog on phones: the add-column buttons go below the field, and the Erledigt toggle of a
column shows only its tick, so the bin stays on screen. Docs and changelog; v0.32.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
sandrodachandClaude Opus 5.5 committed 2026-11-01 11:17:49 +01:00
1 parent 08081e6c1d
commit 83b3f27b3e
9 files changed
+168 -44

No files matched your search

@@ -17,6 +17,7 @@ import { UnifiedShareModal } from '../../components/UnifiedShareModal';
import { AvatarStack, AvatarPerson } from '../../components/AvatarStack';
import { CountBadge } from '../../components/CountBadge';
import { OriginBadge } from '../../components/OriginBadge';
import { VoiceInputButton } from '../../components/VoiceInputButton';
import { FormSheet } from '../../components/FormSheet';
import { useMobileActions } from '../../context/MobileActionContext';
@@ -102,6 +103,7 @@ export const SharedListsView: React.FC<SharedListsViewProps> = ({ onRefreshGloba
const [newItemText, setNewItemText] = useState('');
const [newItemQty, setNewItemQty] = useState('');
const [itemVoiceError, setItemVoiceError] = useState<string | null>(null);
const [isSubmittingItem, setIsSubmittingItem] = useState(false);
const [editingQtyItemId, setEditingQtyItemId] = useState<string | null>(null);
const [editingQtyValue, setEditingQtyValue] = useState('');
@@ -955,9 +957,19 @@ export const SharedListsView: React.FC<SharedListsViewProps> = ({ onRefreshGloba
onBlur={() => {
setTimeout(() => setShowSuggestions(false), 200);
}}
placeholder={`Was soll auf „${activeList.title}“? (z. B. Hafermilch #Kühlregal)`}
placeholder={itemVoiceError || `Was soll auf „${activeList.title}“? (z. B. Hafermilch #Kühlregal)`}
// 16px on phones: iOS zooms into smaller fields and the layout jumps under the keyboard
className="w-full h-11 sm:h-9 pl-9 pr-3 input-field text-base sm:text-sm"
className="w-full h-11 sm:h-9 pl-9 pr-11 sm:pr-9 input-field text-base sm:text-sm"
/>
<VoiceInputButton
value={newItemText}
onChange={setNewItemText}
focusRef={inputRef}
onError={(message) => {
setItemVoiceError(message);
window.setTimeout(() => setItemVoiceError(null), 4000);
}}
className="absolute right-1 top-1/2 -translate-y-1/2"
/>
{/* Hashtag Autocomplete Suggestions Dropdown */}