GeezerVisonThe World Wide Web, restored to 800 pixels of glory. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Home|About|Gaming cabinet|Archives|How it works|Starter sites | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GeezerVison is showing github.com — Build the Platform Core, Chat, and member integrations UI by emir-karabeg · Pull Request #9687 · simstudioai/sim Conversation
|
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
[Medium impact] The changes reach the standalone Platform’s Home, Chat, and Settings flows on web and Desktop. Fix the lost Stop control and covered desktop panel tabs before merging. Findings
SummaryAdds standalone Home, Chat and Settings routes for browsers and Sim Desktop, with shared controls, gated fixtures and browser/Electron checks.
|
Sorry, something went wrong.
There was an error while loading. Please reload this page.
| onStop={ | ||
| last?.response?.state === 'running' ? () => transition(last, 'stopped') : undefined | ||
| } | ||
| onSubmit={(draft) => { | ||
| const next = userTurn(draft) | ||
| if (id && !removed) { | ||
| changes.setTurnsFor(id, [...turns, next]) |
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
In /chat/customer-onboarding?state=full, pressing Enter on a follow-up appends a user turn while the response is running. onStop then disappears because it checks only the last turn, which now has no response. The earlier response stays “Working” with no way to stop it. Track the running turn separately, or block submission while it is running.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
| padding-inline: var(--spacing-12); | ||
| min-inline-size: 0; | ||
| height: var(--height-nav); | ||
| border-block-end: var(--spacing-stroke-default) solid var(--ui-divider); | ||
| } | ||
| :global([data-sim-desktop-title-bar]) .header { | ||
| height: var(--spacing-48); | ||
| -webkit-app-region: drag; |
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
With the desktop sidebar collapsed, expanding the chat panel puts its tabs under the desktop toolbar and native window buttons. The shell places the content at the top-left, but the panel header keeps only 12px of left padding. Unlike the conversation header, it does not use --ui-navigation-inset. Reserve that space when the panel takes over so its first tab and close control remain clickable.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
| <ChatPanels workspaces={shell?.workspaces ?? []} data={panel} key={id?.[0] ?? 'new'}> | ||
| <ChatScreen data={data?.chat ?? null} chatId={id?.[0]} /> |
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Switching chats discards unsent text and selected files. MessageComposer keeps both only in local state, while this route keys the whole panel tree by chat ID. Returning to the original chat creates a fresh composer. Keep drafts in the session, keyed by chat ID, so ordinary navigation does not erase unfinished messages.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
| const [displayName, setDisplayName] = useState(name ?? '') | ||
| const [picture, setPicture] = useState<string>() |
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Saving a display name or choosing a profile picture lasts only until the user leaves Preferences. ProfileSettings owns these values locally and is removed on other Settings sections. Returning restores the fixture name and drops the picture. Keep these local edits in the session provider; no database write is needed.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
| <ProductSurface preference={appearance}> | ||
| <PlatformShell data={shell} desktopTitle={desktopTitle} navigation={navigation}> | ||
| {children} | ||
| </PlatformShell> |
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
Navigation resets shell changes
Each page creates its own PlatformShell, so moving between Home, Chat and Settings resets inbox read marks, dismissed notices and chat sorting. For example, reading an unread item, opening a chat and returning makes that item unread again. Move this session state above the page boundary, alongside the existing chat edits and interface preferences.
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
The reason will be displayed to describe this comment to others. Learn more.
5 issues found and verified against the latest diff
Confidence score: 3/5
chat-screen.tsx, submitted attachments can reappear in the new chat when changing the chat ID remounts the composer. Clear the attachment draft when the send succeeds.workspace-list.tsx, keyboard users get no visible focus indicator on workspace buttons. Add a :focus-visible treatment.product-surface.tsx, users with a dark system theme can see a light flash before hydration. Resolve the system theme before first paint.notification-tray.module.css, notification controls can sit under the home indicator on notched mobile browsers. Account for the bottom safe-area inset.
Check if these issues are valid — if so, understand the root cause of each and fix them. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="apps/sim/platform/design-system/components/workspace-list.tsx">
<violation number="1" location="apps/sim/platform/design-system/components/workspace-list.tsx:43">
P2: This new keyboard-focusable workspace button has no visible focus indicator because the global stylesheet removes outlines and `.workspaceHit` adds none. Add a shared or workspace-specific `:focus-visible` treatment so keyboard users can identify the active row.</violation>
</file>
<file name="apps/sim/platform/design-system/components/product-surface.tsx">
<violation number="1" location="apps/sim/platform/design-system/components/product-surface.tsx:10">
P2: System appearance always renders light on the server, causing dark-system users to see a light flash before hydration applies the media-query result. Resolve the system theme before first paint, such as with a CSS media-query path plus explicit-theme override or a small theme bootstrap.</violation>
</file>
<file name="apps/sim/platform/design-system/components/select.tsx">
<violation number="1" location="apps/sim/platform/design-system/components/select.tsx:37">
P2: An arbitrary `theme` query can reach this controlled value without matching any option, so the Theme picker renders blank even though the surrounding product falls back to `system`. Ignore values outside `options` here or pass the normalized theme from the settings screen.</violation>
</file>
<file name="apps/sim/platform/design-system/features/chat/chat-screen.tsx">
<violation number="1" location="apps/sim/platform/design-system/features/chat/chat-screen.tsx:100">
P2: The first send from `/chat` clears the composer only until `router.replace` changes `id`; this prop then remounts `MessageComposer` with the unchanged draft attachments, so submitted files reappear in the new chat’s composer. Track and consume the initial draft when submitting before navigation.</violation>
</file>
<file name="apps/sim/platform/design-system/components/notification-tray.module.css">
<violation number="1" location="apps/sim/platform/design-system/components/notification-tray.module.css:10">
P2: The fixed notification stack ignores the bottom safe-area inset, so its action and dismiss controls can sit under the home indicator on notched mobile browsers. Use `max(var(--spacing-20), env(safe-area-inset-bottom))` for the bottom offset.
(Based on your team's feedback about toast safe-area minimum.) [8c7692a3-398e-4004-b266-f2a76922d36c]</violation>
</file>
Reply with feedback, questions, or to request a fix.
Turn on auto-fix | Re-trigger cubic
Sorry, something went wrong.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
There was an error while loading. Please reload this page.
6133099 to
8d35586
Compare
…red switch rows, and Knowledge graphs as a form dialog The route picks the live or session profile, theme row and cookie choices, so the views stay prop-driven. Profile accepts the picture types it validates. Account loses the Home page row and its duplicate anonymous guard. Privacy keeps its sub-view, since hosted adds the cookie choices; its rows are SwitchRows and the cookie note is Muted. The consent banner's switches are SwitchRows. Knowledge graphs reads its name from a form Modal, which owns pending, and its section no longer repeats the page title.
The page reads the request's user agent on the server, so macOS shows ⌘⇧P and others Ctrl+Shift+P, with no hydration flip. Shortcut rows keep no description by design: the label names the action and the keys are its value. The DOM test restated the list and the hard-coded key strings; the Record over CommandId already fails type-check for an unlisted command.
…and one theme vocabulary Desktop: every toggle through useDesktopPreferenceMutation and SwitchRow, the device read folded into the page's one read, Computer use below the device settings with its running action still on top, Allowed as a StatusTag, approved apps as a query, and a menu-bar row that says what it does. Browser: one Clear browsing data row whose dialog says what it clears, saved passwords read only on the Passwords view through a query, the open password in the URL, Delete for every removal, and confirms that fail in their dialog instead of reading a missing bridge as success. Terminal: its section named for the page's one job, SwitchRow, Preferences in the TSDoc. Browser, Terminal and the terminal panel share Match Sim, Light and Dark. Drops the migrated pages' allowlist entries.
… settings parts The MCP list reads each server's stored tool count instead of discovering every server's tools, and opening a server, by a click or a shared link, re-discovers that server alone through a probe query its detail mounts, which replaces the ref-guarded deep-link effect. Both MCP pages open servers through useSettingsSubview, list them in a SettingsList that ends in a New row, delete from a Manage section, and drop counts from headings and the repeated server name. Deployed workflows load only while the create dialog is open.
…ed on the shared settings parts The sandbox editor owns its draft and mutations, keyed by the sandbox it opened, which retires the draft-owner state set during render and the eighteen drilled props; create opens through useSettingsSubview and submits through Create sandbox, edits through SettingsSaveBar. Teammates lists members and invites under one SettingsList ending in Invite teammates, whose button is disabled with its reason, or reads View plans where a plan limit closes it. Recently deleted merges restored rows without splicing during render and labels types in sentence case.
…arts Members: SectionStack and SettingsList in place of a local panel and EmptyState inside a surface, no counts in headings, Invite's disabledReason, confirm titles that name the object. Billing and Insights share one PeriodPicker (no getElementById focus hack) and one UsageLedger with Export in its header; the export busy flag resets in finally. Credit usage is gated on the server instead of an effect redirect. Invoices are a ResourceList of ActivityRows; Manage in Stripe is the one portal action. On-demand uses SwitchRow with the lock reason in its description. Insights: the heatmap fits the column without a ScrollArea (narrow widths drop the oldest weeks through a container query), one UsageBlock replaces three hand-built sections, the toolbar is SectionToolbar, Activity's workspace drill-in uses DetailHeader, and the activity summary lives on Activity only.
… pager People pages in the browser through an infinite query seeded by the server read, ending in LoadMoreFooter, in place of a client slice plus a server Next page; the view no longer filters what the read already matched. Removing a workspace's access is a row menu Remove behind ConfirmDialog, and its 1000-workspace limit is a model constant. The provider icon mapping moves into the model, the tab strip is no longer wrapped in an ActionRow, and the lists drop the headings that repeated their tab. Searches carry placeholders and show only with rows to search; empty lists are EmptyStates outside the surface with their create action.
… the shared parts Whitelabeling commits through SettingsSaveBar, which now owns its leave guard. Recently deleted: Restoring…, a placeholder with …, no search with nothing deleted, SectionStack. Requests: SwitchRow for Allow requests, one toolbar of search and status filter by the list, a plain Requests heading. Links: one SectionToolbar (bordered search, Sort, New link), no second New link in the empty state, the table's default viewport offset instead of hand arithmetic, and the name cell and row menu split into their own files. Drops the migrated pages' allowlist entries.
# Conflicts: # scripts/platform-allowlists.ts
The secrets editor splits into GenericSecrets, WorkspaceSecrets, SecretRows and the row cells, commits through SettingsSaveBar, and shows an empty scope as a SettingsList empty state with Add secret instead of a blank row under a disabled Save. A secret's detail and its usage view open through useSettingsSubview (?secret=, ?secret-view=), so the secrets section no longer declares a path subpath; the detail drops the repeated Key field, its visibility switch is a SwitchRow, and the credential form leaves the leave guard to the save bar.
…OK's either-scope keys as one query
# Conflicts: # scripts/platform-allowlists.ts
…nd drop the five local wrappers that did it
…RL tabs, shared parts on SCIM, admin, Mothership, Search MCP and Slack
# Conflicts: # scripts/platform-allowlists.ts
…age, not Next's bare default
…iring # Conflicts: # .agents/skills/add-block/SKILL.md # apps/sim/components/integrations/connect-service-account-modal/google-keyless-fields.tsx # apps/sim/components/integrations/connect-service-account-modal/snowflake-account-modal.tsx
…red auth mode (#9878's reconnectAuthType)
…he server-read SSO list
…ited, not never SaveActions disables Save whenever blockedReason is set, and both pages passed a fixed reason, so their Save stayed disabled through every edit.
…e sub-view and the named confirm titles
Removes the api-key-read-only flag from the Platform surface too: the surface contract, organization surface resolver, the read-only key hook, and both create-key modals now always offer read-only access.
57504589
Deployed
There was an error while loading. Please reload this page.
Successfully merging this pull request may close these issues.
There was an error while loading. Please reload this page.