Repository navigation
Experiment 2.0 - #327
Experiment 2.0#327
Conversation
…ng test Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Slider as a Submodel (values plus the dragged thumb) whose view renders in the parent's builder with the label, output and track parts. Like the legacy SliderTrack default it renders one thumb, even for a range value. Arrow keys go through the native range input; PageUp/PageDown/Home/End are handled as in useSliderThumb. Pressing the track moves the closest thumb, focuses it and starts a drag that follows document pointer moves, reading the track rect the way @foldkit/ui's slider does. The class lists and the fill's inline style move to slider.styles.ts. Parity, legacy-head vs foldkit, gallery-slider* (6 scenarios x light/dark, including track press and mid-drag): 12 identical, DOM dumps identical apart from React's ids. Selfcheck: deterministic. Guard, legacy vs legacy-head: 22 identical, 1 pass (notifications, pre-existing), 92 fail = the new gallery pages, absent from the pinned baseline. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
POST /__parity/push appends a change to a per-(dataset, table) log and the next live shape request delivers it (a waiting long-poll answers at once); with an empty log live requests behave as before (selfcheck --filter chat: 13 identical, deterministic). The chat-list bench gains --live (new message and reaction toggle latency, stick to bottom), a heap reading, and scroll geometry. style-bisect.ts finds the CSS rule that makes DOM insertions expensive; render-trace.ts shows where a scroll frame goes. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- route.ts: ChatChannel { orgSlug, channelId } (/:orgSlug/chat/:channelId, branded ChannelId).
- main.ts: optional chatPage Submodel (created per channel, dropped on other routes),
channelsSidebar shell Submodel (context synced from organization and current user),
GotChatPageMessage / GotChannelsSidebarMessage, lifted subscriptions, the ChatChannel
view, CurrentUser.id / Organization.id branded, module-level toParent functions.
- shell/app-shell.ts: orgShell takes the secondary sidebar (settings by default);
orgSwitcherHeader and userMenuFooter exported for the chat sidebar.
- ui-parity scenarios.ts: register chatListArea (heavy dataset scenarios).
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The remix colors were drawn from the shared seeded sequence after ~61 incidental draws (mostly Effect span and fiber ids), so any refactor that changed that count changed the colors: the D3 guard flagged it although nothing looked different (probe: 61 vs 63 draws before the click). Steps can now call reseedRandom(page) before a random action. Remix, pinned vs head and pinned vs pre-D3: identical; selfcheck deterministic. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The eager glob put every entry, and the React Aria modules it imports, into normal app boot. Gallery parity unchanged: foldkit vs legacy-head 62 identical, 2 pass; composer 8/8 identical. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Select, SelectTrigger, SelectContent and SelectItem as a Foldkit Submodel (ui/select.ts, ui/select-view.ts) with the legacy DOM: field root with data-open and data-focused, label, trigger with SelectValue and chevron, the hidden native select, and a ListBox in a modal popover. The selected key gets focus on open; arrows (no wrap), Home/End, typeahead, Enter/Space choose, ArrowLeft/Right on the closed trigger step the selection, Escape and outside press close, focus returns to the trigger. The modal popover setup (portal, position, initial focus, outside press, focus restore) is now one helper, openModalPopover, used by Menu and Select. fieldStyles/labelStyles and the select class lists moved into field.styles.ts and select.styles.ts. field.tsx keeps re-exporting the style functions. Parity (legacy-head vs foldkit, gallery-select): identical 10. Menu after the refactor: identical 20, pass 4 (unchanged). Guard (legacy vs legacy-head): identical 28, pass 1 (notifications light, 9 strict px); the 82 failures are new gallery entries absent from the pinned baseline. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…avy dataset, live events Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> # Conflicts: # packages/ui-parity/src/scenarios.ts
Popover, PopoverContent (with the optional arrow), PopoverFooter and the dialog parts it reuses, as a Foldkit Submodel (ui/popover.ts) that mirrors DialogTrigger + Popover: modal popover with underlay, trigger width, arrow from the arrow offset, focus on the panel, Escape and outside press close. DialogTitle renders an h3 without an id outside a Dialog, as React Aria's Heading does. PopoverClose closes the popover here. In the legacy app the close slot has no Dialog to close, so the button does nothing; no scenario presses it. Parity (legacy-head vs foldkit, gallery-popover): identical 6. Dialog after the DialogTitle change: identical 14, pass 4 (unchanged). No legacy component changed beyond the new gallery entry. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Both render nothing in their empty state, like the legacy components; their tv() definitions and part classes move to .styles.ts files. The icon generator gains a `title` option (the legacy icons' title prop), used by the validating and valid indicators; regenerating changes only those lines. Parity, legacy-head vs foldkit: field-validation-state 2, form-error-summary 2 variants, all identical, DOM dumps identical apart from React's ids. Guard, legacy vs legacy-head: 23 identical (every pre-existing scenario), 106 fail = the new gallery pages, absent from the pinned baseline. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
ChoiceBox as a Submodel over React Aria GridList behavior: the grid is tabbable until an item has been focused, Tab moves focus to the selected (or first) item, arrow keys move focus (a row per column count in grid layout), and clicks, Space and Enter toggle selection, so single mode can deselect. The multiple-mode selection checkbox stops click propagation, as usePress does, and Checkbox gains slot, aria-label and aria-labelledby options for it. The tv() definitions and label/description classes move to choice-box.styles.ts. Parity, legacy-head vs foldkit, gallery-choice-box* (5 scenarios x light/dark): 10 identical. DOM-only gaps: React Aria's body-level live announcer for multiple selection, and the live checked attribute. Selfcheck: deterministic. Guard, legacy vs legacy-head: 23 identical (every pre-existing scenario), 106 fail = the new gallery pages, absent from the pinned baseline. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
SheetContent as a view over the Modal Submodel (ui/sheet.ts): same trigger, portal, focus, Escape and backdrop behavior, with sheetContentStyles for side and float and the offset close icon. Sheets use Modal.init and Modal.update. sheetContentStyles and the overlay classes moved into sheet.styles.ts. Parity (legacy-head vs foldkit, gallery-sheet, desktop and mobile): identical 10. Guard (legacy vs legacy-head): identical 29 (all pre-existing scenarios); the failures are new gallery entries absent from the pinned baseline. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Segments are contenteditable spinbuttons laid out from Intl parts, with React Aria's left-to-right isolates around time segments. date-segments.ts ports IncompleteDate and useDateSegment: arrow, page, Home/End stepping with cycleValue, typed digits that auto-advance, Backspace, day period letters, placeholders from today (date) or midnight (time), and a committed value that survives clearing a segment. Focus moves synchronously after a keystroke, as React Aria does, so fast typing cannot land in the previous segment. DateInput and segment classes move to date-field.styles.ts. Parity, legacy-head vs foldkit: date-field 8, time-field 6 variants, all identical (typing, stepping, Backspace, day period). DOM-only gaps: React Aria appends the "Selected Date/Time" description and its live announcer to <body>; the port renders the description as a hidden sibling and has no announcer. Selfcheck: deterministic. Guard, legacy vs legacy-head: 23 identical (every pre-existing scenario), 120 fail = the new gallery pages, absent from the pinned baseline. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
ContextMenu, ContextMenuTrigger and ContextMenuContent on the Menu Submodel: a Menu initialised with anchor "Pointer" renders through contextMenuView, opens where the trigger is right-clicked (Popover offset and crossOffset from the trigger's bottom left, placement "bottom left"), and focuses the popover like React Aria, where the Menu has no autoFocus: arrow keys do nothing until an item has focus, Escape closes. Interact-outside now ignores non-primary buttons, as React Aria does. The trigger class moved into context-menu.styles.ts. Parity (legacy-head vs foldkit, gallery-context-menu): identical 10. Menu after the change: identical 20, pass 4 (unchanged). Guard (legacy vs legacy-head): identical 29; the 92 failures are new gallery entries absent from the pinned baseline. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
InputOTP and its group, slot and separator parts, porting the input-otp library's behavior along with the markup: a transparent overlay input over rendered slots, the selection model (focus selects from the last character, selectionchange turns a collapsed caret into a one-character selection and clears unfocused instances, and the delayed re-read after value or focus changes), the password manager badge check that widens the overlay, the measured --root-height, and the stylesheet the library injects into <head>. Slot classes move to input-otp.styles.ts. Parity, legacy-head vs foldkit, gallery-input-otp* (3 scenarios x light/dark): 4 identical, 2 pass (typed: 39 and 34 strict / 0 perceptual px, +-1-2 per channel on the slots' anti-aliased rounded corners; DOM dumps identical in all six, including the selection attributes). Selfcheck: deterministic. Guard, legacy vs legacy-head: 23 identical (every pre-existing scenario), 126 fail = the new gallery pages, absent from the pinned baseline. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Conflicts: ui/loader.ts was ported by D1 and D3; kept D3's, which composes from the shared loader.styles.ts (D1's call sites are compatible). input-otp: kept D1's styles extraction with S4's has-[input:disabled] fix moved into input-otp.styles.ts. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
ComboBox, ComboBoxInput, ComboBoxContent and ComboBoxItem as a Foldkit Submodel (ui/combo-box.ts, ui/combo-box-view.ts) with string items, menuTrigger "input": typing filters with base-sensitivity contains and opens the list, ArrowDown/Up and the chevron button show every item, the list uses virtual focus through aria-activedescendant while focus stays in the input, Enter or a click selects, Escape and blur close and revert the text to the selection. The non-modal popover sits under the input with the input's width, and everything else gets aria-hidden while it is open (ariaHideOutside). ui/aria/announcer.ts ports React Aria's LiveAnnouncer; the combo box announces the option count and, on Apple platforms, focus and selection, with the same messages. Input and combo box class lists moved into input.styles.ts and combo-box.styles.ts. Parity (legacy-head vs foldkit, gallery-combo-box): identical 14, including the live-region text. Guard (legacy vs legacy-head): identical 28, pass 1 (notifications light, 9 strict px, 0 perceptual); the failures are new gallery entries absent from the pinned baseline. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
TimezoneSelect as a ComboBox over every IANA zone from the shared getTimezones() (ui/timezone-select.ts): no label, "Select timezone..." placeholder, a max-h-60 list. ComboBox takes an optional label and a ListBox className for it. Parity (legacy-head vs foldkit, gallery-timezone-select): identical 6. Only the new gallery entry changed on the legacy side. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
CommandMenu, CommandMenuSearch, CommandMenuList, CommandMenuSection, CommandMenuItem, CommandMenuLabel, CommandMenuDescription and CommandMenuShortcut as a Foldkit Submodel (ui/command-menu.ts, ui/command-menu-view.ts) that mirrors ModalOverlay + Modal + Dialog + Autocomplete: the parent opens it (open/close helpers, like the command palette's controlled isOpen), the search field takes focus, typing filters items by textValue (base-sensitivity contains), hides empty sections and puts the virtual focus on the first match, arrows wrap, Enter or a click selects, Escape clears the search and then closes, "No results found." when nothing matches. Focus goes back to whatever had it before opening. Command menu class lists moved into command-menu.styles.ts. Parity (legacy-head vs foldkit, gallery-command-menu, desktop and mobile): identical 16. Guard (legacy vs legacy-head): identical 29 (every pre-existing scenario); the failures are new gallery entries absent from the pinned baseline. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
CommandMenuFormContainer, Header, Body, Footer, Field, CommandMenuInput and CommandMenuToggle as views (ui/command-menu-form.ts). CommandMenu gains toFormPage, its isFormPage mode: the given content replaces the search field and list, the dialog takes focus, and Escape or the header's Esc button closes. The toggle is a native radio group with the legacy label markup. Command menu form class lists moved into command-menu-form.styles.ts. Parity (legacy-head vs foldkit, gallery-command-menu-form, desktop and mobile): identical 10, pass 2 (back button: 24 to 27 strict px, 0 perceptual, on the refocused trigger). gallery-command-menu after the change: identical 16. Guard (legacy vs legacy-head): identical 29; the failures are new gallery entries absent from the pinned baseline. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A Modal gallery in both apps (sm, xl and fullscreen sizes; blurred backdrop without the close icon) over the Modal port from the Dialog commit, at desktop and mobile. Parity (legacy-head vs foldkit, gallery-modal): identical 10, pass 4 (fullscreen: 19 to 32 strict px, 0 perceptual, ±1 on the trigger button corners under the backdrop). Only the new gallery entry changed on the legacy side. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Adds galleryOverlaysArea (packages/ui-parity/src/scenarios/gallery-overlays.ts) to the area list. Final gallery run (legacy-head vs foldkit): identical 142, pass 18 (all 0 perceptual), fail 0. selfcheck on legacy-head: all variants deterministic. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Conflicts: D1/D3 and D2 extracted the same field, input and keyboard styles with identical class strings under different names; kept the merged names (inputStyles, inputControlStyles, keyboardStyles) and renamed D2's imports. button.ts keeps D1's AriaButtonOptions and takes D2's ChildAttribute widening; pending-state filtering skips child attributes, which carry no handlers. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ries) Adds the forms, overlays, data display and composer gallery entries to the baseline. Guard before (0126176-era pin ef1fce3 vs this tree): 214 identical, 57 pass, and the 346 failures are exactly the new gallery and composer variants. After (6f7eccf vs legacy-head, all 617 variants): 573 identical, 43 pass, 1 fail (chat-attachments, a scroll-settling flake: 3/3 identical on re-run). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
ui/toast.ts is a Submodel for sonner's queue: stacking, expand on hover, pausable timers, removal delay, the alt+T hotkey and Escape. ui/toast-view.ts renders sonner's DOM with the Toaster's className and style, now shared through components/ui/toast.styles.ts. sonner's stylesheet is injected the same way sonner does it. Swipe to dismiss is not ported yet. Gallery: /dev/gallery/toast in both apps, 13 scenarios (each kind, stacked, expanded, overflow, action dismiss), 32 variants identical vs legacy-head. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…h the Foldkit app Moves the embed tv() styles and colour map into framework-free *.styles.ts files, adds codeBlockLeaves to the viewer model and re-exports date-fns for Foldkit. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Shared Shared/ids/scene helpers for page tests, and a Scene test for the rename, public invite and delete-workspace flows. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Rename the update test to story.test.ts and drive it through foldkit/story, adding logo upload, public mode and failure paths. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Two it.fails document bugs: the sign-in return URL drops the search's '?', and a palette-picked status is overwritten when the user goes AFK. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… palette Exports the palette portal Mount and the toast timer Commands so Scenes can resolve them (additive, no behavior change). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…el read path Composer autocomplete and slash commands, draft reply/edit/upload queue/typing, and the channel page's change sets, message window, unfurls, AI stream events, threads and image viewer. Three expected failures mark bugs: the list does not restore its scroll after the Files tab, closing a thread leaves its typing indicator, and the image viewer outlives its message. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
One it.fails: Back restores an empty search instead of the typed one. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Two it.fails: switching organization from the mobile switcher never navigates (the Single-selection Menu selects the key before the fold). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…cancel) Exports the create-section modal's Message and Command for the Scene (additive). Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…nd OutMessage stories Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Hover toolbar react, reply, edit and delete; Reply in thread through the More actions menu; the image viewer; the composer's emoji picker dialog; the chat index's loading, tabs and permission-gated empty states. Shared channel scene helpers live in src/test/chat-fixtures.ts. One expected failure marks the image viewer's unwired Download/Copy/Open actions. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…tte Story and Scene tests Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Typing clock, message window, live AI replies and global typing gate on the right Model slices. An expected failure marks AI replies in the thread panel, which never open their actor connection. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ory and Scene tests Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
Important Review skippedToo many files! This PR contains 931 files, which is 781 over the limit of 150. To get a review, reduce the PR to 150 files or fewer by splitting it into smaller PRs or changing its base branch. Upgrade to a paid plan to raise the limit. Usage-priced reviews support at most 300 files. ⚙️ Run configuration
⛔ Files ignored due to path filters (1)
📒 Files selected for processing (931)
You can disable this status message by setting the
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Claude encountered an error —— View job I'll analyze this and get back to you. |
Coverage Report
File Coverage
|
||||||||||||||||||||||||||||||||||||||
Keep Story inference exact when binding a page update to Shared. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Invitations, team, custom emojis and connect invites. test.fails marks the dead team Invite button and the connect-invite in-flight guard. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
test.fails marks missing in-flight guards on install, uninstall, connect, disconnect and the API key form. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
test.fails marks the reset avatar and Discord link guards and the brand color selector bug. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
test.fails marks the stuck delete after Escape and the provider toggle double submit. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…and entry pages test.fails marks the onboarding, join and DM double submits, invite error rows and the unnamed DM button. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Findings ranked by severity for the settings, my-settings, channel settings, onboarding, home, inbox and entry pages, split into fix-now and design changes, plus accessibility gaps the Scene locators exposed and the test inventory. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ery page Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
Claude encountered an error —— View job I'll analyze this and get back to you. |
Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.