The sharing UI is shared source in allternit-ai. Desktop packages that source; ai.allternit.com and the m.allternit.com PWA build it for the web. See Artifacts for user instructions and Artifacts v2 API for server contracts.

Components and data

  • src/components/artifact-share/SharePill.tsx renders one accessible button with a small access-avatar stack. Initials and optional owner images come from real records. Missing identities use an explicit Owner/You label.
  • src/components/artifact-share/share.css owns the shared theme-aware pill, rounded panel, inline role selector, people rows and footer. Narrow screens reduce the avatar stack; coarse pointers retain 44px action targets. The toolbar remains one horizontally scrollable row.
  • src/components/artifacts/ArtifactShareButton.tsx loads saved sharing from /api/v2/artifacts/:id/sharing. It refreshes after the dialog closes, ignores responses for previous artifacts and never substitutes heartbeat presence for access. Local/signed-out artifacts have a disabled trigger.
  • src/components/artifacts/ShareDialog.tsx keeps owner-only editing, audience restrictions, email validation, role clamping, outside-invite limits and version pinning. Audience/people/role edits stay in a draft until Save. Version pinning retains its separate update. Phones/PWA and non-owners receive the read-only summary and Copy link.
  • src/components/artifact-share/ArtifactShare.tsx styles the legacy Cowork /api/v1/artifacts sharing surface. That API only supports private/org access and view/edit roles. Its choices continue to save immediately; Done closes the panel. Email invitations and public links are not added.
Presence remains in collab/PresenceStack.tsx and is independent of sharing. The compact access stack must not be presented as an online indicator or populated with example people when the API is unavailable.

Interaction and accessibility

Radix preserves focus trapping, Escape, outside dismissal and mounted exits. The artifact window passes its trigger ref back to the dialog so closing restores keyboard focus. Native email inputs and selects keep keyboard and screen-reader behavior. Pending saves disable edit controls; loading and copy failures have visible status/error text. Changing the artifact clears previous sharing state while the next request loads. Panel entrance uses a short fade and scale with the existing ease-out token; exit is shorter. Reduced motion switches to an 80ms fade. No extra animation package or effect is required for this control.

Verification and shipping

Focused coverage lives in artifacts/__tests__/share-controls.test.tsx, the existing artifacts-ui.test.tsx and artifact-share/ArtifactShare.test.tsx. It covers saved access, stale responses, signed-out state, private-to-people drafts, phone read-only copying and clipboard failure, plus the existing sharing policy and legacy organization flows. A merge updates the web source. Desktop needs its next packaged build, and the PWA needs its separate approved deployment; merging the web repository does not deploy the PWA.