diff --git a/apps/desktop/src/card/Card.tsx b/apps/desktop/src/card/Card.tsx index f7b3c80..a07e633 100644 --- a/apps/desktop/src/card/Card.tsx +++ b/apps/desktop/src/card/Card.tsx @@ -1,6 +1,15 @@ // The tray card: store status at a glance next to the tray icon. It only draws the main window's snapshot (card_get / // `card-snapshot`) and sends its buttons back (card_action); Refresh is the main window's own Refresh all. -import { ArrowsClockwise, ArrowSquareOut, BellSlash, Bell, DotsThree, Power, Star, WarningOctagon, Pulse, AppWindow } from '@phosphor-icons/react'; +import { ArrowsClockwiseIcon } from '@phosphor-icons/react/dist/csr/ArrowsClockwise'; +import { ArrowSquareOutIcon } from '@phosphor-icons/react/dist/csr/ArrowSquareOut'; +import { BellSlashIcon } from '@phosphor-icons/react/dist/csr/BellSlash'; +import { BellIcon } from '@phosphor-icons/react/dist/csr/Bell'; +import { DotsThreeIcon } from '@phosphor-icons/react/dist/csr/DotsThree'; +import { PowerIcon } from '@phosphor-icons/react/dist/csr/Power'; +import { StarIcon } from '@phosphor-icons/react/dist/csr/Star'; +import { WarningOctagonIcon } from '@phosphor-icons/react/dist/csr/WarningOctagon'; +import { PulseIcon } from '@phosphor-icons/react/dist/csr/Pulse'; +import { AppWindowIcon } from '@phosphor-icons/react/dist/csr/AppWindow'; import { useCallback, useEffect, useRef, useState, type KeyboardEvent, type ReactNode } from 'react'; import type { CardApp, CardRelease, CardSnapshot, CardStore } from './model'; import { ago, cardT, type CardKey, type CardLang } from './text'; @@ -54,18 +63,18 @@ export function Card({ host, lang }: { host: CardHost; lang: CardLang }) {
{T('title')} - {s?.muted && {T('muted')}}{T('lastRead', { ago: ago(lang, s?.at ?? null, now) })} + {s?.muted && {T('muted')}}{T('lastRead', { ago: ago(lang, s?.at ?? null, now) })}
- + {menu && (
- - + +
- +
)}
@@ -78,7 +87,7 @@ export function Card({ host, lang }: { host: CardHost; lang: CardLang }) {
{s.rejections.map(r => ( host.action('route', route(r.app, 'releases'))} openLabel={T('openApp', { name: r.name })} - line={<>{T('rejected')} · {store(r.store)}{r.version ? ` ${r.version}` : ''}} sub={r.reason} + line={<>{T('rejected')} · {store(r.store)}{r.version ? ` ${r.version}` : ''}} sub={r.reason} consoles={consoles(link(r.app), r.store, host, T)} /> ))}
@@ -100,7 +109,7 @@ export function Card({ host, lang }: { host: CardHost; lang: CardLang }) {
{s.health.map(h => ( host.action('route', route(h.app, 'health'))} openLabel={T('openApp', { name: h.name })} - line={<>{h.kinds.length > 1 ? T('crashAnr') : T(h.kinds[0]!)}} consoles={consoles(link(h.app), 'android', host, T)} /> + line={<>{h.kinds.length > 1 ? T('crashAnr') : T(h.kinds[0]!)}} consoles={consoles(link(h.app), 'android', host, T)} /> ))}
)} @@ -109,7 +118,7 @@ export function Card({ host, lang }: { host: CardHost; lang: CardLang }) {
{s.reviews.low.map(r => ( @@ -124,7 +133,7 @@ export function Card({ host, lang }: { host: CardHost; lang: CardLang }) { function consoles(l: CardApp | undefined, st: CardStore, host: CardHost, T: (k: CardKey) => string): ReactNode { const url = st === 'ios' ? l?.asc : l?.play; if (!url) return null; - return ; + return ; } function Section({ title, tone, aside, children }: { title: string; tone?: 'bad' | 'warn'; aside?: string; children: ReactNode }) { diff --git a/media/teaser/script.js b/media/teaser/script.js index 844967c..1262abe 100644 --- a/media/teaser/script.js +++ b/media/teaser/script.js @@ -138,7 +138,7 @@ export const PRIVACY_STEPS = [ ' 2. First time: click "Get Started" and answer the Data Collection question; then Next. [click: "Get Started"]', ' 6. "Email Address" step 1, purposes: tick and untick the 6 checkboxes as answered, then Next. [click: "Next"]', ' 7. "Email Address" step 2, linked to the user: pick the radio, then Next. [click: "Next"]', - ' 9. "Email Address" step 5, tracking: pick the radio, then Save (a draft). Never "Definitions and Examples". The dialog closes; the row shows Edit and the summary. [click: "Save"]', + ' 9. "Email Address" step 5, tracking: pick the radio, then the last button: "Save" (first setup: a draft) or "Publish" (answers published before: this type goes live at once, verified 2026-10-22). Publish is the owner\'s button unless bypass mode is on (storebound settings bypass status). Never "Definitions and Examples". The dialog closes; the row shows Edit and the summary. [click: "Save"]', ]; export const DATA_SAFETY_CSV = [ 'PSL_DATA_COLLECTION_COLLECTS_PERSONAL_DATA,,TRUE,REQUIRED,Does your app collect or share any of the required user data types?',