feat: release version 1.0.5
This commit is contained in:
@@ -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; }
|
||||
|
||||
Reference in New Issue
Block a user