feat: release version 1.0.5

This commit is contained in:
2026-08-20 14:30:22 +09:00
parent f910db8901
commit 6537ab1f20
35 changed files with 1151 additions and 181 deletions
+35 -1
View File
@@ -324,6 +324,35 @@
if (boardViewport.hasPointerCapture(event.pointerId)) boardViewport.releasePointerCapture(event.pointerId);
}
function finishBoardMemberChange() {
selectedSocketGroupId = '';
efficiencyFocusGroupId = '';
boardDragging = false;
void fitBoardViewport();
}
function selectAdjacentBoardMember(offset: -1 | 1) {
if (boardMembers.length < 2) return;
const currentIndex = boardMembers.findIndex((member) => member.id === selectedMemberId);
const nextIndex = (Math.max(0, currentIndex) + offset + boardMembers.length) % boardMembers.length;
selectedMemberId = boardMembers[nextIndex].id;
finishBoardMemberChange();
}
function isKeyboardInputTarget(target: EventTarget | null): boolean {
if (!(target instanceof HTMLElement)) return false;
return Boolean(target.closest('input, textarea, select, [contenteditable="true"], [contenteditable="plaintext-only"]'));
}
function handleBoardKeyboardNavigation(event: KeyboardEvent) {
if (dataView !== 'boards' || event.defaultPrevented || event.repeat || event.isComposing
|| event.ctrlKey || event.metaKey || event.altKey || isKeyboardInputTarget(event.target)) return;
const key = event.key.toLowerCase();
if (key !== 'a' && key !== 'd') return;
event.preventDefault();
selectAdjacentBoardMember(key === 'a' ? -1 : 1);
}
function persist(next = userData) {
userData = saveBrowserData(next);
greenEfficiencyResult = null;
@@ -971,6 +1000,8 @@
}
</script>
<svelte:window on:keydown={handleBoardKeyboardNavigation} />
<svelte:head>
<title>사용자 데이터 | 홀로도리 계산기</title>
<meta name="description" content="홀로도리 사용자 데이터와 백업을 관리합니다." />
@@ -1289,9 +1320,10 @@
<div class="board-heading">
<label class="member-select">
<span>멤버 선택</span>
<select bind:value={selectedMemberId} on:change={() => { selectedSocketGroupId = ''; efficiencyFocusGroupId = ''; fitBoardViewport(); }}>
<select bind:value={selectedMemberId} on:change={finishBoardMemberChange}>
{#each boardMembers as member}<option value={member.id}>{member.name}</option>{/each}
</select>
<small><kbd>A</kbd> 이전 멤버 · <kbd>D</kbd> 다음 멤버</small>
</label>
</div>
@@ -1511,6 +1543,8 @@
.member-select { display: grid; gap: 5px; width: min(360px, 100%); }
.member-select span { color: #818b9c; font-size: 12px; font-weight: 750; }
.member-select select { height: 38px; padding: 0 10px; border: 1px solid #394252; border-radius: 8px; color: #dfe3ea; background: #12171f; }
.member-select small { color: #6f7888; font-size: 11px; }
.member-select kbd { display: inline-grid; min-width: 18px; height: 18px; padding: 0 4px; place-items: center; border: 1px solid #465064; border-bottom-width: 2px; border-radius: 4px; color: #c9d0dc; background: #171d27; font: 700 10px/1 Pretendard, "Noto Sans KR", sans-serif; }
.board-toolbar { display: flex; align-items: center; justify-content: space-between; margin: 20px 0 10px; }
.board-toolbar p { margin: 0; color: #929cad; font-size: 14px; }
.board-toolbar p strong { color: #f0a1c2; font-size: 16px; }