Skip to the object
Tactile UI

Team and roles

An owner invites people to a workspace, sets what each one can open with a role and sees who has not accepted, in a table with a search, filters, a roles legend and a bulk bar.

What it is for

The team screen of an app people share: an owner asks someone in, chooses a role, and watches the invite until it is accepted.

Installnpx shadcn add https://tactileui.dev/r/team-and-roles.jsonWith a Pass: how

Controls

State

Normal, the skeleton while the roles arrive, or the first-person empty screen.

Finish

Auto takes the page’s own finish tokens if it has them, then its data-finish, then the visitor’s system.

Everything you set here is what the Code and Prompt tabs give you.

Datasheet

Mechanism
Role select per row, Two step state, Pending invite resend, Search and filter toolbar, Bulk bar, Row menu, Invite dialog validation, Role capabilities checklist, Phone cards, Keyboard range selection, Finish following, Quiet volume
Stack
Vanilla ES modules, CSS
Needs
Nothing, no dependencies
States
11 documented
Version
0.1.0
Licence
With a Pass

States

  1. At restThe page head with the title, the seats used, the lead and the Invite key; the People panel with its toolbar, five rows, pagination and the roles legend beside it. Nothing runs.
  2. Invite dialogThe Invite key opens a native dialog: Email (placeholder name@studio.com), Role at Member, the line that explains the role, and the read-only checklist that follows the role. Cancel is flat; Send invite is the contrast key. Focus starts in the Email field.
  3. Already on the teamAn active member’s address, for example priya@halden.studio, puts That email is already on the team. in the field’s hint, marks the field in error and leaves the focus in the field. The dialog stays open.
  4. Invite sentSending to nia@halden.studio closes the dialog, shows the toast Invite sent to nia@halden.studio., and puts her row at Invited just now. A new address is added as a row in the same state.
  5. Selected rowsSpace checks a row, Shift+Space extends the range from the last row checked, and the header key selects every row in view. The bulk bar slides up from the foot of the panel with 2 people selected and the keys Change role, Resend invite, Remove and Clear. Escape or Clear releases the rows.
  6. LoadingThe avatar and name print; the role, state, two-step and action cells are skeleton bars. The toolbar is inert. Nothing else runs.
  7. EmptyNo one else yet, the sentence Invite the first person, and the roles legend shows under it., and one contrast key, Invite someone. The roles legend moves under the empty state.
  8. PhoneUnder 700px the table is one card per person: check key, avatar, name, email, menu key, a full-width role select, then the state and the two-step state. The page head keeps the title and an icon Invite key; the bulk bar pins above the home indicator.
  9. KeyboardSpace checks a row, Shift+Space extends the range, the header key selects all. The role select opens with Alt+Down (the platform’s own select). Escape closes the invite dialog and returns the focus to the Invite key; Escape in the bulk bar releases the rows and returns the focus to the table.
  10. Reduced motionThe bulk bar appears in place; the dialog changes at once; nothing else moves.
  11. Finishes and volumeEvery surface and lamp reads the kit’s tokens, so all twelve finishes follow. The screen is set in the Quiet volume; its parts keep their sizes and draw hairlines and a whisper of depth.

Notes

The head says how many seats are used and carries the one contrast key. The table is the record: an avatar, a name, an email, a role select in every row, the state, the two-step state and a row menu. A toolbar searches by name or email and filters for pending invites and two-step off; checking rows lifts a bulk bar with Change role, Resend invite and Remove. The side column explains the four roles and says how many people have two-step sign-in on. The invite dialog is a field, a role, one line and a read-only checklist of what that role can do. At 375px the table is one card per person, the head keeps the title and an icon Invite key, and the bulk bar pins above the home indicator.

Original composition. Ledgerly, its workspace, the five people and their addresses are sample copy for an invented invoicing app, and the preview says so. The screen is made only of the Tactile UI Kit's parts, with the kit's tokens for every surface and lamp; the block writes no colour and restyles no part. It needs the kit's kit.css and kit.mjs beside it. The recipe asked for a 120ms bulk bar and an 8px dialog rise; the kit ships a 200ms bar and its dialog scales from 0.985, and neither was changed.

Anatomy

Role select per row, Two step state, Pending invite resend, Search and filter toolbar, Bulk bar, Row menu, Invite dialog validation, Role capabilities checklist, Phone cards, Keyboard range selection, Finish following, Quiet volume

Usage notes

The team screen of an app people share: an owner asks someone in, chooses a role, and watches the invite until it is accepted. The head says how many seats are used and carries the one contrast key. The table is the record: an avatar, a name, an email, a role select in every row, the state, the two-step state and a row menu. A toolbar searches by name or email and filters for pending invites and two-step off; checking rows lifts a bulk bar with Change role, Resend invite and Remove. The side column explains the four roles and says how many people have two-step sign-in on. The invite dialog is a field, a role, one line and a read-only checklist of what that role can do.

Options

OptionTypeDescription
titletextPage title
leadtextLead
stateenumNormal, the skeleton while the roles arrive, or the first-person empty screen.
finishenumAuto takes the page’s own finish tokens if it has them, then its data-finish, then the visitor’s system.

Methods

  • people
  • update
  • destroy

How it works

Original composition. Ledgerly, its workspace, the five people and their addresses are sample copy for an invented invoicing app, and the preview says so. The screen is made only of the Tactile UI Kit's parts, with the kit's tokens for every surface and lamp; the block writes no colour and restyles no part. It needs the kit's kit.css and kit.mjs beside it.