Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
59 commits
Select commit Hold shift + click to select a range
f2e0844
feat(mothership): home chat UX — grey tray, inline chat open, title b…
andresdjasso Jun 4, 2026
65bac26
feat(emcn/toast): redesign toast — intent variants, Sonner-style stac…
andresdjasso Jun 8, 2026
e5aae91
feat(emcn/icons): add MessageCircle icon + icon audit worklist and ga…
andresdjasso Jun 9, 2026
a247900
feat(mothership): activity view, chat resource persistence, embedded …
andresdjasso Jun 9, 2026
f9b34f4
feat(workspace): hidden-sidebar chrome, chat-everywhere title bars, p…
andresdjasso Jun 9, 2026
79ed4ae
chore(next): pin turbopack root to the monorepo, skip optimizeCss in dev
andresdjasso Jun 9, 2026
6d848b7
fix(resource-header): match the chat title bar chrome rhythm
andresdjasso Jun 9, 2026
ae0464c
fix(resource-header): lift chrome controls out of the clipping breadc…
andresdjasso Jun 9, 2026
b6ffcc0
fix(chat-switcher): never show another chat's name on the new-chat em…
andresdjasso Jun 10, 2026
de8e732
chore(chat-switcher): drop the "Chats /" prefix — icon + title only
andresdjasso Jun 10, 2026
2f6f6ea
fix(mothership): persist failed turns so errors stay visible in the chat
andresdjasso Jun 10, 2026
ea6ed75
feat(mothership): workspace-owned tab strip — chats add and highlight…
andresdjasso Jun 11, 2026
23bccb3
fix(resource-tabs): follow the dominant wheel axis so trackpad swipes…
andresdjasso Jun 11, 2026
9dda667
feat(mothership): spotlight tab layout — active resource as title, co…
andresdjasso Jun 11, 2026
8b9fd6f
feat(resource-tabs): width-aware tab overflow — fit what fits, +N onl…
andresdjasso Jun 11, 2026
fea96b5
refactor(resource-tabs): one home per tab — title chip drops its drop…
andresdjasso Jun 11, 2026
fa017e3
fix(resource-tabs): never truncate inline tabs — fit whole tabs by me…
andresdjasso Jun 11, 2026
830827b
chore(resource-tabs): drop the green update dots and their tracking p…
andresdjasso Jun 11, 2026
3f214c9
fix(chrome): pin the toggle+chat-switcher cluster so it never shifts …
andresdjasso Jun 11, 2026
ba98a76
fix(resource-tabs): activate tabs in place — selection never repositi…
andresdjasso Jun 11, 2026
d853d95
style(resource-tabs): align the +N dropdown to the workspace dropdown…
andresdjasso Jun 11, 2026
ff51b01
feat(chat-switcher): opening a chat keeps the current page as the foc…
andresdjasso Jun 11, 2026
09a4066
style(resource-tabs): overlay the close control on a gradient fade — …
andresdjasso Jun 11, 2026
75760de
fix(mothership): agent-touched resources focus their tab — chat can d…
andresdjasso Jun 11, 2026
5c42aa8
style(mothership-chat): messages fade into the input instead of hard-…
andresdjasso Jun 11, 2026
d3b291b
feat(icons): vendor Hugeicons stroke-rounded set, remove lucide-react
andresdjasso Jun 11, 2026
b981a06
style(chat-history): scrollbar hugs the dropdown edge with a slim ins…
andresdjasso Jun 11, 2026
1bc72e6
feat(icons): vendor Hugeicons stroke-rounded set, remove lucide-react
andresdjasso Jun 11, 2026
c8fba0a
style(chat-history): tighten row right inset toward the scrollbar
andresdjasso Jun 11, 2026
9007ee8
fix(mothership): chat titles generate again — fallback to local provi…
andresdjasso Jun 11, 2026
6bedb57
refactor(resource-actions): retire open-in-page buttons — collapsing …
andresdjasso Jun 11, 2026
14fa20d
style(chat): unify on the bubble-clock icon and rename "All Chats" to…
andresdjasso Jun 11, 2026
4519b6c
Merge origin/main into design-updates — sync 136 upstream commits
andresdjasso Jun 11, 2026
34ba9e7
feat(emcn): ThinkingLoader — the Recents icon spins while the chat ge…
andresdjasso Jun 11, 2026
8bf590c
style(integrations): sidebar toggle in the tabs header — no chat swit…
andresdjasso Jun 11, 2026
1bf9125
style(sidebar): workflow rows lead with the Workflow glyph
andresdjasso Jun 11, 2026
5305670
refactor(panel): retire the workflow editor's Copilot tab
andresdjasso Jun 11, 2026
65ee6ad
feat(workflow): docked chat — chat is the constant, the editor owns t…
andresdjasso Jun 11, 2026
db0fd90
feat(workflow): draggable divider between the docked chat and the editor
andresdjasso Jun 11, 2026
d3e777b
feat(chat-switcher): split the icon-only chip — icon opens the latest…
andresdjasso Jun 11, 2026
e5e8295
style(workflow): canvas title + split-chip hover wash + pinned icon p…
andresdjasso Jun 11, 2026
ef31105
style(workflow): top fade between the canvas and the chrome row
andresdjasso Jun 11, 2026
9974073
fix(thinking-loader): phase-lock all instances to a shared wall-clock…
andresdjasso Jun 11, 2026
9f593d1
style(workflow): pin the canvas title to the 30px chrome midline
andresdjasso Jun 11, 2026
b1d3536
feat(workflow): stage stack — resources card over the editor, never i…
andresdjasso Jun 11, 2026
062867c
style(chat-switcher): titled chip splits too when the chat pane is cl…
andresdjasso Jun 11, 2026
d37d02a
style(workflow): stage stack as detached cards — back card is identit…
andresdjasso Jun 11, 2026
1950049
feat(workflow): stage stack flips both ways — slimmer, page-bg identi…
andresdjasso Jun 11, 2026
3df0261
style(workflow): stacked mode floats everything on the chrome backdrop
andresdjasso Jun 11, 2026
44f7229
style(chrome): drop the content card frame in floating-stage mode
andresdjasso Jun 12, 2026
8f2cf16
fix(workflow): no frame flash or empty stack card during load
andresdjasso Jun 12, 2026
f6c5799
fix(chrome): frame-free from the first paint on floating-stage deep l…
andresdjasso Jun 12, 2026
b9cedfa
style(workflow): the flip keeps the stack — editor wears card chrome …
andresdjasso Jun 12, 2026
8851047
style(workflow): symmetric stack peeks — resources bar behind the edi…
andresdjasso Jun 12, 2026
a6cd70b
style(workflow): peek bars share the card family's 12px radius
andresdjasso Jun 12, 2026
a06ebec
style(resize): hover grab pill + tooltip on the pane dividers
andresdjasso Jun 12, 2026
ac8a357
style(workflow): stack-mode resize lives in the gap between modules
andresdjasso Jun 12, 2026
449d424
fix(workflow): chrome cluster survives the stack when the chat is closed
andresdjasso Jun 12, 2026
cb7dd67
fix(chrome): sidebar flyout drops with the toggle in floating-stage mode
andresdjasso Jun 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion apps/sim/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -45,4 +45,4 @@ next-env.d.ts
# Uploads
/uploads

.trigger
.trigger.env.local.bak*
2 changes: 1 addition & 1 deletion apps/sim/app/(auth)/login/login-form.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import { useEffect, useRef, useState } from 'react'
import { createLogger } from '@sim/logger'
import { getErrorMessage } from '@sim/utils/errors'
import { Eye, EyeOff } from 'lucide-react'
import Link from 'next/link'
import { useRouter, useSearchParams } from 'next/navigation'
import {
Expand All @@ -17,6 +16,7 @@ import {
Label,
Loader,
} from '@/components/emcn'
import { Eye, EyeOff } from '@/components/emcn/icons'
import { requestJson } from '@/lib/api/client/request'
import { forgetPasswordContract } from '@/lib/api/contracts'
import { client } from '@/lib/auth/auth-client'
Expand Down
2 changes: 1 addition & 1 deletion apps/sim/app/(auth)/reset-password/reset-password-form.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
'use client'

import { useState } from 'react'
import { Eye, EyeOff } from 'lucide-react'
import { Input, Label, Loader } from '@/components/emcn'
import { Eye, EyeOff } from '@/components/emcn/icons'
import { cn } from '@/lib/core/utils/cn'
import { AUTH_SUBMIT_BTN } from '@/app/(auth)/components/auth-button-classes'

Expand Down
2 changes: 1 addition & 1 deletion apps/sim/app/(auth)/signup/signup-form.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
import { Suspense, useEffect, useMemo, useRef, useState } from 'react'
import { Turnstile, type TurnstileInstance } from '@marsidev/react-turnstile'
import { createLogger } from '@sim/logger'
import { Eye, EyeOff } from 'lucide-react'
import Link from 'next/link'
import { useRouter, useSearchParams } from 'next/navigation'
import { usePostHog } from 'posthog-js/react'
import { Input, Label, Loader } from '@/components/emcn'
import { Eye, EyeOff } from '@/components/emcn/icons'
import { client, useSession } from '@/lib/auth/auth-client'
import { getEnv, isFalsy, isTruthy } from '@/lib/core/config/env'
import { validateCallbackUrl } from '@/lib/core/security/input-validation'
Expand Down
3 changes: 1 addition & 2 deletions apps/sim/app/(landing)/blog/[slug]/share-button.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
'use client'

import { useState } from 'react'
import { Share2 } from 'lucide-react'
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
} from '@/components/emcn'
import { Duplicate } from '@/components/emcn/icons'
import { Duplicate, Share2 } from '@/components/emcn/icons'
import { LinkedInIcon, xIcon as XIcon } from '@/components/icons'

interface ShareButtonProps {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import { useEffect, useMemo, useState } from 'react'
import { createLogger } from '@sim/logger'
import { X } from 'lucide-react'
import Image from 'next/image'
import { useRouter } from 'next/navigation'
import {
Expand All @@ -14,6 +13,7 @@ import {
ModalTitle,
ModalTrigger,
} from '@/components/emcn'
import { X } from '@/components/emcn/icons'
import { GithubIcon, GoogleIcon } from '@/components/icons'
import { requestJson } from '@/lib/api/client/request'
import { type AuthProviderStatusResponse, getAuthProvidersContract } from '@/lib/api/contracts/auth'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -946,7 +946,7 @@ function MockFullTable({ revealedRows }: { revealedRows: number }) {
<div className='flex items-center gap-1.5'>
<ColumnTypeIcon />
<span className='font-medium text-[#1C1C1C] text-[13px]'>{col}</span>
<ChevronDown className='ml-auto h-[7px] w-[9px] shrink-0 text-[#CCC]' />
<ChevronDown className='ml-auto size-[14px] shrink-0 text-[#CCC]' />
</div>
</th>
))}
Expand Down
2 changes: 1 addition & 1 deletion apps/sim/app/(landing)/components/footer/footer-cta.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
'use client'

import { useCallback, useRef, useState } from 'react'
import { ArrowUp } from 'lucide-react'
import dynamic from 'next/dynamic'
import { ArrowUp } from '@/components/emcn/icons'
import { cn } from '@/lib/core/utils/cn'
import { handleKeyboardActivation } from '@/lib/core/utils/keyboard'
import { captureClientEvent } from '@/lib/posthog/client'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@

import { memo, useCallback, useEffect, useRef, useState } from 'react'
import { AnimatePresence, domAnimation, LazyMotion, m } from 'framer-motion'
import { ArrowUp, Table } from 'lucide-react'
import { Blimp, Checkbox, ChevronDown } from '@/components/emcn'
import { TypeBoolean, TypeNumber, TypeText } from '@/components/emcn/icons'
import { ArrowUp, Table, TypeBoolean, TypeNumber, TypeText } from '@/components/emcn/icons'
import { captureClientEvent } from '@/lib/posthog/client'
import { useLandingSubmit } from '@/app/(landing)/components/landing-preview/components/landing-preview-panel/landing-preview-panel'
import { EASE_OUT } from '@/app/(landing)/components/landing-preview/components/landing-preview-workflow/workflow-data'
Expand Down Expand Up @@ -221,7 +220,7 @@ export const LandingPreviewHome = memo(function LandingPreviewHome({
Mothership
</span>
<ChevronDown
className='h-[7px] w-[9px] transition-transform duration-150'
className='size-[14px] transition-transform duration-150'
style={{
color: C.TEXT_ICON,
transform: toolsExpanded ? 'rotate(0deg)' : 'rotate(-90deg)',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

import { memo, useCallback, useEffect, useRef, useState } from 'react'
import { AnimatePresence, domMax, LazyMotion, m } from 'framer-motion'
import { ArrowUp } from 'lucide-react'
import dynamic from 'next/dynamic'
import { useRouter } from 'next/navigation'
import { createPortal } from 'react-dom'
import { Blimp, BubbleChatPreview, ChevronDown, MoreHorizontal, Play } from '@/components/emcn'
import { ArrowUp } from '@/components/emcn/icons'
import { AgentIcon, HubspotIcon, OpenAIIcon, SalesforceIcon } from '@/components/icons'
import { LandingPromptStorage } from '@/lib/core/utils/browser-storage'
import { captureClientEvent } from '@/lib/posthog/client'
Expand Down Expand Up @@ -432,7 +432,7 @@ function EditorTabContent({ editorPrompt, typedLength }: EditorTabContentProps)
<div className='flex h-[32px] items-center gap-2 rounded-[4px] border border-[#3d3d3d] bg-[#292929] px-2'>
{ModelIcon && <ModelIcon className='h-[14px] w-[14px] text-[#e6e6e6]' />}
<span className='flex-1 truncate font-medium text-[#e6e6e6] text-sm'>{model}</span>
<ChevronDown className='h-[7px] w-[9px] text-[#636363]' />
<ChevronDown className='size-[14px] text-[#636363]' />
</div>
</div>
)}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -446,7 +446,7 @@ function SpreadsheetView({ tableId, tableName, onBack }: SpreadsheetViewProps) {
<span className='select-none text-[var(--text-icon)] text-sm'>/</span>
<span className='inline-flex items-center px-2 py-1 font-medium text-[var(--text-body)] text-sm'>
{tableName}
<ChevronDown className='ml-2 h-[7px] w-[9px] shrink-0 text-[var(--text-muted)]' />
<ChevronDown className='ml-2 size-[14px] shrink-0 text-[var(--text-muted)]' />
</span>
</div>
</div>
Expand All @@ -472,7 +472,7 @@ function SpreadsheetView({ tableId, tableName, onBack }: SpreadsheetViewProps) {
<span className='ml-1.5 min-w-0 overflow-clip text-ellipsis whitespace-nowrap font-medium text-[var(--text-primary)] text-small'>
{col.label}
</span>
<ChevronDown className='ml-auto h-[7px] w-[9px] shrink-0 text-[var(--text-muted)]' />
<ChevronDown className='ml-auto size-[14px] shrink-0 text-[var(--text-muted)]' />
</div>
</th>
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

import { memo } from 'react'
import { domAnimation, LazyMotion, m } from 'framer-motion'
import { Database } from 'lucide-react'
import { Handle, type NodeProps, Position } from 'reactflow'
import { Blimp } from '@/components/emcn'
import { Database } from '@/components/emcn/icons'
import {
AgentIcon,
AnthropicIcon,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
'use client'

import { useMemo, useSyncExternalStore } from 'react'
import { CheckCircle2, Circle, ExternalLink, GraduationCap } from 'lucide-react'
import Link from 'next/link'
import { Loader } from '@/components/emcn'
import { Circle, CircleCheck, ExternalLink, GraduationCap } from '@/components/emcn/icons'
import {
getCompletedLessonsFromSnapshot,
getCompletedLessonsSnapshot,
Expand Down Expand Up @@ -77,7 +77,7 @@ export function CourseProgress({ course, courseSlug }: CourseProgressProps) {
className='flex items-center gap-3 rounded-[8px] border border-[#2A2A2A] bg-[#222] px-4 py-3 text-[14px] transition-colors hover:border-[#3A3A3A] hover:bg-[#272727]'
>
{completedIds.has(lesson.id) ? (
<CheckCircle2 className='size-4 flex-shrink-0 text-[#4CAF50]' />
<CircleCheck className='size-4 flex-shrink-0 text-[#4CAF50]' />
) : (
<Circle className='size-4 flex-shrink-0 text-[#444]' />
)}
Expand Down
2 changes: 1 addition & 1 deletion apps/sim/app/academy/(catalog)/[courseSlug]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Clock, GraduationCap } from 'lucide-react'
import type { Metadata } from 'next'
import Link from 'next/link'
import { notFound } from 'next/navigation'
import { Clock, GraduationCap } from '@/components/emcn/icons'
import { COURSES, getCourse } from '@/lib/academy/content'
import { CourseProgress } from './components/course-progress'

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ import { cache } from 'react'
import { db } from '@sim/db'
import { academyCertificate } from '@sim/db/schema'
import { eq } from 'drizzle-orm'
import { CheckCircle2, GraduationCap, XCircle } from 'lucide-react'
import type { Metadata } from 'next'
import { notFound } from 'next/navigation'
import { CircleCheck, GraduationCap, XCircle } from '@/components/emcn/icons'
import type { AcademyCertificate } from '@/lib/academy/types'
import { academyCertificateMetadataSchema } from '@/lib/api/contracts/academy'

Expand Down Expand Up @@ -84,7 +84,7 @@ export default async function CertificatePage({ params }: CertificatePageProps)

{certificate.status === 'active' ? (
<div className='flex items-center justify-center gap-2 text-[#4CAF50]'>
<CheckCircle2 className='size-4' />
<CircleCheck className='size-4' />
<span className='font-[430] text-[14px]'>Verified</span>
</div>
) : (
Expand Down
2 changes: 1 addition & 1 deletion apps/sim/app/academy/(catalog)/page.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { BookOpen, Clock } from 'lucide-react'
import Link from 'next/link'
import { BookOpen, Clock } from '@/components/emcn/icons'
import { COURSES } from '@/lib/academy/content'

export default function AcademyCatalogPage() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
'use client'

import { useCallback, useState } from 'react'
import { CheckCircle2 } from 'lucide-react'
import { CircleCheck } from '@/components/emcn/icons'
import { markLessonComplete } from '@/lib/academy/local-progress'
import type { ExerciseBlockState, ExerciseDefinition, ExerciseEdgeState } from '@/lib/academy/types'
import { SandboxCanvasProvider } from '@/app/academy/components/sandbox-canvas-provider'
Expand Down Expand Up @@ -56,7 +56,7 @@ export function ExerciseView({
{completed && (
<div className='pointer-events-none absolute inset-0 flex items-start justify-center pt-5'>
<div className='pointer-events-auto flex items-center gap-2 rounded-full border border-[#3A4A3A] bg-[#1F2A1F]/95 px-4 py-2 font-[430] text-[#4CAF50] text-[13px] shadow-lg backdrop-blur-sm'>
<CheckCircle2 className='size-4' />
<CircleCheck className='size-4' />
Exercise complete!
</div>
</div>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
'use client'

import { useState } from 'react'
import { CheckCircle2, XCircle } from 'lucide-react'
import { CircleCheck, XCircle } from '@/components/emcn/icons'
import { markLessonComplete } from '@/lib/academy/local-progress'
import type { QuizDefinition, QuizQuestion } from '@/lib/academy/types'
import { cn } from '@/lib/core/utils/cn'
Expand Down Expand Up @@ -202,7 +202,7 @@ export function LessonQuiz({ lessonId, quizConfig, onPass }: LessonQuizProps) {
)}
>
{isCorrect ? (
<CheckCircle2 className='mt-0.5 size-3.5 flex-shrink-0' />
<CircleCheck className='mt-0.5 size-3.5 flex-shrink-0' />
) : (
<XCircle className='mt-0.5 size-3.5 flex-shrink-0' />
)}
Expand Down
2 changes: 1 addition & 1 deletion apps/sim/app/academy/[courseSlug]/[lessonSlug]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
'use client'

import { use, useCallback, useEffect, useMemo, useState } from 'react'
import { ChevronLeft, ChevronRight } from 'lucide-react'
import Image from 'next/image'
import Link from 'next/link'
import { ChevronLeft, ChevronRight } from '@/components/emcn/icons'
import { getCourse } from '@/lib/academy/content'
import { markLessonComplete } from '@/lib/academy/local-progress'
import type { Lesson } from '@/lib/academy/types'
Expand Down
4 changes: 2 additions & 2 deletions apps/sim/app/academy/components/validation-checklist.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use client'

import { CheckCircle2, Circle } from 'lucide-react'
import { Circle, CircleCheck } from '@/components/emcn/icons'
import type { ValidationRuleResult } from '@/lib/academy/types'
import { cn } from '@/lib/core/utils/cn'

Expand Down Expand Up @@ -30,7 +30,7 @@ export function ValidationChecklist({ results, allPassed }: ValidationChecklistP
{results.map((result) => (
<li key={result.message} className='flex items-start gap-2'>
{result.passed ? (
<CheckCircle2 className='mt-0.5 size-3.5 flex-shrink-0 text-[#4CAF50]' />
<CircleCheck className='mt-0.5 size-3.5 flex-shrink-0 text-[#4CAF50]' />
) : (
<Circle className='mt-0.5 size-3.5 flex-shrink-0 text-[#444]' />
)}
Expand Down
Loading
Loading