TOOLS: AUTO and MONOCHROME come with any account, FIX and GRADIENT MASK stay PRO and answer with the reason

This commit is contained in:
2026-09-30 12:20:03 +07:00
parent a3175210f9
commit 61b1210a47
3 changed files with 42 additions and 28 deletions
+38 -26
View File
@@ -2815,38 +2815,50 @@ export function Workspace() {
//
// Nothing here is a knob, so the tab is this row alone: the strip a chip
// opens is the last column's (see stripChips), the same as anywhere else.
// The whole tab is PRO — the four write to the frame as the phone's own
// edition does — so a basic account is offered the reason instead.
if (!pro) return [{ key: 'tools-pro', label: t('pro.toolsChip'), pro: true, onClick: promptPro }];
// AUTO and MONOCHROME come with any account — one lands a set of numbers
// on the frame, the other swaps the stock for the mono one. FIX and
// GRADIENT MASK take the pointer on the frame the way the phone's own
// edition does, and those two are PRO: a basic account is offered the
// reason in their place, so the row keeps its four marks either way.
const locked = (key: string, label: string): ChipDef => ({
key: `${key}-pro`,
label,
pro: true,
onClick: promptPro,
});
return [
{ key: 'auto', label: '✦ AUTO', onClick: () => void autoTune() },
// FX's tools are not looks: each is a strip of its own, opened from the
// row. FIX repairs a speck of dust, MOSAIC hides a patch, GRADIENT MASK
// draws a shape; the strip's own chip carries the name and glows amber
// while there is something inside it to clear.
{
key: 'fix',
label: '✚ FIX',
active: openGroup === 'fix',
amberValue: healSpots.length > 0 || mosaicSpots.length > 0,
onClick: () => {
// The tools that take the pointer on the photo never share it.
setPicking(false);
setBrushTool(null);
toggleGroup('fix');
},
},
{
key: 'gradient-mask',
label: '▚ GRADIENT MASK',
active: openGroup === 'gradient',
amberValue: masks.length > 0,
onClick: () => {
setPicking(false);
setBrushTool(null);
toggleGroup('gradient');
},
},
pro
? {
key: 'fix',
label: '✚ FIX',
active: openGroup === 'fix',
amberValue: healSpots.length > 0 || mosaicSpots.length > 0,
onClick: () => {
// The tools that take the pointer on the photo never share it.
setPicking(false);
setBrushTool(null);
toggleGroup('fix');
},
}
: locked('fix', t('pro.fixChip')),
pro
? {
key: 'gradient-mask',
label: '▚ GRADIENT MASK',
active: openGroup === 'gradient',
amberValue: masks.length > 0,
onClick: () => {
setPicking(false);
setBrushTool(null);
toggleGroup('gradient');
},
}
: locked('gradient-mask', t('pro.gradientChip')),
{ key: 'mono', label: '◑ MONOCHROME', active: monoOn, onClick: toggleMono },
];
case 'hsl': {
+2 -1
View File
@@ -154,7 +154,8 @@ export const en: Dict = {
// bar), one reason per locked tab (the chips), and one answer for a click on
// either of them.
'pro.hslChip': 'HSL IS A PRO FEATURE',
'pro.toolsChip': 'TOOLS & GRADIENT MASK ARE PRO FEATURES',
'pro.fixChip': 'FIX IS A PRO FEATURE',
'pro.gradientChip': 'GRADIENT MASK IS A PRO FEATURE',
'pro.basicBar': 'Account {email} is on the basic tier — PRO features need an account the operator has activated.',
'pro.locked': 'PRO feature — this account has not been activated. Ask the operator to tick "Activated Pro".',
'pro.resend': 'RESEND VERIFICATION EMAIL',
+2 -1
View File
@@ -167,7 +167,8 @@ export const vi = {
// bar), one reason per locked tab (the chips), and one answer for a click on
// either of them.
'pro.hslChip': 'HSL LÀ TÍNH NĂNG PRO',
'pro.toolsChip': 'TOOLS & GRADIENT MASK LÀ TÍNH NĂNG PRO',
'pro.fixChip': 'FIX LÀ TÍNH NĂNG PRO',
'pro.gradientChip': 'GRADIENT MASK LÀ TÍNH NĂNG PRO',
'pro.basicBar': 'Tài khoản {email} đang ở bản cơ bản — tính năng PRO cần tài khoản được kích hoạt.',
'pro.locked': 'Tính năng PRO — tài khoản chưa được kích hoạt. Nhờ quản trị viên tích "Kích hoạt PRO".',
'pro.resend': 'GỬI LẠI EMAIL XÁC THỰC',