Skip to content

Commit 5dbb9a5

Browse files
authored
v0.7.57: forking webhook URL, markdown editor overflow, fix ui improvements
2 parents 404bc6a + 9ff7eae commit 5dbb9a5

97 files changed

Lines changed: 4471 additions & 399 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.claude/rules/sim-ui-copy.md

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
---
2+
paths:
3+
- "apps/sim/**/*.tsx"
4+
- "apps/sim/components/emcn/**"
5+
---
6+
7+
# UI Copy
8+
9+
**Do not add subtitles, helper text, or descriptive copy beneath headings, labels, cards, or settings by default.** Prefer one concise, self-explanatory heading or label. Only add supporting copy when the user explicitly asks for it, or when it is necessary to prevent misunderstanding or error — and never use it to restate the heading.
10+
11+
This applies to product surfaces: settings rows, modals, panels, cards, list rows, empty states, form fields, and section headers. Marketing surfaces (`app/(landing)`, docs) are governed by `constitution.md` instead.
12+
13+
**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.
14+
15+
## The default is no description
16+
17+
```tsx
18+
// ✗ Bad — the subtitle restates the heading
19+
<h3>API Keys</h3>
20+
<p className='text-[var(--text-muted)] text-caption'>Manage your API keys.</p>
21+
22+
// ✗ Bad — decorative filler under a field label
23+
<ChipModalField title='Workspace name' hint='The name of your workspace.' />
24+
25+
// ✓ Good — the label carries the whole meaning
26+
<h3>API Keys</h3>
27+
<ChipModalField title='Workspace name' />
28+
```
29+
30+
If a heading needs a subtitle to be understood, the heading is wrong. Fix the heading — don't append a second line.
31+
32+
## When supporting copy earns its place
33+
34+
Keep (or add) a description only when it carries information the label cannot, and its absence would cause a mistake:
35+
36+
- **Irreversible or destructive consequences** — "Deleting this workspace removes every workflow and log. This cannot be undone."
37+
- **A non-obvious format, unit, or bound** — "Comma-separated. Max 50 domains.", "Cost per 1M input tokens."
38+
- **A security or access implication** — "This key is shown once and grants full workspace access."
39+
- **A state the user cannot otherwise see** — "Inherited from your organization's policy."
40+
- **Instructional copy that advances a flow** — "We sent a 6-digit code to you@example.com."
41+
42+
Everything else — restatements, "Manage your X", "Configure your Y", feature blurbs, encouragement — gets deleted.
43+
44+
## Component APIs
45+
46+
Description/hint slots on shared components are **optional**, never required, and must reserve no layout space when omitted. A component that forces every consumer to supply a subtitle forces every consumer to violate this rule. When adding a new shared component, ship it without a description slot and add one only once a real caller meets the bar above.

.cursor/rules/sim-ui-copy.mdc

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
---
2+
description: UI copy conventions — no default subtitles or helper text under headings, labels, cards, or settings
3+
globs: ["apps/sim/**/*.tsx"]
4+
---
5+
# UI Copy
6+
7+
**Do not add subtitles, helper text, or descriptive copy beneath headings, labels, cards, or settings by default.** Prefer one concise, self-explanatory heading or label. Only add supporting copy when the user explicitly asks for it, or when it is necessary to prevent misunderstanding or error — and never use it to restate the heading.
8+
9+
This applies to product surfaces: settings rows, modals, panels, cards, list rows, empty states, form fields, and section headers. Marketing surfaces (`app/(landing)`, docs) are governed by `constitution.mdc` instead.
10+
11+
**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. Everything else on a settings page — inline `<p>` blurbs under section headings, field hints, modal bodies, row subtitles — follows the default rule above.
12+
13+
## The default is no description
14+
15+
```tsx
16+
// ✗ Bad — the subtitle restates the heading
17+
<h3>API Keys</h3>
18+
<p className='text-[var(--text-muted)] text-caption'>Manage your API keys.</p>
19+
20+
// ✗ Bad — decorative filler under a field label
21+
<ChipModalField title='Workspace name' hint='The name of your workspace.' />
22+
23+
// ✓ Good — the label carries the whole meaning
24+
<h3>API Keys</h3>
25+
<ChipModalField title='Workspace name' />
26+
```
27+
28+
If a heading needs a subtitle to be understood, the heading is wrong. Fix the heading — don't append a second line.
29+
30+
## When supporting copy earns its place
31+
32+
Keep (or add) a description only when it carries information the label cannot, and its absence would cause a mistake:
33+
34+
- **Irreversible or destructive consequences** — "Deleting this workspace removes every workflow and log. This cannot be undone."
35+
- **A non-obvious format, unit, or bound** — "Comma-separated. Max 50 domains.", "Cost per 1M input tokens."
36+
- **A security or access implication** — "This key is shown once and grants full workspace access."
37+
- **A state the user cannot otherwise see** — "Inherited from your organization's policy."
38+
- **Instructional copy that advances a flow** — "We sent a 6-digit code to you@example.com."
39+
40+
Everything else — restatements, "Manage your X", "Configure your Y", feature blurbs, encouragement — gets deleted.
41+
42+
## Component APIs
43+
44+
Description/hint slots on shared components are **optional**, never required, and must reserve no layout space when omitted. A component that forces every consumer to supply a subtitle forces every consumer to violate this rule. When adding a new shared component, ship it without a description slot and add one only once a real caller meets the bar above.

apps/sim/app/(landing)/components/landing-preview/components/landing-preview-logs/landing-preview-logs.tsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -236,10 +236,7 @@ export function LandingPreviewLogs() {
236236
<thead className='border-[var(--border)] border-b'>
237237
<tr>
238238
{COL_HEADERS.map(({ key, label }) => (
239-
<th
240-
key={key}
241-
className='h-10 px-6 py-1.5 text-left align-middle font-normal text-caption'
242-
>
239+
<th key={key} className='h-10 px-6 py-1.5 text-left align-middle text-caption'>
243240
<button
244241
type='button'
245242
onClick={() => handleSort(key)}

apps/sim/app/(landing)/components/landing-preview/components/landing-preview-resource/landing-preview-resource.tsx

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,7 @@ export function LandingPreviewResource({
131131
<thead className='border-[var(--border)] border-b'>
132132
<tr>
133133
{columns.map((col) => (
134-
<th
135-
key={col.id}
136-
className='h-10 px-6 py-1.5 text-left align-middle font-normal text-caption'
137-
>
134+
<th key={col.id} className='h-10 px-6 py-1.5 text-left align-middle text-caption'>
138135
<button
139136
type='button'
140137
onClick={() => handleSortClick(col.id)}

apps/sim/app/(landing)/components/landing-preview/components/landing-preview-tables/landing-preview-tables.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,7 @@ function SpreadsheetView({ tableId, tableName, onBack }: SpreadsheetViewProps) {
467467
<th key={col.id} className={CELL_HEADER}>
468468
<div className='flex h-full w-full min-w-0 items-center px-2 py-[7px]'>
469469
<Icon className='size-3 shrink-0 text-[var(--text-icon)]' />
470-
<span className='ml-1.5 min-w-0 overflow-clip text-ellipsis whitespace-nowrap font-medium text-[var(--text-primary)] text-small'>
470+
<span className='ml-1.5 min-w-0 overflow-clip text-ellipsis whitespace-nowrap text-[var(--text-primary)] text-small'>
471471
{col.label}
472472
</span>
473473
<ChevronDown className='ml-auto size-[14px] shrink-0 text-[var(--text-muted)]' />

apps/sim/app/(landing)/knowledge/components/knowledge-hero-loop.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ export function KnowledgeHeroLoop() {
214214
{COL_HEADERS.map((header) => (
215215
<th
216216
key={header}
217-
className='h-10 px-6 py-1.5 text-left align-middle font-normal text-[var(--text-muted)] text-caption'
217+
className='h-10 px-6 py-1.5 text-left align-middle text-[var(--text-muted)] text-caption'
218218
>
219219
{header}
220220
</th>

apps/sim/app/(landing)/logs/components/logs-hero-loop.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ export function LogsHeroLoop() {
335335
{COL_HEADERS.map((label) => (
336336
<th
337337
key={label}
338-
className='h-10 px-6 py-1.5 text-left align-middle font-normal text-[var(--text-muted)] text-caption'
338+
className='h-10 px-6 py-1.5 text-left align-middle text-[var(--text-muted)] text-caption'
339339
>
340340
{label}
341341
</th>

apps/sim/app/(landing)/tables/components/tables-hero-loop.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ function TablesGridPane({ rowCount, filledCount }: TablesGridPaneProps) {
316316
<th key={column.id} className={CELL_HEADER}>
317317
<div className='flex h-full w-full min-w-0 items-center px-2 py-[7px]'>
318318
<Icon className='size-3 shrink-0 text-[var(--text-icon)]' />
319-
<span className='ml-1.5 min-w-0 overflow-clip text-ellipsis whitespace-nowrap font-medium text-[var(--text-primary)] text-small'>
319+
<span className='ml-1.5 min-w-0 overflow-clip text-ellipsis whitespace-nowrap text-[var(--text-primary)] text-small'>
320320
{column.label}
321321
</span>
322322
<ChevronDown className='ml-auto size-[14px] shrink-0 text-[var(--text-muted)]' />

apps/sim/app/_styles/globals.css

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -658,6 +658,15 @@ html.sidebar-booting .sidebar-shell-inner {
658658
letter-spacing: 0.28px;
659659
}
660660

661+
/* Completes Preflight, which resets h1-h6 to `inherit` but leaves `th` at the
662+
UA `bold`. Without this a table header, and every label, input, and button
663+
inside it, silently renders at 700 — so `font-medium` on a header reads as
664+
a step DOWN, and removing it makes the header heavier. Normalized here once
665+
rather than neutralized at each `<th>`. */
666+
th {
667+
font-weight: inherit;
668+
}
669+
661670
/* Ensure visible text caret across inputs and editors */
662671
input,
663672
textarea,

apps/sim/app/api/wand/route.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,13 @@ export const POST = withRouteHandler(async (req: NextRequest) => {
328328
'\n\nIMPORTANT: Return ONLY the raw cron expression (e.g., "0 9 * * 1-5"). Do NOT wrap it in markdown code blocks, backticks, or quotes. Do NOT include any explanation or text before or after the expression.'
329329
}
330330

331+
// Both the JavaScript and Python function-body prompts share this type, so
332+
// the reinforcement stays language-neutral.
333+
if (generationType === 'javascript-function-body') {
334+
finalSystemPrompt +=
335+
'\n\nIMPORTANT: Return ONLY the raw function body. Do NOT wrap it in markdown code blocks (no ```javascript, no ```python, no ```). Do NOT include any explanation before or after the code.'
336+
}
337+
331338
if (generationType === 'json-object') {
332339
finalSystemPrompt +=
333340
'\n\nIMPORTANT: Return ONLY the raw JSON object. Do NOT wrap it in markdown code blocks (no ```json or ```). Do NOT include any explanation or text before or after the JSON. The response must start with { and end with }.'

0 commit comments

Comments
 (0)