Skip to content

Commit 191c407

Browse files
Merge branch 'staging' into dev
2 parents 542272d + 8774f5c commit 191c407

1,197 files changed

Lines changed: 54059 additions & 20176 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.

.agents/skills/emcn-design-review/SKILL.md

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ Use for context menus and action menus:
234234
<DropdownMenu>
235235
<DropdownMenuTrigger asChild>
236236
<Button variant="ghost">
237-
<MoreHorizontal className="h-[14px] w-[14px]" />
237+
<MoreHorizontal className="size-[14px]" />
238238
</Button>
239239
</DropdownMenuTrigger>
240240
<DropdownMenuContent align="end">
@@ -281,19 +281,21 @@ Rules:
281281
- Stack multiple skeletons for lists
282282

283283
### Icons
284-
Standard sizing — `h-[14px] w-[14px]` is the dominant pattern (400+ uses):
284+
Standard sizing — use the `size-*` shorthand. `size-[14px]` is the dominant pattern:
285285

286286
```tsx
287-
<Icon className="h-[14px] w-[14px] text-[var(--text-icon)]" />
287+
<Icon className="size-[14px] text-[var(--text-icon)]" />
288288
```
289289

290-
Size scale by frequency:
291-
1. `h-[14px] w-[14px]` — default for inline icons (most common)
292-
2. `h-[16px] w-[16px]` — slightly larger inline icons
293-
3. `h-3 w-3` (12px) — compact/tight spaces
294-
4. `h-4 w-4` (16px) — Tailwind equivalent, also common
295-
5. `h-3.5 w-3.5` (14px) — Tailwind equivalent of 14px
296-
6. `h-5 w-5` (20px) — larger icons, section headers
290+
Always prefer `size-*` over the legacy `h-* w-*` pair. `size-[14px]` is canonical; treat any `h-[Npx] w-[Npx]` or `h-N w-N` pair as a refactor target.
291+
292+
Size scale (most common first):
293+
1. `size-[14px]` — default for inline icons
294+
2. `size-[16px]` — slightly larger inline icons
295+
3. `size-3` (12px) — compact/tight spaces
296+
4. `size-4` (16px) — Tailwind equivalent
297+
5. `size-3.5` (14px) — Tailwind equivalent of 14px
298+
6. `size-5` (20px) — larger icons, section headers
297299

298300
Use `text-[var(--text-icon)]` for icon color (113+ uses in codebase).
299301

@@ -332,4 +334,5 @@ Use `text-[var(--text-icon)]` for icon color (113+ uses in codebase).
332334
- Importing from emcn subpaths instead of barrel export
333335
- Using arbitrary z-index (`z-50`, `z-[9999]`) instead of z-index tokens
334336
- Custom shadows instead of shadow tokens
335-
- Icon sizes that don't follow the established scale (default to `h-[14px] w-[14px]`)
337+
- Icon sizes that don't follow the established scale (default to `size-[14px]`)
338+
- Splitting equal height/width into `h-* w-*` pairs instead of the `size-*` shorthand

.claude/commands/emcn-design-review.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ Modal `size="sm"`, title "Delete/Remove {ItemType}", `variant="destructive"` act
6565

6666
## Icons
6767

68-
Default: `h-[14px] w-[14px]` (400+ uses). Color: `text-[var(--text-icon)]`. Scale: 14px > 16px > 12px > 20px.
68+
Default: `size-[14px]`. Color: `text-[var(--text-icon)]`. Scale: 14px > 16px > 12px > 20px. Use the `size-*` shorthand — flag `h-[Npx] w-[Npx]` and `h-N w-N` pairs as refactor targets.
6969

7070
## Anti-patterns to flag
7171

.claude/rules/emcn-components.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,5 @@ function Label({ className, ...props }) {
3232
- Export component and variants (if using CVA)
3333
- TSDoc with usage examples
3434
- Consistent tokens: `font-medium`, `text-[12px]`, `rounded-[4px]`
35+
- Equal height/width → `size-*` (e.g. `size-[14px]`, `size-4`), never `h-[Npx] w-[Npx]` or `h-N w-N`. Default icon size is `size-[14px]`
3536
- `transition-colors` for hover states

.claude/rules/sim-styling.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ paths:
1111
1. **No inline styles** - Use Tailwind classes
1212
2. **No duplicate dark classes** - Skip `dark:` when value matches light mode
1313
3. **Exact values** - `text-[14px]`, `h-[26px]`
14-
4. **Transitions** - `transition-colors` for interactive states
14+
4. **Equal h/w → `size-*`** - Use `size-[14px]` / `size-4`, never `h-[14px] w-[14px]` or `h-4 w-4`. Default icon size is `size-[14px]`
15+
5. **Transitions** - `transition-colors` for interactive states
1516

1617
## Conditional Classes
1718

.cursor/commands/emcn-design-review.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ Modal `size="sm"`, title "Delete/Remove {ItemType}", `variant="destructive"` act
6060

6161
## Icons
6262

63-
Default: `h-[14px] w-[14px]` (400+ uses). Color: `text-[var(--text-icon)]`. Scale: 14px > 16px > 12px > 20px.
63+
Default: `size-[14px]`. Color: `text-[var(--text-icon)]`. Scale: 14px > 16px > 12px > 20px. Use the `size-*` shorthand — flag `h-[Npx] w-[Npx]` and `h-N w-N` pairs as refactor targets.
6464

6565
## Anti-patterns to flag
6666

.github/workflows/test-build.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,9 @@ jobs:
109109
- name: API contract boundary audit
110110
run: bun run check:api-validation:strict
111111

112+
- name: Zustand v5 selector audit
113+
run: bun run check:zustand-v5
114+
112115
- name: Verify realtime prune graph
113116
run: bun run check:realtime-prune
114117

AGENTS.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,12 @@ Use Tailwind only, no inline styles. Use `cn()` from `@/lib/utils` for condition
357357
<div className={cn('base-classes', isActive && 'active-classes')} />
358358
```
359359

360+
For equal height and width, use the `size-*` shorthand — never `h-[Npx] w-[Npx]` or `h-N w-N`. Default icon size is `size-[14px]`.
361+
362+
```typescript
363+
<Icon className='size-[14px] text-[var(--text-icon)]' />
364+
```
365+
360366
## EMCN Components
361367

362368
Import from `@/components/emcn`, never from subpaths (except CSS files). Use CVA when 2+ variants exist.

CLAUDE.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,12 @@ Use Tailwind only, no inline styles. Use `cn()` from `@/lib/utils` for condition
347347
<div className={cn('base-classes', isActive && 'active-classes')} />
348348
```
349349

350+
For equal height and width, use the `size-*` shorthand — never `h-[Npx] w-[Npx]` or `h-N w-N`. Default icon size is `size-[14px]`.
351+
352+
```typescript
353+
<Icon className='size-[14px] text-[var(--text-icon)]' />
354+
```
355+
350356
## EMCN Components
351357

352358
Import from `@/components/emcn`, never from subpaths (except CSS files). Use CVA when 2+ variants exist.

apps/docs/app/[lang]/[[...slug]]/page.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -306,9 +306,12 @@ export async function generateMetadata(props: {
306306
siteName: 'Sim Documentation',
307307
type: 'article',
308308
locale: OG_LOCALE_MAP[lang] ?? 'en_US',
309-
alternateLocale: i18n.languages
310-
.filter((l) => l !== lang)
311-
.map((l) => OG_LOCALE_MAP[l] ?? 'en_US'),
309+
alternateLocale: i18n.languages.reduce<string[]>((locales, l) => {
310+
if (l !== lang) {
311+
locales.push(OG_LOCALE_MAP[l] ?? 'en_US')
312+
}
313+
return locales
314+
}, []),
312315
images: [
313316
{
314317
url: ogImageUrl,

apps/docs/app/[lang]/layout.tsx

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
import { Navbar } from '@/components/navbar/navbar'
1212
import { SimLogoFull } from '@/components/ui/sim-logo'
1313
import { i18n } from '@/lib/i18n'
14+
import { serializeJsonLd } from '@/lib/json-ld'
1415
import { source } from '@/lib/source'
1516
import { DOCS_BASE_URL } from '@/lib/urls'
1617
import '../global.css'
@@ -78,14 +79,6 @@ export default async function Layout({ children, params }: LayoutProps) {
7879
},
7980
},
8081
inLanguage: lang,
81-
potentialAction: {
82-
'@type': 'SearchAction',
83-
target: {
84-
'@type': 'EntryPoint',
85-
urlTemplate: `${DOCS_BASE_URL}/api/search?q={search_term_string}`,
86-
},
87-
'query-input': 'required name=search_term_string',
88-
},
8982
}
9083

9184
return (
@@ -97,7 +90,7 @@ export default async function Layout({ children, params }: LayoutProps) {
9790
<head>
9891
<script
9992
type='application/ld+json'
100-
dangerouslySetInnerHTML={{ __html: JSON.stringify(structuredData) }}
93+
dangerouslySetInnerHTML={{ __html: serializeJsonLd(structuredData) }}
10194
/>
10295
</head>
10396
<body className='flex min-h-screen flex-col font-sans'>

0 commit comments

Comments
 (0)