Desktop v2 screens: releases (store cards, stage stepper, rollout ring), submit checklist, TestFlight cards; listings as store pages with completeness, framed screenshots with issue badges, product cards, price matrix with gap shading; health tiles and issue cards, store-style review feed with rating distribution, growth funnel, readiness score with fix-first, tools grid, store-info sheet; settings, accounts, folders, dependencies and onboarding in the v2 language

This commit is contained in:
CRTkafa 2026-10-22 23:31:22 +08:00
parent ce939ee063
commit f131de9df2
47 changed files with 2309 additions and 927 deletions

View file

@ -5,7 +5,9 @@ import { withIgnored } from '../lib/identity';
import { useNav } from '../nav';
import { useData } from '../store';
import { Icon, StoreGlyph } from '../ui/icons';
import { AppIcon, Card, Empty, StoreOnlyTag, StudioMark } from '../ui/kit';
import { AppIcon, StoreOnlyTag, StudioMark } from '../ui/kit';
import { EmptyState, PageHeader, Section } from '../ui/ds';
import '../styles/folders.css';
export function Ignored() {
const d = useData();
@ -15,14 +17,11 @@ export function Ignored() {
const restoreAll = () => d.updateOverrides(o => ({ ...o, ignored: [] }));
const empty = !apps.length && !accounts.length;
return (
<div className="page">
<div className="ph">
<div><h1>{t('nav.ignored')}</h1><p>{t('ignored.lead')}</p></div>
{!empty && <div className="actions"><button className="btn" onClick={restoreAll}><Icon name="eye" />{t('ignored.restoreAll')}</button></div>}
</div>
{empty ? <Card pad={false}><Empty compact illo="shield" title={t('ignored.emptyTitle')}>{t('ignored.emptyText')}</Empty></Card> : (
<div className="page scr-ignored">
<PageHeader icon="eyeOff" eyebrow={t('v2cfg.workspace')} title={t('nav.ignored')} subtitle={t('ignored.lead')} actions={!empty ? <><button className="btn" onClick={restoreAll}><Icon name="eye" />{t('ignored.restoreAll')}</button></> : undefined} />
{empty ? <Section><EmptyState icon="shield" tone="ok"><b>{t('ignored.emptyTitle')}</b> {t('ignored.emptyText')}</EmptyState></Section> : (
<>
<Card title={t('ignored.apps')} icon="layers" sub={t('ignored.appsSub', { count: apps.length })} pad={false}>
<Section title={t('ignored.apps')} icon="layers" sub={t('ignored.appsSub', { count: apps.length })} pad={false}>
{apps.length ? (
<div className="list">
{apps.map(a => {
@ -44,8 +43,8 @@ export function Ignored() {
})}
</div>
) : <div className="card-body"><p className="small muted">{t('ignored.noApps')}</p></div>}
</Card>
<Card title={t('ignored.accounts')} icon="key" sub={t('ignored.accountsSub')} pad={false}>
</Section>
<Section title={t('ignored.accounts')} icon="key" sub={t('ignored.accountsSub')} pad={false}>
{accounts.length ? (
<div className="list">
{accounts.map(a => (
@ -57,7 +56,7 @@ export function Ignored() {
))}
</div>
) : <div className="card-body"><p className="small muted">{t('ignored.noAccounts')}</p></div>}
</Card>
</Section>
</>
)}
<p className="small muted">{t('ignored.howTo')} <button className="link" onClick={() => nav.go({ screen: 'settings', section: 'pairing' })}>{t('ignored.toPairing')}</button></p>