---
title: "S27 Profile · Settings"
description: "Contract, a board per state (default, language, delete-data-confirm, delete-account-confirm, loading, empty, error, offline), tokens and strings."
source: "design/hifi/S27/screen.md"
---

> Part of [Brand and design](/design/llms.txt). Every page: [llms.txt](/llms.txt).

# Hi-fi: S27 Profile · Settings

> Generated by `botgumi-design index` from `../../screens.json`. Edit that file, not this page.

Stage: **hifi** · Key: `profile/settings` · Data-binding map: [bindings.md](/design/hifi/s27/bindings/index.md)

Drawn in the gallery: [Profile](/design/gallery/index.html#g-profile). Each board is the committed HTML in `screens/`, drawn on the example data in `docs/api/examples/`.

## Contract

- **default**: App language, practice languages, reminders, retention 7/30/365, privacy, delete data/account, subscription.
- **language**: UI language (follow device or override → settings.ui_locale; drives Accept-Language) is separate from practice languages (settings.practice_languages, first = primary).
- **delete-data-confirm**: Destructive confirm with exact consequences (counts from me.stats).
- **delete-account-confirm**: Warns that the App Store subscription is not cancelled automatically.

Flows: F8 Delete training data / account, F9 Change UI language / practice languages.

Reads and calls:

- `GET /v1/me`
- `PATCH /v1/me {settings}`
- `GET /v1/config → supported_ui_locales / supported_practice_languages`
- `PATCH /v1/me {settings.ui_locale, settings.practice_languages}`
- `DELETE /v1/me/training-data → 202 {job_id, purge_backups_by}`
- `DELETE /v1/me → 204`

Local state:

- none

## Boards

One row per state. A state without boards of its own says what shows it.

| State | Board | Example data |
|---|---|---|
| default | [zh-Hans](/design/gallery/profile/settings--default.html) · [en](/design/gallery/profile/settings--default.en.html) | me.json ([zh-Hans](/design/examples/zh-Hans/me.json) · [en](/design/examples/en/me.json)) |
| language | [zh-Hans](/design/gallery/profile/settings--language.html) · [en](/design/gallery/profile/settings--language.en.html) | me.json ([zh-Hans](/design/examples/zh-Hans/me.json) · [en](/design/examples/en/me.json)) |
| delete-data-confirm | [zh-Hans](/design/gallery/profile/settings--delete-data-confirm.html) · [en](/design/gallery/profile/settings--delete-data-confirm.en.html) | me.json ([zh-Hans](/design/examples/zh-Hans/me.json) · [en](/design/examples/en/me.json)) |
| delete-account-confirm | [zh-Hans](/design/gallery/profile/settings--delete-account-confirm.html) · [en](/design/gallery/profile/settings--delete-account-confirm.en.html) | me.json ([zh-Hans](/design/examples/zh-Hans/me.json) · [en](/design/examples/en/me.json)) |
| loading | [no board of its own](/design/hifi/s27/bindings/index.md#states): From [states.md](/design/states/index.md) (Settings): toggles disabled until `/me` |  |
| empty | [no board of its own](/design/hifi/s27/bindings/index.md#states): From [states.md](/design/states/index.md) (Settings): — |  |
| error | [no board of its own](/design/hifi/s27/bindings/index.md#states): From [states.md](/design/states/index.md) (Settings): PATCH failed → revert toggle + toast · fatal: — |  |
| offline | [no board of its own](/design/hifi/s27/bindings/index.md#states): From [states.md](/design/states/index.md) (Settings): changes queued; retention / delete disabled offline |  |

### The boards

Each state as drawn (393 × 852), one board per locale. Open a board on its own for its spec panel.

**default**

[S27 default · zh-Hans](/design/gallery/profile/settings--default.html) [S27 default · en](/design/gallery/profile/settings--default.en.html)

**language**

[S27 language · zh-Hans](/design/gallery/profile/settings--language.html) [S27 language · en](/design/gallery/profile/settings--language.en.html)

**delete-data-confirm**

[S27 delete-data-confirm · zh-Hans](/design/gallery/profile/settings--delete-data-confirm.html) [S27 delete-data-confirm · en](/design/gallery/profile/settings--delete-data-confirm.en.html)

**delete-account-confirm**

[S27 delete-account-confirm · zh-Hans](/design/gallery/profile/settings--delete-account-confirm.html) [S27 delete-account-confirm · en](/design/gallery/profile/settings--delete-account-confirm.en.html)

## Tokens used

By path in `../../system/tokens.source.json`.

| Token | Where |
|---|---|
| `color.bgCanvas` | `.device`, `.navbar`, `.screen` |
| `color.bgInverse` | `.tag--ink` |
| `color.bgInverseRaised` | `.icon-btn` |
| `color.bgScrim` | `.scrim` |
| `color.bgSunken` | `.icon-btn`, `.segmented`, `.tag` |
| `color.bgSurface` | `.alert`, `.list`, `.segmented` |
| `color.lineHairline` | `.list-row` |
| `color.lineStrong` | `.alert`, `.alert-btn`, `.toggle` |
| `color.statusDanger` | `.alert`, `.alert-btn`, `.c-danger`, `.destructive` |
| `color.statusSuccess` | `.toggle`, `inline` |
| `color.textOnInverse` | `.icon-btn`, `.tag--ink` |
| `color.textPrimary` | `.device`, `.home-indicator`, `.icon-btn`, `.segmented` … |
| `color.textSecondary` | `.segmented`, `.tag` |
| `color.textTertiary` | `.c-tertiary`, `.chev`, `.list-row` |
| `radius.md` | `.list` |
| `radius.xs` | `.tag` |
| `space.gutter` | `.group-label`, `.navbar`, `.pad` |
| `space.s2` | `.group-label` |
| `space.s6` | `.group-label`, `.screen` |
| `space.safeBottom` | `.screen` |
| `space.safeTop` | `.device`, `.screen` |
| `space.sizeCtaHeight` | `.screen` |
| `space.sizeHitMin` | `.icon-btn` |
| `space.sizeNavbarHeight` | `.navbar` |
| `space.sizeTabbarHeight` | `.screen` |
| `typography.callout` | `.t-callout` |
| `typography.caption1` | `.t-caption` |
| `typography.footnote` | `.t-footnote` |
| `typography.headline` | `.t-headline` |
| `typography.subheadline` | `.t-subhead` |

## Strings

`app.name`, `common.back`, `common.cancel`, `common.points`, `delete_account.confirm`, `delete_account.manage`, `delete_account.title`, `delete_data.confirm`, `delete_data.title`, `delete_session.confirm`, `feedback.confidence.low`, `growth.ability.delta`, `home.greeting.format`, `lang.en`, `lang.follow_system`, `lang.zh-Hans`, `notif.daily.title`, `onboarding.commitment.reminder.a11y`, `paywall.calendar.rest`, `paywall.k.value`, `paywall.per.year`, `paywall.privacy`, `paywall.projection.score`, `paywall.restore`, `privacy.nav`, `profile.account.title`, `profile.privacy`, `profile.reminder`, `profile.settings`, `profile.settings.a11y`, `record.indicator.recording`, `record.leave.stay`, `settings.delete_account`, `settings.delete_data`, `settings.language.add_note`, `settings.language.primary`, `settings.manage_sub`, `settings.nav`, `settings.practice_languages`, `settings.practice_languages.note`, `settings.reminder_time`, `settings.reminders`, `settings.restore`, `settings.retention`, `settings.retention.30`, `settings.retention.365`, `settings.retention.7`, `settings.retention.note`, `settings.section.account`, `settings.section.data`, `settings.section.language`, `settings.section.reminders`, `settings.streak_alert`, `settings.streak_alert.note`, `settings.ui_language`, `settings.ui_language.value`, `settings.version`, `tab.library`

## Notes for the app tracks

Motion, haptics, Dynamic Type and VoiceOver: [engagement.md](/design/engagement/index.md), [tokens.md](/design/tokens/index.md) §6–7 and
[ios-handoff.md](/design/ios-handoff/index.md). Open a board with `?theme=dark&dt=1.35&binds=1` to see dark mode, the largest
tested type size and every bound element.

Tracking-plan events: no tracking plan page exists yet; ADR-001 D12 names the events.

Tokens with no group in `system/tokens.source.json` yet (they stay in [tokens.css](/design/tokens.css)): `--dt`, `--elevation-1`, `--elevation-3`, `--font-family-text`, `--font-weight-medium`, `--font-weight-regular`, `--font-weight-semibold`, `--motion-duration-base`, `--motion-duration-fast`, `--motion-ease-spring`, `--motion-ease-standard`.
