You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 3152876
Browse filesBrowse the repository at this point in the historyBrowse files
fix(platform): Paper's no-results, destination and confirm copy, and PageOverflow for row bleeds
No-results copy reads No matching {noun}: no echoed query and no "found",
as Paper writes it (No matching integrations, settings, issues). The
resource-list noResults helper takes the noun; copy-case now reports an
echoed query or "found".
Home and Wiki are destinations Paper capitalizes mid-label, so they join
PROPER_NOUNS and Customize Home is restored. Chat as a place stays
lowercase, as Paper's Explore in chat does: Fix in chat, Troubleshoot in
chat, Show value in logs and chat.
A confirm about one named object names it in the title (Delete {name},
Remove {member}, Revoke {email}) and keeps only the consequence in the
description, as Paper's Disconnect Gmail does.
Surfaces whose hit area reaches past the text edge wrap in PageOverflow
instead of hand-writing margin-inline: calc(-1 * var(--ui-row-inset));
the new page-overflow rule reports the hand-written form. Home's bottom
inset uses spacing-24, the chat split's minimum uses
container-app-panel-start, and Issues prose uses container-reading as
Paper does.
Copy file name to clipboardExpand all lines: .claude/rules/sim-ui-copy.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -19,11 +19,11 @@ This applies to app UI outside the Platform: settings rows, modals, panels, card
19
19
20
20
Platform views also share one vocabulary, documented in `apps/sim/platform/AGENTS.md` (Code-first product design) and enforced by `check:platform-design`:
21
21
22
-
-**Sentence case** for every literal `title`, `label` and `*Label` prop (`confirmLabel`, `createLabel`, …), for `label`s and `*Label`s in menu, column, sort, command and action data, and for button, menu item and chip text (`copy-case`). Product, plan and brand names keep their capitals through `PROPER_NOUNS` / `PROPER_PHRASES` in `scripts/platform-source-rules.ts`; a pageor tab name inside a label is a common noun ("Open logs", "Switch to runs").
22
+
-**Sentence case** for every literal `title`, `label` and `*Label` prop (`confirmLabel`, `createLabel`, …), for `label`s and `*Label`s in menu, column, sort, command and action data, and for button, menu item and chip text (`copy-case`). Product, plan and brand names keep their capitals through `PROPER_NOUNS` / `PROPER_PHRASES` in `scripts/platform-source-rules.ts`; Home and Wiki are destinations Paper capitalizes ("Customize Home", "Create a Wiki page"); any other page or tab name inside a label is a common noun ("Open logs", "Switch to runs"), as is chat as a place ("Explore in chat").
23
23
-**The `…` glyph**, never three periods, in rendered copy and in object or record values such as status labels (`copy-ellipsis`).
24
-
-**Confirmations** go through `ConfirmDialog` with a real `pendingLabel` ("Deleting…"), `safe` when nothing is lost (`confirm-owner`). Titles are "{Verb} {noun}" with no question mark, identical for one object everywhere; unsaved changes read "Unsaved changes" / "Discard".
24
+
-**Confirmations** go through `ConfirmDialog` with a real `pendingLabel` ("Deleting…"), `safe` when nothing is lost (`confirm-owner`). Titles are "{Verb} {object}" with no question mark, identical for one object everywhere: a dialog about one named object names it ("Delete Daily brief", "Disconnect Gmail") and the description keeps only the consequence; otherwise the noun ("Delete 3 rows"). Unsaved changes read "Unsaved changes" / "Discard".
25
25
-**Verbs**: editing saves with "Save", creating says "Create {noun}", adding a connection or credential says "Add {noun}", OAuth keeps "Connect".
26
-
-**Empty and no-results**: an empty list is `EmptyState` (`Muted` in a narrow rail or dialog picker); no results read "No matching {noun}", the query in curly quotes, no period.
26
+
-**Empty and no-results**: an empty list is `EmptyState` (`Muted` in a narrow rail or dialog picker); no results read "No matching {noun}": no query, no "found", no period (`copy-case`).
27
27
-**Back, tabs, alerts, tooltips** belong to their owners: `DirectoryBack` / `DetailHeader` with bare-noun labels (`back-owner`), `ContentTabs` (`tab-owner`), `InlineNotice` / `FailureNotice` / a field's `error` (`alert-owner`), and `Tooltip` / `OverflowText` rather than a native `title=` (`native-title`). Statuses use Logs' words: a failed run reads "Failed".
28
28
29
29
**Carve-out — settings section metadata.**`SettingsNavigationItem.description` in `components/settings/navigation.ts` stays required, and `SettingsPanel` keeps rendering it as the page subtitle. Settings sections are reached through a nav list where the description is the only thing distinguishing adjacent sections, so it earns its place by the "prevents misunderstanding" test. Keep those descriptions verb-first and one line, per `sim-settings-pages.md`. Everything else on a settings page — inline `<p>` blurbs under section headings, field hints, modal bodies, row subtitles — follows the default rule above.
Copy file name to clipboardExpand all lines: .cursor/rules/sim-ui-copy.mdc
+3-3Lines changed: 3 additions & 3 deletions
Original file line number
Diff line number
Diff line change
@@ -15,11 +15,11 @@ This applies to app UI outside the Platform: settings rows, modals, panels, card
15
15
16
16
Platform views also share one vocabulary, documented in `apps/sim/platform/AGENTS.md` (Code-first product design) and enforced by `check:platform-design`:
17
17
18
-
- **Sentence case** for every literal `title`, `label` and `*Label` prop (`confirmLabel`, `createLabel`, …), for `label`s and `*Label`s in menu, column, sort, command and action data, and for button, menu item and chip text (`copy-case`). Product, plan and brand names keep their capitals through `PROPER_NOUNS` / `PROPER_PHRASES` in `scripts/platform-source-rules.ts`; a pageor tab name inside a label is a common noun ("Open logs", "Switch to runs").
18
+
- **Sentence case** for every literal `title`, `label` and `*Label` prop (`confirmLabel`, `createLabel`, …), for `label`s and `*Label`s in menu, column, sort, command and action data, and for button, menu item and chip text (`copy-case`). Product, plan and brand names keep their capitals through `PROPER_NOUNS` / `PROPER_PHRASES` in `scripts/platform-source-rules.ts`; Home and Wiki are destinations Paper capitalizes ("Customize Home", "Create a Wiki page"); any other page or tab name inside a label is a common noun ("Open logs", "Switch to runs"), as is chat as a place ("Explore in chat").
19
19
- **The `…` glyph**, never three periods, in rendered copy and in object or record values such as status labels (`copy-ellipsis`).
20
-
- **Confirmations** go through `ConfirmDialog` with a real `pendingLabel` ("Deleting…"), `safe` when nothing is lost (`confirm-owner`). Titles are "{Verb} {noun}" with no question mark, identical for one object everywhere; unsaved changes read "Unsaved changes" / "Discard".
20
+
- **Confirmations** go through `ConfirmDialog` with a real `pendingLabel` ("Deleting…"), `safe` when nothing is lost (`confirm-owner`). Titles are "{Verb} {object}" with no question mark, identical for one object everywhere: a dialog about one named object names it ("Delete Daily brief", "Disconnect Gmail") and the description keeps only the consequence; otherwise the noun ("Delete 3 rows"). Unsaved changes read "Unsaved changes" / "Discard".
21
21
- **Verbs**: editing saves with "Save", creating says "Create {noun}", adding a connection or credential says "Add {noun}", OAuth keeps "Connect".
22
-
- **Empty and no-results**: an empty list is `EmptyState` (`Muted` in a narrow rail or dialog picker); no results read "No matching {noun}", the query in curly quotes, no period.
22
+
- **Empty and no-results**: an empty list is `EmptyState` (`Muted` in a narrow rail or dialog picker); no results read "No matching {noun}": no query, no "found", no period (`copy-case`).
23
23
- **Back, tabs, alerts, tooltips** belong to their owners: `DirectoryBack` / `DetailHeader` with bare-noun labels (`back-owner`), `ContentTabs` (`tab-owner`), `InlineNotice` / `FailureNotice` / a field's `error` (`alert-owner`), and `Tooltip` / `OverflowText` rather than a native `title=` (`native-title`). Statuses use Logs' words: a failed run reads "Failed".
24
24
25
25
**Carve-out — settings section metadata.** `SettingsNavigationItem.description` in `components/settings/navigation.ts` stays required, and `SettingsPanel` keeps rendering it as the page subtitle. Settings sections are reached through a nav list where the description is the only thing distinguishing adjacent sections, so it earns its place by the "prevents misunderstanding" test. Keep those descriptions verb-first and one line, per `sim-settings-pages.md`. Everything else on a settings page — inline `<p>` blurbs under section headings, field hints, modal bodies, row subtitles — follows the default rule above.
0 commit comments