diff --git a/docker/frontend/src/App.tsx b/docker/frontend/src/App.tsx index 6df66f8..75e9b17 100644 --- a/docker/frontend/src/App.tsx +++ b/docker/frontend/src/App.tsx @@ -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': { diff --git a/docker/frontend/src/i18n/en.ts b/docker/frontend/src/i18n/en.ts index c33573d..4669d23 100644 --- a/docker/frontend/src/i18n/en.ts +++ b/docker/frontend/src/i18n/en.ts @@ -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', diff --git a/docker/frontend/src/i18n/vi.ts b/docker/frontend/src/i18n/vi.ts index fb25677..145cc9b 100644 --- a/docker/frontend/src/i18n/vi.ts +++ b/docker/frontend/src/i18n/vi.ts @@ -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',