claude-code/components/permissions/AskUserQuestionPermissionRequest/QuestionNavigationBar.tsx

178 lines
22 KiB
TypeScript
Raw Normal View History

import { c as _c } from "react/compiler-runtime";
import figures from 'figures';
import React, { useMemo } from 'react';
import { useTerminalSize } from '../../../hooks/useTerminalSize.js';
import { stringWidth } from '../../../ink/stringWidth.js';
import { Box, Text } from '../../../ink.js';
import type { Question } from '../../../tools/AskUserQuestionTool/AskUserQuestionTool.js';
import { truncateToWidth } from '../../../utils/format.js';
type Props = {
questions: Question[];
currentQuestionIndex: number;
answers: Record<string, string>;
hideSubmitTab?: boolean;
};
export function QuestionNavigationBar(t0) {
const $ = _c(39);
const {
questions,
currentQuestionIndex,
answers,
hideSubmitTab: t1
} = t0;
const hideSubmitTab = t1 === undefined ? false : t1;
const {
columns
} = useTerminalSize();
let t2;
if ($[0] !== columns || $[1] !== currentQuestionIndex || $[2] !== hideSubmitTab || $[3] !== questions) {
bb0: {
const submitText = hideSubmitTab ? "" : ` ${figures.tick} Submit `;
const fixedWidth = stringWidth("\u2190 ") + stringWidth(" \u2192") + stringWidth(submitText);
const availableForTabs = columns - fixedWidth;
if (availableForTabs <= 0) {
let t3;
if ($[5] !== currentQuestionIndex || $[6] !== questions) {
let t4;
if ($[8] !== currentQuestionIndex) {
t4 = (q, index) => {
const header = q?.header || `Q${index + 1}`;
return index === currentQuestionIndex ? header.slice(0, 3) : "";
};
$[8] = currentQuestionIndex;
$[9] = t4;
} else {
t4 = $[9];
}
t3 = questions.map(t4);
$[5] = currentQuestionIndex;
$[6] = questions;
$[7] = t3;
} else {
t3 = $[7];
}
t2 = t3;
break bb0;
}
const tabHeaders = questions.map(_temp);
const idealWidths = tabHeaders.map(_temp2);
const totalIdealWidth = idealWidths.reduce(_temp3, 0);
if (totalIdealWidth <= availableForTabs) {
t2 = tabHeaders;
break bb0;
}
const currentHeader = tabHeaders[currentQuestionIndex] || "";
const currentIdealWidth = 4 + stringWidth(currentHeader);
const currentTabWidth = Math.min(currentIdealWidth, availableForTabs / 2);
const remainingWidth = availableForTabs - currentTabWidth;
const otherTabCount = questions.length - 1;
const widthPerOtherTab = Math.max(6, Math.floor(remainingWidth / Math.max(otherTabCount, 1)));
let t3;
if ($[10] !== currentQuestionIndex || $[11] !== currentTabWidth || $[12] !== widthPerOtherTab) {
t3 = (header_1, index_1) => {
if (index_1 === currentQuestionIndex) {
const maxTextWidth = currentTabWidth - 2 - 2;
return truncateToWidth(header_1, maxTextWidth);
} else {
const maxTextWidth_0 = widthPerOtherTab - 2 - 2;
return truncateToWidth(header_1, maxTextWidth_0);
}
};
$[10] = currentQuestionIndex;
$[11] = currentTabWidth;
$[12] = widthPerOtherTab;
$[13] = t3;
} else {
t3 = $[13];
}
t2 = tabHeaders.map(t3);
}
$[0] = columns;
$[1] = currentQuestionIndex;
$[2] = hideSubmitTab;
$[3] = questions;
$[4] = t2;
} else {
t2 = $[4];
}
const tabDisplayTexts = t2;
const hideArrows = questions.length === 1 && hideSubmitTab;
let t3;
if ($[14] !== currentQuestionIndex || $[15] !== hideArrows) {
t3 = !hideArrows && <Text color={currentQuestionIndex === 0 ? "inactive" : undefined}>{" "}</Text>;
$[14] = currentQuestionIndex;
$[15] = hideArrows;
$[16] = t3;
} else {
t3 = $[16];
}
let t4;
if ($[17] !== answers || $[18] !== currentQuestionIndex || $[19] !== questions || $[20] !== tabDisplayTexts) {
let t5;
if ($[22] !== answers || $[23] !== currentQuestionIndex || $[24] !== tabDisplayTexts) {
t5 = (q_1, index_2) => {
const isSelected = index_2 === currentQuestionIndex;
const isAnswered = q_1?.question && !!answers[q_1.question];
const checkbox = isAnswered ? figures.checkboxOn : figures.checkboxOff;
const displayText = tabDisplayTexts[index_2] || q_1?.header || `Q${index_2 + 1}`;
return <Box key={q_1?.question || `question-${index_2}`}>{isSelected ? <Text backgroundColor="permission" color="inverseText">{" "}{checkbox} {displayText}{" "}</Text> : <Text>{" "}{checkbox} {displayText}{" "}</Text>}</Box>;
};
$[22] = answers;
$[23] = currentQuestionIndex;
$[24] = tabDisplayTexts;
$[25] = t5;
} else {
t5 = $[25];
}
t4 = questions.map(t5);
$[17] = answers;
$[18] = currentQuestionIndex;
$[19] = questions;
$[20] = tabDisplayTexts;
$[21] = t4;
} else {
t4 = $[21];
}
let t5;
if ($[26] !== currentQuestionIndex || $[27] !== hideSubmitTab || $[28] !== questions.length) {
t5 = !hideSubmitTab && <Box key="submit">{currentQuestionIndex === questions.length ? <Text backgroundColor="permission" color="inverseText">{" "}{figures.tick} Submit{" "}</Text> : <Text> {figures.tick} Submit </Text>}</Box>;
$[26] = currentQuestionIndex;
$[27] = hideSubmitTab;
$[28] = questions.length;
$[29] = t5;
} else {
t5 = $[29];
}
let t6;
if ($[30] !== currentQuestionIndex || $[31] !== hideArrows || $[32] !== questions.length) {
t6 = !hideArrows && <Text color={currentQuestionIndex === questions.length ? "inactive" : undefined}>{" "}</Text>;
$[30] = currentQuestionIndex;
$[31] = hideArrows;
$[32] = questions.length;
$[33] = t6;
} else {
t6 = $[33];
}
let t7;
if ($[34] !== t3 || $[35] !== t4 || $[36] !== t5 || $[37] !== t6) {
t7 = <Box flexDirection="row" marginBottom={1}>{t3}{t4}{t5}{t6}</Box>;
$[34] = t3;
$[35] = t4;
$[36] = t5;
$[37] = t6;
$[38] = t7;
} else {
t7 = $[38];
}
return t7;
}
function _temp3(sum, w) {
return sum + w;
}
function _temp2(header_0) {
return 4 + stringWidth(header_0);
}
function _temp(q_0, index_0) {
return q_0?.header || `Q${index_0 + 1}`;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmaWd1cmVzIiwiUmVhY3QiLCJ1c2VNZW1vIiwidXNlVGVybWluYWxTaXplIiwic3RyaW5nV2lkdGgiLCJCb3giLCJUZXh0IiwiUXVlc3Rpb24iLCJ0cnVuY2F0ZVRvV2lkdGgiLCJQcm9wcyIsInF1ZXN0aW9ucyIsImN1cnJlbnRRdWVzdGlvbkluZGV4IiwiYW5zd2VycyIsIlJlY29yZCIsImhpZGVTdWJtaXRUYWIiLCJRdWVzdGlvbk5hdmlnYXRpb25CYXIiLCJ0MCIsIiQiLCJfYyIsInQxIiwidW5kZWZpbmVkIiwiY29sdW1ucyIsInQyIiwiYmIwIiwic3VibWl0VGV4dCIsInRpY2siLCJmaXhlZFdpZHRoIiwiYXZhaWxhYmxlRm9yVGFicyIsInQzIiwidDQiLCJxIiwiaW5kZXgiLCJoZWFkZXIiLCJzbGljZSIsIm1hcCIsInRhYkhlYWRlcnMiLCJfdGVtcCIsImlkZWFsV2lkdGhzIiwiX3RlbXAyIiwidG90YWxJZGVhbFdpZHRoIiwicmVkdWNlIiwiX3RlbXAzIiwiY3VycmVudEhlYWRlciIsImN1cnJlbnRJZGVhbFdpZHRoIiwiY3VycmVudFRhYldpZHRoIiwiTWF0aCIsIm1pbiIsInJlbWFpbmluZ1dpZHRoIiwib3RoZXJUYWJDb3VudCIsImxlbmd0aCIsIndpZHRoUGVyT3RoZXJUYWIiLCJtYXgiLCJmbG9vciIsImhlYWRlcl8xIiwiaW5kZXhfMSIsIm1heFRleHRXaWR0aCIsIm1heFRleHRXaWR0aF8wIiwidGFiRGlzcGxheVRleHRzIiwiaGlkZUFycm93cyIsInQ1IiwicV8xIiwiaW5kZXhfMiIsImlzU2VsZWN0ZWQiLCJpc0Fuc3dlcmVkIiwicXVlc3Rpb24iLCJjaGVja2JveCIsImNoZWNrYm94T24iLCJjaGVja2JveE9mZiIsImRpc3BsYXlUZXh0IiwidDYiLCJ0NyIsInN1bSIsInciLCJoZWFkZXJfMCIsInFfMCIsImluZGV4XzAiXSwic291cmNlcyI6WyJRdWVzdGlvbk5hdmlnYXRpb25CYXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmaWd1cmVzIGZyb20gJ2ZpZ3VyZXMnXG5pbXBvcnQgUmVhY3QsIHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlVGVybWluYWxTaXplIH0gZnJvbSAnLi4vLi4vLi4vaG9va3MvdXNlVGVybWluYWxTaXplLmpzJ1xuaW1wb3J0IHsgc3RyaW5nV2lkdGggfSBmcm9tICcuLi8uLi8uLi9pbmsvc3RyaW5nV2lkdGguanMnXG5pbXBvcnQgeyBCb3gsIFRleHQgfSBmcm9tICcuLi8uLi8uLi9pbmsuanMnXG5pbXBvcnQgdHlwZSB7IFF1ZXN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vdG9vbHMvQXNrVXNlclF1ZXN0aW9uVG9vbC9Bc2tVc2VyUXVlc3Rpb25Ub29sLmpzJ1xuaW1wb3J0IHsgdHJ1bmNhdGVUb1dpZHRoIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvZm9ybWF0LmpzJ1xuXG50eXBlIFByb3BzID0ge1xuICBxdWVzdGlvbnM6IFF1ZXN0aW9uW11cbiAgY3VycmVudFF1ZXN0aW9uSW5kZXg6IG51bWJlclxuICBhbnN3ZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gIGhpZGVTdWJtaXRUYWI/OiBib29sZWFuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBRdWVzdGlvbk5hdmlnYXRpb25CYXIoe1xuICBxdWVzdGlvbnMsXG4gIGN1cnJlbnRRdWVzdGlvbkluZGV4LFxuICBhbnN3ZXJzLFxuICBoaWRlU3VibWl0VGFiID0gZmFsc2UsXG59OiBQcm9wcyk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gIGNvbnN0IHsgY29sdW1ucyB9ID0gdXNlVGVybWluYWxTaXplKClcblxuICAvLyBDYWxjdWxhdGUgdGhlIGRpc3BsYXkgdGV4dCBmb3IgZWFjaCB0YWIgYmFzZWQgb24gYXZhaWxhYmxlIHdpZHRoXG4gIGNvbnN0IHRhYkRpc3BsYXlUZXh0cyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIC8vIENhbGN1bGF0ZSBmaXhlZCB3aWR0aCBlbGVtZW50c1xuICAgIGNvbnN0IGxlZnRBcnJvdyA9ICfihpAgJ1xuICAgIGNvbnN0IHJpZ2h0QXJyb3cgPSAnIOKGkidcbiAgICBjb25zdCBzdWJtaXRUZXh0ID0gaGlkZVN1Ym1pdFRhYiA/ICcnIDogYCAke2ZpZ3VyZXMudGlja30gU3VibWl0IGBcbiAgICBjb25zdCBjaGVja2JveFdpZHRoID0gMiAvLyBjaGVja2JveCArIHNwYWNlXG4gICAgY29uc3QgcGFkZGluZ1BlclRhYiA9IDIgLy8gc3BhY2UgYmVmb3JlIGFuZCBhZnRlciBlYWNoIHRhYiB0ZXh0XG5cbiAgICBjb25zdCBmaXhlZFdpZHRoID1cbiAgICAgIHN0cmluZ1dpZHRoKGxlZnRBcnJvdykgKyBzdHJpbmdXaWR0aChyaWdodEFycm93KSArIHN0cmluZ1dpZHRoKHN1Ym1pdFRleHQpXG5cbiAgICAvLyBBdmFpbGFibGUgd2lkdGggZm9yIGFsbCBxdWVzdGlvbiB0YWJzXG4gICAgY29uc3QgYXZhaWxhYmxlRm9yVGFicyA9IGNvbHVtbnMgLSBmaXhlZFdpZHRoXG5cbiAgICBpZiAoYXZhaWxhYmxlRm9yVGFicyA8PSAwKSB7XG4gICAgICAvLyBUZXJtaW5hbCB0b28gbmFycm93LCBmYWxsYmFjayB0byBtaW5pbWFsIGRpc3BsYXlcbiAgICAgIHJldHVybiBxdWVzdGlvbnMubWFwKChxOiBRdWVzdGlvbiwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCBoZWFkZXIgPSBxPy5oZWFkZXIgfHwgYFEke2luZGV4ICsgMX1gXG4gICAgICAgIHJldHVybiBpbmRleCA9PT0gY3VycmVudFF1ZXN0aW9uSW5kZXggPyBoZWFkZXIuc2xpY2UoMCwgMykgOiAnJ1xuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBDYWxjdWxhdGUgaWRlYWwgd2lkdGggZm9yIGVhY2ggdGFiIChjaGVja2JveCArIHBhZGRpbmcgKyB0ZXh0KVxuICAgIGNvbnN0IHRhYkhlYWRlcnMgPSBxdWVzdGlvbnMubWFwKFxuICAgICAgKHE6IFF1ZXN0aW9uLCBpbmRleDogbnVtYmVyKSA9PiBxPy5oZWFkZXIgfHwgYFEke2luZGV4ICsgMX1gLFxuICAgIClcbiAgICBjb25zdCBpZGVhbFdpZHRocyA9IHRhYkhlYWRlcnMubWFwKFxuICAgICAgaGVhZGVyID0+IGNoZWNrYm94V2lkdGggKyBwYWRkaW5nUGVyVGFiICsgc3RyaW5nV2lkdGgoaGVhZGVyKSxcbiAgICApXG5cbiAgICAvLyBDYWxjdWxhdGUgdG90YWwgaWRlYWwgd2lkdGhcbiAgICBjb25zdCB0b3RhbElkZWFsV2lkdGggPSBpZGVhbFdpZHRocy5yZWR1Y2UoKHN1bSwgdykgPT4gc3VtICsgdywgMClcblxuICAgIC8vIElmIGV2ZXJ5dGhpbmcgZml0cywgdXNlIGZ1bGwgaGVhZGVyc1xuICAgIGlmICh0b3RhbElkZWFsV2lkdGg