diff --git a/.changeset/prune-aspirational-config-3494.md b/.changeset/prune-aspirational-config-3494.md
new file mode 100644
index 0000000000..f1f861e367
--- /dev/null
+++ b/.changeset/prune-aspirational-config-3494.md
@@ -0,0 +1,56 @@
+---
+"@objectstack/spec": minor
+---
+
+feat(spec)!: prune the still-dead aspirational config from Theme / Translation / Webhook (#3494)
+
+Removes the authorable-but-never-consumed props confirmed dead by the 2026-06
+liveness audit (follow-up to #1878/#1893; same treatment as the #2377 and
+#3464 prunes). Authoring any of these was a silent no-op.
+
+## Removed
+
+**Theme** (`ThemeSchema`) — the theme engine (objectui `generateThemeVars`)
+never emitted or consumed them:
+- Props: `spacing`, `breakpoints`, `logo`, `density`, `wcagContrast`, `rtl`,
+ `touchTarget`, `keyboardNavigation`
+- Exports: `SpacingSchema`, `BreakpointsSchema`, `DensityModeSchema` (+
+ deprecated `DensityMode` alias), `WcagContrastLevelSchema` (+ deprecated
+ `WcagContrastLevel` alias), and the `Spacing` / `Breakpoints` /
+ `DensityMode` / `WcagContrastLevel` types
+
+**Translation** (`TranslationConfigSchema`) — no runtime reader; there is no
+ICU engine and interpolation is always simple `{variable}` substitution:
+- Props: `fileOrganization`, `messageFormat`, `lazyLoad`, `cache`
+- Exports: `MessageFormatSchema`, `TranslationFileOrganizationSchema`, and the
+ `MessageFormat` / `TranslationFileOrganization` types
+
+**Webhook** (`WebhookSchema`) — the delivery path always sends its own fixed
+envelope and only applies HMAC signing via `secret`; delivery retries are owned
+by the messaging outbox's fixed schedule:
+- Props: `body`, `payloadFields`, `includeSession`, `authentication`
+ (bearer/basic/api-key were never attached; HMAC via `secret` stays),
+ `retryPolicy`, `tags`
+- Exports: the entire inbound `WebhookReceiverSchema` + `WebhookReceiver` type
+ (never consumed by any runtime)
+
+## Migration
+
+Delete these keys from your configs — they never did anything, so removing
+them changes no behavior. Parsed output no longer contains the previously
+defaulted keys (`includeSession: false`, `fileOrganization: 'per_locale'`,
+`messageFormat: 'simple'`, `lazyLoad: false`, `cache: true`). Webhook HMAC
+signing (`secret`), `headers`, and `timeoutMs` are unaffected. File layout for
+translations remains a pure authoring convention — no config knob needed.
+
+## Deliberately NOT removed
+
+- Translation `supportedLocales` — it has a live reader (pinyin-search
+ capability toggle in `serve.ts`).
+- Job `retryPolicy` / `timeout` — being implemented (built, not pruned) in the
+ #3494 follow-up PR.
+- The materialized webhook props (`name`, `object`, `triggers`, `url`,
+ `method`, `headers`, `timeoutMs`, `secret`, `isActive`, `description`,
+ `label`) — live via the #3489 bridge; ledger flip tracked in #3490.
+
+Refs #3494, #1878, #1893.
diff --git a/content/docs/automation/webhooks.mdx b/content/docs/automation/webhooks.mdx
index 8746657a35..6548cde80b 100644
--- a/content/docs/automation/webhooks.mdx
+++ b/content/docs/automation/webhooks.mdx
@@ -514,7 +514,7 @@ Four phases. Each phase delivers visible user value.
> `system/*` Zod schemas. There is no `system/webhook-delivery.zod.ts` and no
> `SysWebhookSchema` / `SysWebhookDeliverySchema` /
> `WebhookSignatureHeaderSchema` / `WebhookEventPayloadSchema`. Instead it
-> reused the existing `WebhookSchema` (and `WebhookReceiverSchema`) in
+> reused the existing `WebhookSchema` in
> `automation/webhook.zod.ts`, defined `sys_webhook` as an
> `ObjectSchema.create()` in the plugin, and reused
> service-messaging's `sys_http_delivery` outbox for deliveries (ADR-0018 M3).
@@ -555,8 +555,9 @@ Four phases. Each phase delivers visible user value.
## 16. Non-goals (v1)
- **Inbound webhooks.** Receiving HTTP from third parties is a separate
- protocol (`WebhookReceiverSchema` already exists). The two systems
- share no runtime.
+ protocol (the aspirational `WebhookReceiverSchema` was removed unbuilt in
+ #3494 — reintroduce it only alongside a real inbound runtime). The two
+ systems share no runtime.
- **Webhook chaining / fan-in.** No "if receiver returns a payload,
emit a new event". Out of scope.
- **GraphQL subscriptions / WebSocket fan-out.** Different transport,
diff --git a/content/docs/getting-started/quick-reference.mdx b/content/docs/getting-started/quick-reference.mdx
index 1b726ea9e8..61293896d9 100644
--- a/content/docs/getting-started/quick-reference.mdx
+++ b/content/docs/getting-started/quick-reference.mdx
@@ -157,7 +157,7 @@ Flows, state machines, approvals, and integrations.
| **[Flow](/docs/references/automation/flow)** | `flow.zod.ts` | Flow, FlowNode | Visual workflow builder |
| **[Approval](/docs/references/automation/approval)** | `approval.zod.ts` | ApprovalNodeConfig | Flow approval-node config |
| **[State Machine](/docs/references/automation/state-machine)** | `state-machine.zod.ts` | StateMachine | State machine definitions |
-| **[Webhook](/docs/references/automation/webhook)** | `webhook.zod.ts` | Webhook, WebhookReceiver | Outbound webhooks |
+| **[Webhook](/docs/references/automation/webhook)** | `webhook.zod.ts` | Webhook | Outbound webhooks |
| **[ETL](/docs/references/automation/etl)** | `etl.zod.ts` | ETLPipeline | Data transformation pipelines |
| **[Trigger Registry](/docs/references/automation/trigger-registry)** | `trigger-registry.zod.ts` | TriggerRegistry | Event-driven triggers |
| **[Sync](/docs/references/automation/sync)** | `sync.zod.ts` | DataSyncConfig, SyncMode | Bi-directional data sync |
diff --git a/content/docs/protocol/kernel/i18n-standard.mdx b/content/docs/protocol/kernel/i18n-standard.mdx
index f551da7357..ca7a3e5efc 100644
--- a/content/docs/protocol/kernel/i18n-standard.mdx
+++ b/content/docs/protocol/kernel/i18n-standard.mdx
@@ -322,10 +322,8 @@ const label = i18n.t('account.fields.unknown', 'en');
**Design intent.** Automatic CLDR plural selection (the `key` / `key_plural`
convention) is not yet implemented by the file adapter — `t()` performs only
-`{{param}}` interpolation. To pluralize today, set `messageFormat: 'icu'` and
-author ICU MessageFormat strings (see
-[Use ICU MessageFormat](#4-use-icu-messageformat-for-complex-messages) below),
-or select the form in application code.
+`{{param}}` interpolation. To pluralize today, select the plural form in
+application code before calling `t()`.
```typescript
@@ -855,15 +853,7 @@ export default defineStack({
}
```
-### 4. Use ICU MessageFormat for Complex Messages
-
-```json
-{
- "accountStatus": "{count, plural, =0 {No accounts} =1 {One account} other {# accounts}}"
-}
-```
-
-### 5. Test All Locales
+### 4. Test All Locales
```typescript
// ✓ GOOD: Test with actual locales
@@ -891,18 +881,6 @@ export default defineStack({
// Fallback chain
fallbackLocale: 'en',
- // File organization: 'bundled' | 'per_locale' | 'per_namespace' (default 'per_locale')
- fileOrganization: 'per_locale',
-
- // Message format: 'simple' {variable} interpolation (default) | 'icu' MessageFormat
- messageFormat: 'simple',
-
- // Load translations on demand? (default false)
- lazyLoad: true,
-
- // Cache translations? (default true)
- cache: true,
-
// Translation service — design intent, not yet a recognized config key
// translationService: {
// provider: 'google-translate',
diff --git a/content/docs/references/automation/webhook.mdx b/content/docs/references/automation/webhook.mdx
index 1f0a5fe244..a9400704af 100644
--- a/content/docs/references/automation/webhook.mdx
+++ b/content/docs/references/automation/webhook.mdx
@@ -46,8 +46,8 @@ value that silently never fires.
## TypeScript Usage
```typescript
-import { Webhook, WebhookReceiver, WebhookTriggerType } from '@objectstack/spec/automation';
-import type { Webhook, WebhookReceiver, WebhookTriggerType } from '@objectstack/spec/automation';
+import { Webhook, WebhookTriggerType } from '@objectstack/spec/automation';
+import type { Webhook, WebhookTriggerType } from '@objectstack/spec/automation';
// Validate data
const result = Webhook.parse(data);
@@ -68,32 +68,10 @@ const result = Webhook.parse(data);
| **url** | `string` | ✅ | External webhook endpoint URL |
| **method** | `Enum<'GET' \| 'POST' \| 'PUT' \| 'PATCH' \| 'DELETE'>` | ✅ | HTTP method |
| **headers** | `Record` | optional | Custom HTTP headers |
-| **body** | `any` | optional | Request body payload (if not using default record data) |
-| **payloadFields** | `string[]` | optional | Fields to include. Empty = All |
-| **includeSession** | `boolean` | ✅ | Include user session info |
-| **authentication** | `{ type: Enum<'none' \| 'bearer' \| 'basic' \| 'api-key'>; credentials?: Record }` | optional | Authentication configuration. [EXPERIMENTAL — not enforced] The webhook delivery path only applies HMAC signing via `secret`; bearer/basic/api-key credentials are not attached to outbound requests yet (liveness audit #1878/#1893). |
-| **retryPolicy** | `{ maxRetries: integer; backoffStrategy: Enum<'exponential' \| 'linear' \| 'fixed'>; initialDelayMs: integer; maxDelayMs: integer }` | optional | Retry policy configuration |
| **timeoutMs** | `integer` | ✅ | Request timeout in milliseconds |
| **secret** | `string` | optional | Signing secret for HMAC signature verification |
| **isActive** | `boolean` | ✅ | Whether webhook is active |
| **description** | `string` | optional | Webhook description |
-| **tags** | `string[]` | optional | Tags for organization |
-
-
----
-
-## WebhookReceiver
-
-### Properties
-
-| Property | Type | Required | Description |
-| :--- | :--- | :--- | :--- |
-| **name** | `string` | ✅ | Webhook receiver unique name (lowercase snake_case) |
-| **path** | `string` | ✅ | URL Path (e.g. /webhooks/stripe) |
-| **verificationType** | `Enum<'none' \| 'header_token' \| 'hmac' \| 'ip_whitelist'>` | ✅ | |
-| **verificationParams** | `{ header?: string; secret?: string; ips?: string[] }` | optional | |
-| **action** | `Enum<'trigger_flow' \| 'script' \| 'upsert_record'>` | ✅ | |
-| **target** | `string` | ✅ | Flow ID or Script name |
---
diff --git a/content/docs/references/integration/connector.mdx b/content/docs/references/integration/connector.mdx
index a92fa3c1f3..aa9cb44cc8 100644
--- a/content/docs/references/integration/connector.mdx
+++ b/content/docs/references/integration/connector.mdx
@@ -470,16 +470,10 @@ Synchronization strategy
| **url** | `string` | ✅ | External webhook endpoint URL |
| **method** | `Enum<'GET' \| 'POST' \| 'PUT' \| 'PATCH' \| 'DELETE'>` | ✅ | HTTP method |
| **headers** | `Record` | optional | Custom HTTP headers |
-| **body** | `any` | optional | Request body payload (if not using default record data) |
-| **payloadFields** | `string[]` | optional | Fields to include. Empty = All |
-| **includeSession** | `boolean` | ✅ | Include user session info |
-| **authentication** | `{ type: Enum<'none' \| 'bearer' \| 'basic' \| 'api-key'>; credentials?: Record }` | optional | Authentication configuration. [EXPERIMENTAL — not enforced] The webhook delivery path only applies HMAC signing via `secret`; bearer/basic/api-key credentials are not attached to outbound requests yet (liveness audit #1878/#1893). |
-| **retryPolicy** | `{ maxRetries: integer; backoffStrategy: Enum<'exponential' \| 'linear' \| 'fixed'>; initialDelayMs: integer; maxDelayMs: integer }` | optional | Retry policy configuration |
| **timeoutMs** | `integer` | ✅ | Request timeout in milliseconds |
| **secret** | `string` | optional | Signing secret for HMAC signature verification |
| **isActive** | `boolean` | ✅ | Whether webhook is active |
| **description** | `string` | optional | Webhook description |
-| **tags** | `string[]` | optional | Tags for organization |
| **events** | `Enum<'record.created' \| 'record.updated' \| 'record.deleted' \| 'sync.started' \| 'sync.completed' \| 'sync.failed' \| 'auth.expired' \| 'rate_limit.exceeded'>[]` | optional | Connector events to subscribe to (not yet enforced — no runtime dispatches these; see #3197) |
| **signatureAlgorithm** | `Enum<'hmac_sha256' \| 'hmac_sha512' \| 'none'>` | ✅ | Webhook signature algorithm |
diff --git a/content/docs/references/integration/meta.json b/content/docs/references/integration/meta.json
index 4ccb122e5a..d672bdfa95 100644
--- a/content/docs/references/integration/meta.json
+++ b/content/docs/references/integration/meta.json
@@ -5,7 +5,6 @@
"connector",
"connector-auth",
"mapping",
- "translation",
"---Transport & Storage---",
"http",
"message-queue",
diff --git a/content/docs/references/integration/misc.mdx b/content/docs/references/integration/misc.mdx
index 0342edc1ae..cdc46335fc 100644
--- a/content/docs/references/integration/misc.mdx
+++ b/content/docs/references/integration/misc.mdx
@@ -12,8 +12,8 @@ description: Misc protocol schemas
## TypeScript Usage
```typescript
-import { AckMode, ApiVersionConfig, BuildConfig, CdcConfig, DatabaseConnector, DatabasePoolConfig, DatabaseTable, DeliveryGuarantee, DeploymentConfig, DlqConfig, DomainConfig, EdgeFunctionConfig, EnvironmentVariables, FileAccessPattern, FileFilterConfig, FileMetadataConfig, FileStorageConnector, FileStorageProvider, FileVersioningConfig, GitHubActionsWorkflow, GitHubCommitConfig, GitHubConnector, GitHubIssueTracking, GitHubProvider, GitHubPullRequestConfig, GitHubReleaseConfig, GitHubRepository, GitRepositoryConfig, MessageQueueConnector, ProducerConfig, SaasConnector, SaasObjectType, SaasProvider, SslConfig, StorageBucket, TopicQueue, VercelConnector, VercelFramework, VercelMonitoring, VercelProject, VercelProvider, VercelTeam } from '@objectstack/spec/integration';
-import type { AckMode, ApiVersionConfig, BuildConfig, CdcConfig, DatabaseConnector, DatabasePoolConfig, DatabaseTable, DeliveryGuarantee, DeploymentConfig, DlqConfig, DomainConfig, EdgeFunctionConfig, EnvironmentVariables, FileAccessPattern, FileFilterConfig, FileMetadataConfig, FileStorageConnector, FileStorageProvider, FileVersioningConfig, GitHubActionsWorkflow, GitHubCommitConfig, GitHubConnector, GitHubIssueTracking, GitHubProvider, GitHubPullRequestConfig, GitHubReleaseConfig, GitHubRepository, GitRepositoryConfig, MessageQueueConnector, ProducerConfig, SaasConnector, SaasObjectType, SaasProvider, SslConfig, StorageBucket, TopicQueue, VercelConnector, VercelFramework, VercelMonitoring, VercelProject, VercelProvider, VercelTeam } from '@objectstack/spec/integration';
+import { AckMode, ApiVersionConfig, BuildConfig, CdcConfig, DatabaseConnector, DatabasePoolConfig, DatabaseTable, DeliveryGuarantee, DeploymentConfig, DlqConfig, DomainConfig, EdgeFunctionConfig, EnvironmentVariables, FileAccessPattern, FileFilterConfig, FileMetadataConfig, FileStorageConnector, FileStorageProvider, FileVersioningConfig, GitHubActionsWorkflow, GitHubCommitConfig, GitHubConnector, GitHubIssueTracking, GitHubProvider, GitHubPullRequestConfig, GitHubReleaseConfig, GitHubRepository, GitRepositoryConfig, MessageFormat, MessageQueueConnector, ProducerConfig, SaasConnector, SaasObjectType, SaasProvider, SslConfig, StorageBucket, TopicQueue, VercelConnector, VercelFramework, VercelMonitoring, VercelProject, VercelProvider, VercelTeam } from '@objectstack/spec/integration';
+import type { AckMode, ApiVersionConfig, BuildConfig, CdcConfig, DatabaseConnector, DatabasePoolConfig, DatabaseTable, DeliveryGuarantee, DeploymentConfig, DlqConfig, DomainConfig, EdgeFunctionConfig, EnvironmentVariables, FileAccessPattern, FileFilterConfig, FileMetadataConfig, FileStorageConnector, FileStorageProvider, FileVersioningConfig, GitHubActionsWorkflow, GitHubCommitConfig, GitHubConnector, GitHubIssueTracking, GitHubProvider, GitHubPullRequestConfig, GitHubReleaseConfig, GitHubRepository, GitRepositoryConfig, MessageFormat, MessageQueueConnector, ProducerConfig, SaasConnector, SaasObjectType, SaasProvider, SslConfig, StorageBucket, TopicQueue, VercelConnector, VercelFramework, VercelMonitoring, VercelProject, VercelProvider, VercelTeam } from '@objectstack/spec/integration';
// Validate data
const result = AckMode.parse(data);
@@ -527,6 +527,22 @@ GitHub provider type
| **autoDeployPreview** | `boolean` | ✅ | Auto-deploy preview branches |
+---
+
+## MessageFormat
+
+Message format/serialization
+
+### Allowed Values
+
+* `json`
+* `xml`
+* `protobuf`
+* `avro`
+* `text`
+* `binary`
+
+
---
## MessageQueueConnector
diff --git a/content/docs/references/integration/translation.mdx b/content/docs/references/integration/translation.mdx
deleted file mode 100644
index 44014d67bd..0000000000
--- a/content/docs/references/integration/translation.mdx
+++ /dev/null
@@ -1,39 +0,0 @@
----
-title: Translation
-description: Translation protocol schemas
----
-
-{/* ⚠️ AUTO-GENERATED — DO NOT EDIT. Run build-docs.ts to regenerate. Hand-written docs live in the module folders under content/docs/. */}
-
-
-**Source:** `packages/spec/src/integration/translation.zod.ts`
-
-
-## TypeScript Usage
-
-```typescript
-import { MessageFormat } from '@objectstack/spec/integration';
-import type { MessageFormat } from '@objectstack/spec/integration';
-
-// Validate data
-const result = MessageFormat.parse(data);
-```
-
----
-
-## MessageFormat
-
-Message format/serialization
-
-### Allowed Values
-
-* `json`
-* `xml`
-* `protobuf`
-* `avro`
-* `text`
-* `binary`
-
-
----
-
diff --git a/content/docs/references/system/translation.mdx b/content/docs/references/system/translation.mdx
index ec9ed8255a..0362693837 100644
--- a/content/docs/references/system/translation.mdx
+++ b/content/docs/references/system/translation.mdx
@@ -16,8 +16,8 @@ Translation data for a single field.
## TypeScript Usage
```typescript
-import { ActionResultDialogTranslation, AppTranslationBundle, CoverageBreakdownEntry, FieldTranslation, Locale, MessageFormat, ObjectTranslationData, ObjectTranslationNode, TranslationBundle, TranslationConfig, TranslationCoverageResult, TranslationData, TranslationDiffItem, TranslationDiffStatus, TranslationFileOrganization } from '@objectstack/spec/system';
-import type { ActionResultDialogTranslation, AppTranslationBundle, CoverageBreakdownEntry, FieldTranslation, Locale, MessageFormat, ObjectTranslationData, ObjectTranslationNode, TranslationBundle, TranslationConfig, TranslationCoverageResult, TranslationData, TranslationDiffItem, TranslationDiffStatus, TranslationFileOrganization } from '@objectstack/spec/system';
+import { ActionResultDialogTranslation, AppTranslationBundle, CoverageBreakdownEntry, FieldTranslation, Locale, ObjectTranslationData, ObjectTranslationNode, TranslationBundle, TranslationConfig, TranslationCoverageResult, TranslationData, TranslationDiffItem, TranslationDiffStatus } from '@objectstack/spec/system';
+import type { ActionResultDialogTranslation, AppTranslationBundle, CoverageBreakdownEntry, FieldTranslation, Locale, ObjectTranslationData, ObjectTranslationNode, TranslationBundle, TranslationConfig, TranslationCoverageResult, TranslationData, TranslationDiffItem, TranslationDiffStatus } from '@objectstack/spec/system';
// Validate data
const result = ActionResultDialogTranslation.parse(data);
@@ -99,18 +99,6 @@ Translation data for a single field
---
----
-
-## MessageFormat
-
-Message interpolation format: ICU MessageFormat or simple `{variable}` replacement
-
-### Allowed Values
-
-* `icu`
-* `simple`
-
-
---
## ObjectTranslationData
@@ -169,10 +157,6 @@ Internationalization configuration
| **defaultLocale** | `string` | ✅ | Default locale (e.g., "en") |
| **supportedLocales** | `string[]` | ✅ | Supported BCP-47 locale codes |
| **fallbackLocale** | `string` | optional | Fallback locale code |
-| **fileOrganization** | `Enum<'bundled' \| 'per_locale' \| 'per_namespace'>` | ✅ | File organization strategy |
-| **messageFormat** | `Enum<'icu' \| 'simple'>` | ✅ | Message interpolation format (ICU MessageFormat or simple). [EXPERIMENTAL — 'icu' not enforced] No ICU MessageFormat engine is wired; messageFormat:'icu' is accepted but interpolation falls back to simple substitution (liveness audit #1878/#1893). |
-| **lazyLoad** | `boolean` | ✅ | Load translations on demand |
-| **cache** | `boolean` | ✅ | Cache loaded translations. [EXPERIMENTAL — not enforced] No runtime consumer reads this cache flag yet (liveness audit #1878/#1893). |
---
@@ -252,16 +236,3 @@ Translation diff status: missing from bundle, redundant (no matching metadata),
---
-## TranslationFileOrganization
-
-Translation file organization strategy
-
-### Allowed Values
-
-* `bundled`
-* `per_locale`
-* `per_namespace`
-
-
----
-
diff --git a/content/docs/references/ui/responsive.mdx b/content/docs/references/ui/responsive.mdx
index e3ef904700..935b588fc7 100644
--- a/content/docs/references/ui/responsive.mdx
+++ b/content/docs/references/ui/responsive.mdx
@@ -7,7 +7,7 @@ description: Responsive protocol schemas
Breakpoint Name Enum
-Matches the breakpoint names defined in theme.zod.ts BreakpointsSchema.
+Standard Tailwind-style breakpoint names (xs–2xl).
**Source:** `packages/spec/src/ui/responsive.zod.ts`
diff --git a/content/docs/references/ui/theme.mdx b/content/docs/references/ui/theme.mdx
index 9104025b11..9de36f3a85 100644
--- a/content/docs/references/ui/theme.mdx
+++ b/content/docs/references/ui/theme.mdx
@@ -16,8 +16,8 @@ Defines brand colors and their variants.
## TypeScript Usage
```typescript
-import { Animation, BorderRadius, Breakpoints, ColorPalette, DensityMode, Shadow, Spacing, Theme, ThemeMode, Typography, WcagContrastLevel, ZIndex } from '@objectstack/spec/ui';
-import type { Animation, BorderRadius, Breakpoints, ColorPalette, DensityMode, Shadow, Spacing, Theme, ThemeMode, Typography, WcagContrastLevel, ZIndex } from '@objectstack/spec/ui';
+import { Animation, BorderRadius, ColorPalette, Shadow, Theme, ThemeMode, Typography, ZIndex } from '@objectstack/spec/ui';
+import type { Animation, BorderRadius, ColorPalette, Shadow, Theme, ThemeMode, Typography, ZIndex } from '@objectstack/spec/ui';
// Validate data
const result = Animation.parse(data);
@@ -53,22 +53,6 @@ const result = Animation.parse(data);
| **full** | `string` | optional | Full border radius (50%) |
----
-
-## Breakpoints
-
-### Properties
-
-| Property | Type | Required | Description |
-| :--- | :--- | :--- | :--- |
-| **xs** | `string` | optional | Extra small breakpoint (e.g., 480px) |
-| **sm** | `string` | optional | Small breakpoint (e.g., 640px) |
-| **md** | `string` | optional | Medium breakpoint (e.g., 768px) |
-| **lg** | `string` | optional | Large breakpoint (e.g., 1024px) |
-| **xl** | `string` | optional | Extra large breakpoint (e.g., 1280px) |
-| **2xl** | `string` | optional | 2X large breakpoint (e.g., 1536px) |
-
-
---
## ColorPalette
@@ -96,17 +80,6 @@ const result = Animation.parse(data);
| **secondaryDark** | `string` | optional | Darker shade of secondary |
----
-
-## DensityMode
-
-### Allowed Values
-
-* `compact`
-* `regular`
-* `spacious`
-
-
---
## Shadow
@@ -125,29 +98,6 @@ const result = Animation.parse(data);
| **inner** | `string` | optional | Inner shadow (inset) |
----
-
-## Spacing
-
-### Properties
-
-| Property | Type | Required | Description |
-| :--- | :--- | :--- | :--- |
-| **0** | `string` | optional | 0 spacing (0) |
-| **1** | `string` | optional | Spacing unit 1 (e.g., 0.25rem) |
-| **2** | `string` | optional | Spacing unit 2 (e.g., 0.5rem) |
-| **3** | `string` | optional | Spacing unit 3 (e.g., 0.75rem) |
-| **4** | `string` | optional | Spacing unit 4 (e.g., 1rem) |
-| **5** | `string` | optional | Spacing unit 5 (e.g., 1.25rem) |
-| **6** | `string` | optional | Spacing unit 6 (e.g., 1.5rem) |
-| **8** | `string` | optional | Spacing unit 8 (e.g., 2rem) |
-| **10** | `string` | optional | Spacing unit 10 (e.g., 2.5rem) |
-| **12** | `string` | optional | Spacing unit 12 (e.g., 3rem) |
-| **16** | `string` | optional | Spacing unit 16 (e.g., 4rem) |
-| **20** | `string` | optional | Spacing unit 20 (e.g., 5rem) |
-| **24** | `string` | optional | Spacing unit 24 (e.g., 6rem) |
-
-
---
## Theme
@@ -162,20 +112,12 @@ const result = Animation.parse(data);
| **mode** | `Enum<'light' \| 'dark' \| 'auto'>` | ✅ | Theme mode (light, dark, or auto) |
| **colors** | `{ primary: string; secondary?: string; accent?: string; success?: string; … }` | ✅ | Color palette configuration |
| **typography** | `{ fontFamily?: object; fontSize?: object; fontWeight?: object; lineHeight?: object; … }` | optional | Typography settings |
-| **spacing** | `{ 0?: string; 1?: string; 2?: string; 3?: string; … }` | optional | Spacing scale. [EXPERIMENTAL — not enforced] generateThemeVars does not emit spacing tokens yet (liveness audit #1878/#1893). |
| **borderRadius** | `{ none?: string; sm?: string; base?: string; md?: string; … }` | optional | Border radius scale |
| **shadows** | `{ none?: string; sm?: string; base?: string; md?: string; … }` | optional | Box shadow effects |
-| **breakpoints** | `{ xs?: string; sm?: string; md?: string; lg?: string; … }` | optional | Responsive breakpoints. [EXPERIMENTAL — not enforced] generateThemeVars does not emit breakpoint tokens yet (liveness audit #1878/#1893). |
| **animation** | `{ duration?: object; timing?: object }` | optional | Animation settings |
| **zIndex** | `{ base?: number; dropdown?: number; sticky?: number; fixed?: number; … }` | optional | Z-index scale for layering |
| **customVars** | `Record` | optional | Custom CSS variables (key-value pairs) |
-| **logo** | `{ light?: string; dark?: string; favicon?: string }` | optional | Logo assets |
| **extends** | `string` | optional | Base theme to extend from |
-| **density** | `Enum<'compact' \| 'regular' \| 'spacious'>` | optional | Display density: compact, regular, or spacious. [EXPERIMENTAL — not enforced] The theme engine does not consume theme-level density yet; view-level densityMode is a separate live setting (liveness audit #1878/#1893). |
-| **wcagContrast** | `Enum<'AA' \| 'AAA'>` | optional | WCAG color contrast level (AA or AAA) |
-| **rtl** | `boolean` | optional | Enable right-to-left layout direction. [EXPERIMENTAL — not enforced] No renderer reads theme.rtl yet (liveness audit #1878/#1893). |
-| **touchTarget** | `{ minWidth: number; minHeight: number; padding?: number; hitSlop?: object }` | optional | Touch target sizing defaults. [EXPERIMENTAL — not enforced] No renderer consumes touchTarget yet (liveness audit #1878/#1893). |
-| **keyboardNavigation** | `{ tabOrder: Enum<'auto' \| 'manual'>; skipLinks: boolean; focusVisible: boolean; focusTrap?: object; … }` | optional | Keyboard focus management settings |
---
@@ -204,16 +146,6 @@ const result = Animation.parse(data);
| **letterSpacing** | `{ tighter?: string; tight?: string; normal?: string; wide?: string; … }` | optional | |
----
-
-## WcagContrastLevel
-
-### Allowed Values
-
-* `AA`
-* `AAA`
-
-
---
## ZIndex
diff --git a/content/docs/ui/translations.mdx b/content/docs/ui/translations.mdx
index 33468b3a9e..6e92c28636 100644
--- a/content/docs/ui/translations.mdx
+++ b/content/docs/ui/translations.mdx
@@ -112,13 +112,15 @@ metadata without doing lookups themselves.
## Organizing the files
-`i18n.fileOrganization` picks the layout:
+How you lay out translation source files is an authoring convention — your
+import graph assembles whichever layout you choose into the bundles you
+register. Common layouts:
-- **`per_locale`** (default) — one file per language, combined in the bundle.
+- **per locale** — one file per language, combined in the bundle.
This is what the Todo example does (`en`, `zh-CN`, `ja-JP`).
-- **`bundled`** — every locale in one file, like the CRM example above. Fine
+- **bundled** — every locale in one file, like the CRM example above. Fine
for two locales; unwieldy past that.
-- **`per_namespace`** — split by module.
+- **per namespace** — split by module.
## Draft with the CLI, gate in CI
@@ -142,8 +144,8 @@ Honest limits worth knowing before you plan around them:
- **`validationMessages` has no runtime consumer today.** The schema accepts it
and the coverage tooling counts it, but nothing reads it back — validation
errors are not translated through bundles yet.
-- **`messageFormat: 'icu'` is declared but not implemented** — plural/gender
- formatting isn't available; `simple` is what runs.
+- **No ICU MessageFormat** — plural/gender formatting isn't available;
+ interpolation is always simple `{variable}` substitution.
- **Two bundle shapes exist.** File-authored bundles use the `objects.`
shape documented here, which is what the resolver reads. The `translation`
metadata type authored at runtime uses an object-first (`o.