Repository navigation
Conversation
… charter Adds scripts/home-phone-layout-smoke.mjs: loads the real Home host and GUI against a fixture host in Playwright Chromium and WebKit at iPhone 14 portrait, landscape and an 820 px tablet, measures targets under 44 px, text under 12 px and horizontal overflow on every shell surface and one window per first-party app, writes report.json plus screenshots, and asserts a per-profile baseline that later PRs may only lower. Records the source truths the phone layer will change (viewport-fit, bare 100vh, backdrop-filter count). Wires the smoke into just product-ui-browser, adds docs/HOME_MOBILE.md (size classes, rubric, gesture-surface rule, baseline, real-device checks, capsule guidance) linked from ROADMAP.md, and pins the ratchet in home-entropy-check. No UI change.
- viewport-fit=cover and interactive-widget=resizes-visual on the Home host and GUI index files, so env(safe-area-inset-*) is real on iOS and the soft keyboard shrinks only the visual viewport on Android like it does on iOS - shell-form-factor.js: single reader of the 640/1100 size classes and the media-feature pointer class; mirrors body[data-form-factor] and body[data-pointer]; writes --keyboard-inset from visualViewport on coarse-pointer hosts (a phone held sideways stays a phone; desktop pinch-zoom is never a keyboard); shouldOpenMaximizedByDefault() delegates - style.css: --stage-bottom adds --keyboard-inset; overscroll-behavior none on the shell; touch-action manipulation and no tap highlight on controls; touch-callout off on shell chrome only; 100dvh twin for the last bare 100vh; side safe-area insets on the bar and the phone window - home-form-factor.test.mjs in verify; entropy contracts for every truth above, mutation-tested; phone smoke reports fallback vs bare 100vh Co-authored-by: Cursor <cursoragent@cursor.com>
Phone size class in CSS is one media list mirroring classifyFormFactor (width <= 640, or coarse/hover-less pointer with height <= 640), so a landscape phone keeps the phone shell. home-entropy-check derives the list from PHONE_MAX_WIDTH. Bar: --toolbar-h 44px, every control a 44x44 hit box around the 22px glyph, 16px badge with 12px numerals. Wallet and Overview leave the phone bar; Control Centre keeps both (Quick open / Overview). Dock: thumb scroll (taskbar-item touch-action pan-x instead of none), scroll-snap, scroll-driven edge fades, 14x4 running indicator, safe-area sides in landscape. With a window open the Dock tucks (body.phone-dock-tucked) and --stage-bottom shrinks to a 24px handle; tap/swipe the handle peeks the Dock over the app (phone-dock-peek + scrim); scrim, Escape or picking a window tucks it. New shell-phone-dock.js, synced from updateTaskbarState. Smoke: opens Mission Control via Control Centre, probes tuck/peek/tuck on both phone profiles, lowers phone baselines, records one boot retry for the WebKit first-profile flake. node:test coverage for the Dock decisions. Co-authored-by: Cursor <cursoragent@cursor.com>
The phone block set gap: 8px on .taskbar-inner. The hidden launcher and Assistant face stay in flow (display: flex, collapsed to 0 for the face animation), so the column gap added 16px of dead space above the icon row: the pill was 88px with icons low. Drop the gap; the launcher popover already carries its own spacing inside the clipped region. The phone smoke now pins the idle pill at --taskbar-h (72px). Co-authored-by: Cursor <cursoragent@cursor.com>
The plate-free glyphs are drawn at 58.6% of their square for the pointer desktop; beside 48px app plates on a phone they read small. Launcher via background-size (its .taskbar-icon transform is reserved for magnification); Assistant via its inner icon node so the mark's layer animation is untouched. Co-authored-by: Cursor <cursoragent@cursor.com>
One 44px presentation of .window-head for every chrome mode: leading Close, centred capsule icon + title, trailing Minimise drawn as a chevron (go home; the capsule keeps running). Fullscreen hidden. The traffic-light group is display: contents so the same buttons land in a three-column grid; chrome modes in shell-core.js are untouched. The head is in flow above the body in all modes, including unified sidebar/toolbar: a phone-width capsule has content at the top of its main column, so the desktop overlay would cover it. A 2px accent hairline runs under the title until .window-frame.is-ready (static under reduced motion) so the bar reads as alive while the capsule boots. shell-window-geometry.js guards drag/resize on phone. Smoke window baseline 5 -> 2 (only the 24px Dock handle remains). Co-authored-by: Cursor <cursoragent@cursor.com>
Mission Control is the phone's app switcher: title-bar swipe-down opens it (pointer capture across the capsule frame, the ending click swallowed), cards carry the capsule icon + name and a 44 px Close on coarse pointers, portrait Space thumbs are sized by height, copy loses mouse language. Windows rise from the Dock in 200 ms (none under reduced motion). Stage history keeps one entry of the shell's own, decided from history.state and never more than one back() per close cycle; popstate closes the top layer then goes home. Off on WebKit (buttons only): one back() after pushState took the shell frame to about:blank there — recorded in docs/HOME_MOBILE.md. Pure model unit-tested (scripts/home-phone-stage.test.mjs, in verify); the phone smoke probes swipe, back, rotation and the Home frame staying alive; entropy contract pins it all (21 mutations caught). Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
…ut fixtures Library imports /apps/home/home-navigation-client.js and the Browser imports /apps/home/home-clipboard-client.js; neither fixture served them, so both product layout smokes failed before measuring anything (500 / stuck on "Loading Library..."). Co-authored-by: Cursor <cursoragent@cursor.com>
The launcher and Assistant sit outside the scrolling app row, so when the pill reached its width limit flex shrank them to 45 px and their glyphs drew a third smaller than the app plates. They now keep full tiles and the scrolling row gives way. The 1.5x glyph scale applies only to plate-free art (the launcher, and the Assistant when it wears its plate-free mark); a plate raster already fills its square. Control Centre and Notifications span the phone stage with even margins instead of hugging the trailing edge. Co-authored-by: Cursor <cursoragent@cursor.com>
…push drawer
A capsule cannot tell a phone stage from a narrow desktop window by its own
width, so on phone every capsule kept the desktop traffic-light insets and
opened with dead space above and beside its content. The shell now posts
elastos:shell-layout {formFactor, pointer} to each frame on load and on a
size-class change (shell-capsule-layout.js). The shared theme runtime takes
it only from the opaque parent and only allowlisted values and sets
html[data-el-form-factor] and [data-el-pointer]; the shared sheet zeroes
--window-chrome-safe-top/-leading on phone and adds --el-touch-target and
the drawer tokens.
elastos-drawer.js is the Assistant's saved-chats pattern for any capsule
sidebar, bound by markup alone: content first, a 44 px toggle slides the
sidebar in and pushes the view aside, tapping the view (swallowed), Escape
or picking an item closes it; inert while closed. Vendored only to the
capsules whose sidebar uses it.
Unit-tested in verify; the phone smoke checks the size class reaches every
shared-theme frame on both engines; scripts/lib/phone-drawer-assert.mjs is
the shared smoke assertion for capsule drawers.
Co-authored-by: Cursor <cursoragent@cursor.com>
On phone the store opens on its content; the Discover title leads with a 44 px sidebar toggle that slides the categories in and pushes the store aside. Nav items are 44 px at 16 px and search is 16 px so iOS does not zoom. The layout smoke asserts the closed, open and picked states. Co-authored-by: Cursor <cursoragent@cursor.com>
The 220 px list column squeezed the editor to half the phone. On phone the editor takes the full width, the title row leads with the list toggle, actions are one row of 44 px buttons, and the editor and fields are 16 px. Split has no room on a phone and reads as Write; the desktop Hide list control gives way to the drawer. The layout smoke asserts the editor size, the hidden controls and the drawer. Co-authored-by: Cursor <cursoragent@cursor.com>
Favorites, path and search took 225 px above the first file. On phone the navigation row carries Back, Up, the current folder as its title, Search, view and More at 44 px, and Favorites sit under it as one sliding chip row; opening Search gives the field the whole row. Rows are 48 px at 16 px, the Name/Modified header is gone (only names show), and status floats above the footer as a pill. The list now starts at 104 px. Co-authored-by: Cursor <cursoragent@cursor.com>
The menu button sat 72 px in, clearing traffic lights that do not exist on phone. It now takes the leading edge as a 44 px target, vertically centred on the page title, which is indented to share its line; the open sidebar starts below it. Phone landscape keeps the desktop sidebar. The UI/UX smoke gains a phone step and joins the browser lane. Co-authored-by: Cursor <cursoragent@cursor.com>
At 640 px and below the list took a fixed 42% band, so with one or two requests the detail started mid-screen. The list is now as tall as its requests (capped at 40 dvh, then it scrolls) and the detail follows directly. The layout smoke fails on the old rule. Co-authored-by: Cursor <cursoragent@cursor.com>
The toolbar kept a 96 px traffic-light inset on phone. The navigation row now spans the stage with 40-44 px controls and a 44 px, 16 px address field. The layout smoke gains a phone step and joins the browser lane. Co-authored-by: Cursor <cursoragent@cursor.com>
Records the shell-to-capsule size class, the shared push drawer and the per-capsule phone layouts; the touch token is --el-touch-target. Co-authored-by: Cursor <cursoragent@cursor.com>
At 1.5x on full tiles the launcher and the Assistant mark matched the plates' height exactly and read too heavy beside them; 1.3x sits them just inside the plates. Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Write/Read and Save stay in one unscrolled row; Save as, Publish, Unpublish, Copy Published Link and Delete open from a More button as labelled 44 px rows. The menu reuses the real buttons, so their handlers and enabled state are unchanged; desktop keeps them inline. Co-authored-by: Cursor <cursoragent@cursor.com>
The Write/Read tabs become full 44 px targets with the pill painted inside their padding, and the title field is 44 px tall. Documents' phone ratchet drops from 3 to 0 on both profiles. Co-authored-by: Cursor <cursoragent@cursor.com>
…lity # Conflicts: # elastos/CHANGELOG.md # elastos/crates/elastos-server/src/carrier.rs
16 tasks
A valid Chat request on a Home without the collaboration service now receives typed 503. The UI reports initial and refreshed list failures and clears only a recovered current transient error, preserving selection and drafts. Cover authority ordering and corruption separately, add failure/recovery smoke coverage, and align the stale pending-copy assertion with the approved Sending label.
Select the opaque participant reference from the newly exchanged marker and bind it to the fresh Recovery Profile identity. Keep exact display name, card action and duplicate-reference refusals so same-name retained history cannot select a different person.
Build: bash scripts/build-chat-room-ui.sh; configured layout smoke passed the failure and retry scenarios with pinned Playwright Core 1.59.1. Generated assets bind the source availability fix and preserve drafts through recovery.
This was referenced Oct 10, 2026
Draft
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Runtime delivers Community and Direct messages with signed receipt evidence, clear retry and recovery controls, and preserved drafts. Shared receipts use the existing signed transport frame, while independent send, receive and projection work keeps delivery moving when another send waits. Runtime retries missing bootstrap peers from the verified network profile.
CPU repairs reuse verified data within each request and cache bounded signature mathematics. Each request still checks current authority, expiry and revocation. The Home owner can Leave Community to stop Community and Discovery while retaining contacts, Direct messages and local history; Rejoin reverses that choice.
Runtime exposes the observed Community peer status. Chat places Community unreachable in a dedicated visible status line while preserving gateway errors, reconnect controls, Direct, session and drafts. The documentation records the release Availability contract in #86 item 9.
Anders owns the Chat batch in #139, which holds the single Acceptance record and exact proof. Its four current outcomes are measured release CPU, Mac/physical Jetson router delivery below 3 seconds with zero lost messages, the Linux x86 installed journey, and minimal Leave/Rejoin #264. OMP integrates and releases. Irzhy reviews selected risky areas on one frozen SHA after installed acceptance. Sasha owns PR #116; Community signing is separate under #186, and #194 holds the CI packaging proposal.
The review branch is published at frozen source
e64f15918aa320f2a22026c44d3dd2af656a0e5eafter its required local checks and ordinary canonical push hook passed. #139's sole Acceptance record holds the final CI, CPU, publication and installed evidence under Anders's four-hour fallback. The one final physical run is red after six passing legs: its display-name selector matched distinct current and historical Community Profile DIDs with the same fixture name. Contact authorization failure is unproven; signup under 30 seconds and the complete installed journey remain open. The earlier current-artifact router run reached one visible row after 12.266 seconds and lacked the intended-peer signed receipt. Separate signed Update/Undo and both original-owner sign-ins pass with complete owned cleanup. The final Chat CI run ended cancelled after the browser-layout pending-copy assertion failed; the exact result and source comparison remain in #139. This PR stays Draft for required human review of the frozen SHA and completion of installed acceptance before integration.