8000
Skip to content

improvement(secret-sharing): overhaul sharing UX across surfaces - #7824

Draft
jaddenki wants to merge 7 commits into
Infisical:mainfrom
jaddenki:improvement(secrets-sharing)
Draft

improvement(secret-sharing): overhaul sharing UX across surfaces#7824
jaddenki wants to merge 7 commits into
Infisical:mainfrom
jaddenki:improvement(secrets-sharing)

Conversation

@jaddenki
@jaddenki jaddenki commented Aug 26, 2026
Copy link
Copy Markdown
Member

Context

Improves the secret sharing and secret request experience across organization and public surfaces. The update clarifies information hierarchy and primary actions, improves table and modal states, makes copying and password visibility more explicit, reports copy/load failures, and groups advanced sharing controls while preserving organization policy enforcement.

Screenshots

Not included yet. This is a draft PR for early visibility; screenshots or videos will be added before review.

Steps to verify the change

  1. Open Organization Settings > Secret Sharing and review the Share Secret and Request Secret tabs at desktop and mobile widths.
  2. Create a shared secret with and without email recipients, a password, expiration, and a view limit.
  3. Confirm advanced options expand correctly and organization-enforced access/view policies remain disabled or capped as expected.
  4. Open a generated public share link, reveal and copy the secret, and verify multiline/long values remain readable.
  5. Submit a requested secret and verify the organization-side reveal and copy flows.
  6. Trigger copy or shared-secret loading failures and confirm an error notification is shown.

Type

  • Fix
  • Feature
  • Improvement
  • Breaking
  • Docs
  • Chore

Checklist

  • Title follows the conventional commit format: type(scope): short description (scope is optional, e.g., fix: prevent crash on sync or fix(api): handle null response).
  • Tested locally
  • Updated docs (if needed)
  • Updated CLAUDE.md files (if needed)
  • Read the contributing guide

Rework the Secret Sharing entrypoints so the list, share flow, form,
expiry selection and shared-secret view read as one experience.

- Move the page off the v2 PageHeader/Tabs onto their v3 equivalents so
  the shell matches the rest of the product and tabs get real tablist
  semantics.
- Open the authenticated share form in a Sheet instead of a Dialog; the
  form is long and conditional, which is what Sheet is for.
- Restructure both forms into Secret / Access / Delivery groups and drop
  the advanced-settings accordion. Email delivery and the external
  recipient toggle now sit in the flow ahead of the field whose meaning
  depends on them, rather than buried behind a disclosure.
- Expiry now resolves to the absolute timestamp the link stops working,
  and the org cap is stated rather than implied.
- Replace the Unlimited/Limited select plus number input with a single
  toggle and a bounded input.
- Validate view limits and require a password when external recipients
  are addressed, instead of leaving both to the backend.
- Give the result state its own hierarchy: status, link, expiry and view
  metadata, and one forward action.
- Let active shared secrets be copied from the table, so a link is no
  longer recoverable only from the creation state.
- Name the resource in delete confirmations, await deletion before
  reporting success, reset pagination on page-size change, and give row
  menus and copy/reveal controls intent-specific accessible names.
The recipient view buried its actual purpose. Copying the secret was a
small ghost icon in the corner of the value box, while the loudest
button on the page sent the recipient off to create their own secret.

Follow the pattern Bitwarden uses for Send: a clean value box, then
Reveal Value as a secondary full-width button and Copy Value as the
primary one, with expiry and remaining views underneath. Demote
"Share Your Own Secret" to a quiet tertiary link.

Apply the same hierarchy to the requested-secret reveal dialog, where
Close was the only real button. Its copied state also latched on
permanently, since it used a toggle that was never reset.
… hiding them

Three states lied to the user.

A failed list query fell through to the empty state, so a request that
errored rendered as "No Shared Secrets" and read as data loss. Both
tables now distinguish the two.

Clipboard writes assumed success. navigator.clipboard is unavailable in
non-secure contexts, which self-hosted HTTP deployments hit, and copy is
the whole point of this feature. Every copy path now reports failure and
points at the visible value instead of failing silently. This also stops
a clipboard rejection from aborting the post-create flow before reset().

"Expired" covered both a lapsed timestamp and an exhausted view count.
Views-exhausted now says so, since the distinction changes what the user
would do about it.

Also only show pagination once there is more than one page.
…ing a share

The password set on a share was write-only. You could not check what you
typed before sending it, even though it is the credential you then have
to relay to the recipient out of band, and a typo is unrecoverable once
the link is out.

Use the InputGroup + eye toggle composition already established in
PasswordField rather than a new control.
The card announced itself twice, once as "View shared secret" and again
as a "Shared Secret" heading directly beneath it. Dropped the second.

Reveal and Copy were identical full-width buttons, which read as two
equal actions. Revealing is not a peer of copying, it is a view control
on the value, so it now sits in the value box it affects and Copy Value
is the only primary action.

The value box carried a fixed 96px minimum that left a large gap under a
single line of dots. It now sizes to its content and scrolls past a
sensible maximum instead of growing without bound.

"Share Your Own Secret" was a muted ghost button floating with no
affordance, reading as disabled text. It is a real link now, below a
divider, clearly secondary to the recipient's task.
The card is scoped to one secret. A prompt to go create your own is not
part of that, so sitting inside the card it needed its own divider and
still read as stray muted text below the metadata.

It now sits between the card and the page footer, alongside the other
Infisical chrome, which is the level it actually belongs to. The card
ends on the secret's own detail and carries one divider instead of two.
@andrewhuhh andrewhuhh self-assigned this Aug 26, 2026
@andrewhuhh andrewhuhh added live-preview Sets up a live preview for this PR and removed live-preview Sets up a live preview for this PR labels Aug 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

0