<AttioLink to={destination}>renders a real link. Use it for text the user reads and clicks.navigate(destination)goes there from an event handler. Use it after a button click or a completed action.
navigate), and no full page reload.
Destinations
Destinations builds the destination objects that AttioLink and navigate accept.
(slug: AppPageSlug) => Destination
One of this app’s pages, by slug. The slug is the page’s folder name under
src/app/pages/.(record: AttioRecord, options?: {tab?: RecordTab}) => Destination
A record’s page.
record is {recordId, object}, the same shape record actions and widgets
receive. Without tab the record opens on its overview.tab accepts one of this app’s record tab ids, or the slug of a built-in tab such as
"activity", "notes" or "tasks". If both exist with the same name, your own id wins. A tab
that doesn’t exist on that record, or that the workspace has hidden, falls back to the overview.() => Destination
This app’s settings page in workspace settings.
Resolution is optimistic
Attio does not check that a record exists before navigating. A destination for a record id that has been deleted lands the user on Attio’s own “record not found” state, the same place a stale bookmark would.Failure is a no-op
A destination Attio can’t resolve never throws. That covers malformed destinations, a page slug your app doesn’t define, and a record destination whose object slug doesn’t exist in the workspace.AttioLinkrenders its text without a link.navigatedoes nothing and logs an error to the browser console so you can see it while developing.
Typed slugs
Destinations.appPage(slug) and the tab option are typed against your app’s real pages and record tabs, so they autocomplete and typos fail to compile. There is nothing to set up. On every attio dev and attio build, the CLI writes .attio/register.d.ts into your app with the slugs it discovered:
.attio/register.d.ts