项目文件夹

文件
wehub-resource-sync 2114b14ee0
Sync main into demo / sync (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:35:26 +08:00

86 行
2.4 KiB
TypeScript

import React from 'react';
import { CalcButton } from './CalcButton';
import { useCalculator2Store } from '../state';
import { useCalculator2Gestures } from '../hooks/useCalculator2Gestures';
import { colors } from '../res/colors';
import { strings } from '../res/strings';
/**
* 数字键盘 — 3列4行 grid
* 翻译自 AOSP pad_numeric.xml
*
* 7 8 9
* 4 5 6
* 1 2 3
* . 0 =
*/
interface NumericPadProps {
style?: React.CSSProperties;
}
export const NumericPad: React.FC<NumericPadProps> = ({ style }) => {
const inputDigit = useCalculator2Store(s => s.inputDigit);
const inputDecimal = useCalculator2Store(s => s.inputDecimal);
const onEvaluate = useCalculator2Store(s => s.onEvaluate);
const { bindAction } = useCalculator2Gestures();
const digits = [
['7', '8', '9'],
['4', '5', '6'],
['1', '2', '3'],
];
return (
<div
style={{
backgroundColor: 'var(--app-surface)',
display: 'grid',
gridTemplateColumns: 'repeat(3, 1fr)',
gridTemplateRows: 'repeat(4, 1fr)',
paddingTop: 'var(--app-pad-numeric-padding-top)',
paddingBottom: 'var(--app-pad-numeric-padding-bottom)',
paddingLeft: 'var(--app-pad-numeric-padding-sides)',
paddingRight: 'var(--app-pad-numeric-padding-sides)',
...style,
}}
>
{digits.flat().map(d => (
<CalcButton
key={d}
label={d}
fontSize="var(--app-numeric-button-text)"
textColor="var(--app-on-surface)"
rippleColor={colors.ripple}
onTrigger={() => inputDigit(d)}
{...bindAction(`digit.${d}`)}
/>
))}
{/* 底行: . 0 = */}
<CalcButton
label={strings.decimal}
fontSize="var(--app-numeric-button-text)"
textColor="var(--app-on-surface)"
rippleColor={colors.ripple}
onTrigger={inputDecimal}
{...bindAction('decimal')}
/>
<CalcButton
label="0"
fontSize="var(--app-numeric-button-text)"
textColor="var(--app-on-surface)"
rippleColor={colors.ripple}
onTrigger={() => inputDigit('0')}
{...bindAction('digit.0')}
/>
<CalcButton
label={strings.equals}
fontSize="var(--app-equals-button-text)"
textColor="var(--app-on-surface)"
rippleColor={colors.ripple}
onTrigger={onEvaluate}
{...bindAction('evaluate')}
/>
</div>
);
};