A page whose subject is one record — one campaign, one number, one routing rule — shown in
full: its own attributes, and the data attached to it. It is where CRUD: Read’s
decision tree lands when a reader needs the object’s full context, possibly to act on it next,
and where List view sends a reader who has already
found the one row they wanted.You are building one if the page answers “what about this one?” A page that answers “which of
these?” is a list view.
This archetype adds no regions. It uses the page frame as
published, and the frame’s vocabulary is the vocabulary here — including the header’s second
row, which this archetype is the primary user of for a tab bar.
The reader already knows which record they want, and needs everything about it — not a
subset — per CRUD: Read’s
“full context, possibly to act on it” case.
The record has enough attributes or related data that a preview surface would cramp it — see
CRUD: Read’s own tree for what falls short of
this (inline expansion, Drawer preview).
Losing sight of the list the reader came from is an acceptable cost, because the record is
now the whole job.
Title is the record’s own name or identifier — the actual campaign name, the actual phone
number — never a generic label like “Campaign Detail.” A reader arriving from a link, a search
result, or the list’s own row action should see the same name they clicked.Breadcrumb points back to the collection this record belongs to — the list view it was most
likely reached from. Status appears only when the record itself has a state that changes what
can be done to it — draft, active, paused — following Views overview’s
own rule that Status is for the page’s subject, never implied by which actions are enabled.
Page-level actions on this specific record go here — Left says what the record is, Right
says what can be done to it. This is the surface CRUD:
Update and Destructive confirmation
attach to:
An Edit action opens whatever surface CRUD: Update
selects for this record’s object type — a Drawer, a full page, or inline editing on individual
fields. Which surface that is is Update’s decision, not this archetype’s — the same
relationship List view already
establishes between itself and CRUD: Create.
A Delete action opens Destructive confirmation’s
dialog, at whichever tier that page’s own decision tree selects for this record’s
consequences.
At most one primary action. Collapse anything past three actions into a
Menu, per
Views overview.
A detail view’s body is either a single scrolling page or tabbed sections, never both
at once, per the header’s second-row exclusivity already stated in
Views overview. This page cites that
model rather than deriving a second one.The threshold: tab when the record’s sections are independently substantial enough that a
reader wants to jump to one without scrolling past the others. A campaign with an overview,
a routing configuration, and a call history each deep enough to scroll on its own is tabbed. A
record whose attributes fit in a screen or two of scrolling, with nothing a reader would want
to jump past, stays a single Contents region with grouped sections and anchor headings.There is no fixed count of attribute groups that forces tabs — it is whether scrolling past a
section costs the reader something. A record with four short groups and one long call history
often reads better as one scrolling page with the long section last, not four tabs for one page’s
worth of content.When tabbed, each tab is a section of this record’s own data — Overview, Routing, History —
never an action or a filter. Selecting a tab changes the URL, so a specific section of a
specific record is linkable and survives a reload.
The whole record is one Contents region. When the page is tabbed, each tab’s content is a
TabPanel inside that same Contents — the tabs partition one region, they do not create
additional ones.Inside it, two kinds of content recur:
Attribute groups — the record’s own fields, grouped by what they describe (identity,
configuration, targeting) rather than listed flat. Grouping is a per-page decision; the
system does not prescribe group names.
Related data — a collection attached to this record but not the record itself: a
campaign’s calls, a routing rule’s change history, a number’s assigned campaigns. This
renders as a compact Table or
List embedded in a Contents section.
A related-data table here is not the same archetype as a full List view
for that same collection.List view’s own Choose
something else when table
already names this page as the destination for “show one record’s attributes and related data” —
this section is that destination. The embedded table is scoped to this one record (a campaign’s
calls, not all calls), is denser, and typically drops filtering and bulk actions that the
collection’s own list view would carry. A “View all” affordance on the embedded table can hand
off to that collection’s full list view, pre-filtered to this record, when the reader needs the
full apparatus.
Slot
Use
Constraint
Attribute groups
Plain content, grouped by subject
No fixed layout — a two-column key/value grid and a stacked list both occur.
Absent by default. Most attribute viewing has no single, whole-page commit — a reader looks
at a record, they do not submit it, per the same reasoning List view
gives for its own footer.A page-level footer applies only when the whole page is inline-editable as a unit — every
field open for editing at once, with one Save and one Cancel for the entire record. This is
rare.When one container on the page is configurable and the rest is read-only, the footer belongs
to that container, not to the page — a static footer at the foot of the panel that holds those
fields, committing exactly them. The page carries none. That is the same rule as the page-level
case reaching a different answer, because the unit of commit sits inside the container rather
than spanning the view — see Footers.The far more common case, a single field the reader wants to change without leaving the page, is
Inline editing’s territory: it commits
per-field, with no footer at all.
Titan is desktop-first — most surfaces live at lg and xl, and xs/sm are rarely
exercised (see Layout & grid).
What follows is proposed with that in mind.
Breakpoint
Collapses
Stacks
Dropped
md and below
A two-column attribute grid collapses to one column
The header’s Actions group may move into a Menu if it no longer fits Right
Nothing — a collapsed related-data table’s lower-priority columns follow List view’s own column-collapse logic; this page does not re-derive a second answer for the embedded table
Compact density
Attribute group spacing tightens; related-data table row height only
The page-level decisions are the frame’s, and they apply unchanged — see
Views overview → Accessibility. One main,
one h1 on Title, region order matching visual order.What is specific to this archetype:
The Title is the record’s own identifying name, so a screen-reader user landing on the
page hears what record they’re on immediately, without needing Breadcrumb or Status read
first.
Attribute groups get their own heading, descending from Title’s h1 without skipping a
level, so the page’s outline reflects its grouping the same way its visual layout does.
A tabbed detail view follows the tab bar’s own accessibility requirements in
Views overview — a named Tabs
region, each tab’s id/aria-controls pointing at its panel, and the panel’s own heading
inside it (a tab label is not a heading, per that section).
The related-data table’s accessible name identifies the relationship, not just the
collection — “Calls for this campaign,” not “Calls” — so a screen-reader user can tell it apart
from that collection’s own full List view if they’ve
visited both.
Title is the record’s own name or identifier, never a generic label for the page type.
A reader arriving from a link, search result, or row action should see the identity they clicked, not a category label repeated on every record of that type.
TITAN-DTLVIEW-02
Page-level actions on the record — edit, delete — render in Header → Right, never beside Title.
Left says what the record is, Right says what can be done to it.
TITAN-DTLVIEW-03
The edit action opens whatever surface CRUD: Update selects for this object type. This archetype does not choose the surface itself.
Matches List view’s own relationship to Create — the surface decision belongs to the CRUD pattern, not the view that hosts the trigger.
A page-level footer appears only when the entire page commits as one unit. When a single container is configurable, the footer belongs to that container; a single field’s edit uses Inline editing and no footer.
The footer goes on the surface whose boundary matches what it saves, and most attribute viewing has no whole-page commit to hold one at all — see Footer.
No live embed exists yet. Per this page’s own rule, a composed example should be a real
screen or a live embed rather than a static image — the diagram below is structural (region
names and what’s in them, no measurements or visual styling) for exactly that reason, the
same way every Structure diagram in Patterns is.
Replace it with a live embed the first time this archetype is built.
┌─────────────────────────────────────────────────────┐│ Campaigns / Q3 Paid Search Active │ ← Header: Left (Breadcrumb, Title, Status)│ [Edit] [Delete ▾] │ ← Header: Right (Actions)├─────────────────────────────────────────────────────┤│ Overview Routing History │ ← Tabs, header's second row├─────────────────────────────────────────────────────┤│ Identity │ ← Contents: attribute group│ Name Q3 Paid Search ││ Created Jun 1, 2026 ││ ││ Configuration │ ← Contents: attribute group│ Budget $12,000 / month ││ Numbers 3 assigned ││ ││ Recent calls [View all →] │ ← Contents: related data (scoped table)│ ┌───────────────────────────────────────────────┐ ││ │ Call ID Time Duration Status │ ││ │ CL-88213 2:14 PM 3:42 Completed│ ││ │ CL-88209 1:57 PM 0:41 Missed │ ││ └───────────────────────────────────────────────┘ │└─────────────────────────────────────────────────────┘
The record is the whole page, so its actions live in one place. A page that mixes the
record’s own actions with actions on its related data — deleting a call from inside the
campaign’s detail view, say — asks the reader to track two different “what can I act on here”
answers on one screen. Keeping Header → Right reserved for actions on the page’s own
subject, and letting each related-data table carry its own scoped row actions if it needs any,
keeps that answer to one per region.Tabs are a threshold decision, not a default. A detail view that reaches for tabs before a
section has earned independent scrolling produces a record split into three shallow screens
instead of one page a reader can skim in a single scroll. The cost of tabbing too early is not
visual — it’s that a reader who wants to check two facts in different sections now pays for two
navigations instead of one scroll.
Exemplar page — first pass, entirely proposal. No audited Invoca screen backs this
page — Titan’s design library was not available while writing it. It is built from general
interaction-design practice and from the constraints Views overview,
CRUD: Read, CRUD: Update,
and Destructive confirmation already
establish. Treat every constraint below as a starting point to check against real product
screens, not as a rule already enforced.
Last modified on September 17, 2026
Was this page helpful?
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Invoca","colors":{"primary":"#00A87F","light":"#00A87F","dark":"#0EEEB7"},"logo":{"light":"https://mintcdn.com/invoca-5bd45748/9Md68DqArcq3WD3L/logo/light.svg?fit=max\u0026auto=format\u0026n=9Md68DqArcq3WD3L\u0026q=85\u0026s=3ed629c5be28d08bd1a6580e72b6dbfa","dark":"https://mintcdn.com/invoca-5bd45748/9Md68DqArcq3WD3L/logo/dark.svg?fit=max\u0026auto=format\u0026n=9Md68DqArcq3WD3L\u0026q=85\u0026s=b64ce8e5cfa4f8c7893b2738e8131f45","href":"https://www.invoca.com/"},"favicon":"https://mintcdn.com/invoca-5bd45748/9Md68DqArcq3WD3L/favicon.png?fit=max\u0026auto=format\u0026n=9Md68DqArcq3WD3L\u0026q=85\u0026s=c846713bb1afdf274154a01d7e9abb8d","appearance":{"default":"light"},"background":{"decoration":"gradient"},"navbar":{"primary":{"type":"button","label":"Invoca Academy","href":"https://academy.invoca.com/"}},"footer":{"socials":{"linkedin":"https://www.linkedin.com/company/invoca-com","youtube":"https://www.youtube.com/channel/UCLQwNQFnN1OV1ACnlXICPKw"}},"fonts":{"body":{"family":"Gt America","source":"https://cdn.prod.website-files.com/5d82e225060d003d65ddae98/677d87009656fca63c0c7d8f_GT-America-Standard-Regular.woff2","format":"woff2"}},"contextual":{"options":["copy","download-pdf","view","assistant","chatgpt","claude","perplexity"],"display":"header"},"metadata":{"timestamp":true},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"invoca-5bd45748","hasAudioNarration":false,"actualSubdomain":"invoca-5bd45748","customDomains":["docs.invoca.com"],"gitSource":{"type":"github","owner":"invoca","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae8bdbaca78e468455a6b97","collectionId":"54b26950-9181-41ce-985a-32d474ce8dd0","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae8bdbaca78e468455a6b97"},"feedback":{"thumbs":true,"agentFeedback":true,"contextualFeedback":{"allowEmail":false}},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"REMOVE_BRANDING":{"status":"ENABLED"},"CONTEXTUAL_FEEDBACK":{"status":"ENABLED","enabled":"ENABLED"},"CODE_SNIPPET_FEEDBACK":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae8bdbaca78e468455a6b97","clientVersion":"0.0.4045","searchFilterCounts":[{"language":"default","tag":"Invoca Docs","count":666},{"language":"default","tag":"Guide","count":665},{"language":"default","tag":"Developer","count":191},{"language":"default","tag":"Integrations","count":184},{"language":"default","tag":"Invoca Design System","count":163},{"language":"default","tag":"API Documentation","count":151},{"language":"default","tag":"Campaign \u0026 Call Handling","count":127},{"language":"default","tag":"Insights \u0026 Analytics","count":101},{"language":"default","tag":"Network Integration","count":99},{"language":"default","tag":"Components","count":75}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":true,"enableContextualStarterQuestions":true,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"type":"link","url":"https://support.invoca.com/s/contactsupport"}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":".custom-card .card img{width:60%;padding:1rem;margin:0 auto}a[href=\"https://academy.invoca.com/\"] span.absolute{background-color:#004030}#assistant-entry,#assistant-entry-mobile{background-color:#00a87f;border-color:#00a87f}#assistant-entry-mobile:hover,#assistant-entry:hover{background-color:#009973}#assistant-entry span,#assistant-entry svg,#assistant-entry-mobile span,#assistant-entry-mobile svg{color:#fff}.ivk-home{--ivk-forest:#0A231E;--ivk-footer-bg:#004030;--ivk-accent:#00A87F;--ivk-ink:#1F2121;--ivk-muted:#626464;--ivk-line:#E7E9E4;--ivk-bg:#FFFFFF;--ivk-sand:#F8FAF1;--ivk-banner:#D1FFD1;--ivk-card:#FFFFFF;--ivk-radius-btn:6px;--ivk-radius-card:16px;color:var(--ivk-ink);width:100%;max-width:1600px;margin:0 auto;padding:2rem clamp(1.25rem,4vw,4rem) 4rem}.dark .ivk-home,:root[data-theme=dark] .ivk-home{--ivk-bg:#10201B;--ivk-card:#16261F;--ivk-ink:#EAF1EC;--ivk-muted:#9BAAA1;--ivk-line:#223229;--ivk-sand:#16261F;--ivk-banner:#1C3A2C}.ivk-home a{color:inherit;text-decoration:none}.ivk-home footer a[href*=mintlify]{color:#9ea3a2}.dark .ivk-home footer a[href*=mintlify]{color:#6f7573}.ivk-home footer a[href*=mintlify]:hover{color:#4f5553}.dark .ivk-home footer a[href*=mintlify]:hover{color:#ced3d1}.ivk-home img,.ivk-home svg{display:block}.ivk-home-announce,.ivk-home-hero{border-radius:var(--ivk-radius-card)}.ivk-home-announce{background:var(--ivk-banner);color:var(--ivk-ink);font-size:13.5px;font-weight:500;text-align:center;padding:9px 16px;margin-bottom:20px}.ivk-home-announce a{color:var(--ivk-footer-bg);font-weight:600;text-decoration:underline;margin-left:6px}.ivk-home-hero{position:relative;overflow:hidden;background:var(--ivk-forest);color:#fff;padding:56px 32px}.ivk-home-hero-eyebrow{display:inline-flex;align-items:center;gap:8px;color:#fff;font-size:13px;font-weight:500;border:1px solid rgba(255,255,255,.28);border-radius:999px;padding:6px 14px;margin:0 0 22px}.ivk-home-hero h1{font-size:clamp(28px,4.2vw,44px);font-weight:700;line-height:1.1;letter-spacing:-.01em;max-width:17ch;margin:0 0 16px;color:#fff}.ivk-home-hero h1 .ivk-home-hl{color:#00b388}.ivk-home-hero-lede{font-size:16.5px;color:rgba(255,255,255,.78);max-width:48ch;margin:0 0 30px;line-height:1.55}.ivk-home-search-field{display:flex;align-items:center;gap:10px;background:#fff;border-radius:var(--ivk-radius-btn);padding:13px 16px;max-width:560px;box-shadow:0 14px 34px rgba(0,0,0,.28);cursor:pointer;border:0;width:100%;text-align:left;font-family:inherit}.ivk-home-search-field input{border:0;outline:0;flex:1;font-size:15px;font-family:inherit;color:#1f2121;background:0 0;pointer-events:none}.ivk-home-search-field input::placeholder{color:#626464}.ivk-home-search-field .ivk-home-icon{color:#626464;flex:none}.ivk-home-search-field kbd{font-size:11.5px;color:#626464;border:1px solid #e7e9e4;border-radius:5px;padding:2px 6px}.ivk-home-popular{margin-top:26px;display:flex;flex-wrap:wrap;gap:8px;align-items:center}.ivk-home-popular .ivk-home-label{color:rgba(255,255,255,.62);font-size:13px;margin-right:4px}.ivk-home-chip{display:inline-flex;align-items:center;gap:6px;background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.2);color:#fff;font-size:13px;padding:7px 12px;border-radius:999px}.ivk-home-chip:hover{background:rgba(255,255,255,.16)}.ivk-home-note-banner{background:var(--ivk-sand);border:1px solid var(--ivk-line);border-radius:var(--ivk-radius-card);padding:16px 20px;font-size:13.5px;color:var(--ivk-muted);line-height:1.55;margin-top:24px}.ivk-home-note-banner strong{color:var(--ivk-ink)}.ivk-home-band{padding:60px 0}.ivk-home-band-alt{background:var(--ivk-sand);border-radius:var(--ivk-radius-card)}.ivk-home-section-head{display:flex;align-items:baseline;justify-content:space-between;gap:16px;margin-bottom:26px;flex-wrap:wrap}.ivk-home-section-head h2,.ivk-home-topic-tile h3{font-size:23px;font-weight:700;letter-spacing:-.01em;margin:0;color:var(--ivk-ink)}.ivk-home-section-head .ivk-home-meta,.ivk-home-section-sub{color:var(--ivk-muted);font-size:13.5px}.ivk-home-section-sub{font-size:14.5px;max-width:62ch;margin:-14px 0 26px;line-height:1.55}.ivk-home-topic-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;align-items:start}@media (min-width:1400px){.ivk-home-topic-grid{grid-template-columns:repeat(4,1fr)}}@media (max-width:860px){.ivk-home-topic-grid{grid-template-columns:repeat(2,1fr)}}@media (max-width:600px){.ivk-home-topic-grid{grid-template-columns:1fr}}.ivk-home-topic-tile{background:var(--ivk-card);border:1px solid var(--ivk-line);border-radius:var(--ivk-radius-card);transition:border-color .15s ease}.ivk-home-topic-tile:hover{border-color:color-mix(in srgb,var(--ivk-accent) 40%,var(--ivk-line))}.ivk-home-t-head{display:block;width:100%;padding:22px 22px 18px;cursor:pointer;background:0 0;border:0;text-align:left;font-family:inherit;color:inherit}.ivk-home-row-top{display:flex;align-items:center;justify-content:space-between;gap:10px}.ivk-home-icon-wrap{width:36px;height:36px;border-radius:10px;background:rgba(0,168,127,.12);color:var(--ivk-accent);display:flex;align-items:center;justify-content:center}.ivk-home-count{font-size:12px;color:var(--ivk-muted);white-space:nowrap}.ivk-home-title-row{display:flex;align-items:flex-start;gap:6px;margin:12px 0 4px}.ivk-home-topic-tile h3{font-size:16.5px;font-weight:600;letter-spacing:-.005em;line-height:1.3;min-height:2.6em;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.ivk-home-tag-pill{flex:none;margin-top:2px;padding:2px 4px;border-radius:6px;font-size:.65rem;font-weight:700;line-height:13px;color:var(--ivk-accent);background:rgba(0,168,127,.1)}.dark .ivk-home-tag-pill,:root[data-theme=dark] .ivk-home-tag-pill{color:#1dc79a;background:rgba(29,199,154,.15)}.ivk-home-desc{font-size:13.5px;color:var(--ivk-muted);margin:0;line-height:1.5;min-height:3em;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.ivk-home-expand-cue{display:flex;align-items:center;gap:6px;margin-top:14px;font-size:12.5px;color:var(--ivk-accent);font-weight:600}.ivk-home-expand-cue svg{transition:transform .18s ease}.ivk-home-topic-tile.ivk-home-open .ivk-home-expand-cue svg{transform:rotate(180deg)}.ivk-home-t-panel{border-top:1px solid var(--ivk-line);margin-top:2px;padding:16px 22px 22px}.ivk-home-t-panel ul{list-style:none;margin:0 0 12px;padding:0;display:flex;flex-direction:column;gap:9px}.ivk-home-t-panel li a{font-size:13px;color:var(--ivk-ink);display:flex;align-items:center;gap:7px}.ivk-home-dev-card h3 a:hover,.ivk-home-t-panel li a:hover,.ivk-home-viewall{color:var(--ivk-accent)}.ivk-home-t-panel li a svg{flex:none;opacity:.5}.ivk-home-viewall{font-size:12.5px;font-weight:600}.ivk-home-dev-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}@media (max-width:700px){.ivk-home-dev-grid{grid-template-columns:1fr}}.ivk-home-dev-card{background:var(--ivk-card);border:1px solid var(--ivk-line);border-radius:var(--ivk-radius-card);padding:18px;display:flex;gap:12px;align-items:flex-start}.ivk-home-dev-card .ivk-home-icon-wrap{background:var(--ivk-forest);color:#fff;width:32px;height:32px;border-radius:9px}.ivk-home-dev-card h3{font-size:14.5px;font-weight:600;margin:0 0 3px;color:var(--ivk-ink)}.ivk-home-dev-card p{font-size:13px;color:var(--ivk-muted);margin:0;line-height:1.45}"}],"page":{"pagePath":"invoca-design-system/views/detail-view","slug":"/invoca-design-system/views/detail-view","pageMetadata":{"title":"Detail view","description":"One record, its attributes, and its related data.","icon":"file-text","tag":"Draft","keywords":["detail view","record","attributes","related data","single object","profile page"],"href":"/invoca-design-system/views/detail-view"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"One record, its attributes, and its related data.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`what-it-is`,children:`What it is`}),`\n`,_jsxs(_components.p,{children:[`A page whose subject is `,_jsx(_components.strong,{children:`one record`}),` — one campaign, one number, one routing rule — shown in\nfull: its own attributes, and the data attached to it. It is where `,_jsx(_components.a,{href:`/invoca-design-system/patterns/crud/read`,children:`CRUD: Read`}),`’s\ndecision tree lands when a reader needs the object’s full context, possibly to act on it next,\nand where `,_jsx(_components.a,{href:`/invoca-design-system/views/list-view`,children:`List view`}),` sends a reader who has already\nfound the one row they wanted.`]}),`\n`,_jsxs(_components.p,{children:[`You are building one if the page answers “what about this one?” A page that answers “which of\nthese?” is a `,_jsx(_components.a,{href:`/invoca-design-system/views/list-view`,children:`list view`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`region-vocabulary`,children:`Region vocabulary`}),`\n`,_jsxs(_components.p,{children:[`This archetype adds no regions. It uses the `,_jsx(_components.a,{href:`/invoca-design-system/views/overview#the-page-frame`,children:`page frame`}),` as\npublished, and the frame’s vocabulary is the vocabulary here — including the header’s second\nrow, which this archetype is the primary user of for a tab bar.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Region`}),_jsx(_components.th,{children:`Also called`}),_jsx(_components.th,{children:`The system uses`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Page body`}),_jsx(_components.td,{children:`Attribute panel, profile, record view`}),_jsx(_components.td,{children:_jsx(_components.strong,{children:_jsx(_components.code,{children:`Contents`})})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Section tabs`}),_jsx(_components.td,{children:`Detail tabs, record sections`}),_jsxs(_components.td,{children:[_jsx(_components.strong,{children:_jsx(_components.code,{children:`Tabs`})}),`, in the header’s second row`]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`choose-this-view-when`,children:`Choose this view when`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`The reader already knows which record they want, and needs everything about it — not a\nsubset — per `,_jsx(_components.a,{href:`/invoca-design-system/patterns/crud/read#choosing-a-surface`,children:`CRUD: Read`}),`’s\n“full context, possibly to act on it” case.`]}),`\n`,_jsxs(_components.li,{children:[`The record has enough attributes or related data that a preview surface would cramp it — see\n`,_jsx(_components.a,{href:`/invoca-design-system/patterns/crud/read`,children:`CRUD: Read`}),`’s own tree for what falls short of\nthis (inline expansion, Drawer preview).`]}),`\n`,_jsx(_components.li,{children:`Losing sight of the list the reader came from is an acceptable cost, because the record is\nnow the whole job.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`choose-something-else-when`,children:`Choose something else when`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`If the page also needs to…`}),_jsx(_components.th,{children:`Use`}),_jsx(_components.th,{children:`Why`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Find or compare members of a collection`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`/invoca-design-system/views/list-view`,children:`List view`})}),_jsxs(_components.td,{children:[`”Which of these” is a different job than “what about this one” — see that page’s own `,_jsx(_components.a,{href:`/invoca-design-system/views/list-view#choose-this-view-when`,children:`Choose this view when`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Show enough, without losing the list behind it`}),_jsxs(_components.td,{children:[_jsx(_components.a,{href:`/invoca-design-system/patterns/crud/read#choosing-a-surface`,children:`Drawer preview`}),` or `,_jsx(_components.a,{href:`/invoca-design-system/views/split-view`,children:`Split view`})]}),_jsx(_components.td,{children:`A reader who needs to keep checking rows against the list should not pay for a full page navigation each time.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Show one or two more fields on a row already on screen`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`/invoca-design-system/patterns/progressive-disclosure`,children:`Progressive disclosure`})}),_jsx(_components.td,{children:`A glance does not need a surface change at all.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Author a record that does not exist yet`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`/invoca-design-system/patterns/crud/create`,children:`CRUD: Create`})}),_jsx(_components.td,{children:`Nothing to show a full context for until the record exists.`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`regions`,children:`Regions`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Region`}),_jsx(_components.th,{children:`Required`}),_jsx(_components.th,{children:`Landmark`}),_jsx(_components.th,{children:`Contains`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`Header`}),` — `,_jsx(_components.code,{children:`Left`})]}),_jsx(_components.td,{children:`Yes`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`banner`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`Title`}),` naming the record itself. `,_jsx(_components.code,{children:`Breadcrumb`}),` back to the list it came from. `,_jsx(_components.code,{children:`Status`}),` for the record’s own state, when it has one.`]})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`Header`}),` — `,_jsx(_components.code,{children:`Right`})]}),_jsx(_components.td,{children:`Yes`}),_jsx(_components.td,{children:`—`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`Actions`}),` — page-level actions on this specific record: edit, and delete.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`Tabs`})}),_jsx(_components.td,{children:`No`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`tablist`})}),_jsx(_components.td,{children:`Inside the header. Sections of this record’s own data, when there are enough of them.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`Controls`})}),_jsx(_components.td,{children:`No`}),_jsx(_components.td,{children:`—`}),_jsxs(_components.td,{children:[`Absent by default. A detail view’s body is not filtered the way a collection is — see `,_jsx(_components.a,{href:`#header-tabs-versus-a-scrolling-page`,children:`Header — Tabs versus a scrolling page`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`Contents`})}),_jsx(_components.td,{children:`Yes`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`main`})}),_jsx(_components.td,{children:`Attribute groups and the record’s related data — the whole record, in one region.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`Footer`})}),_jsx(_components.td,{children:`No`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`contentinfo`})}),_jsxs(_components.td,{children:[`Absent by default. Present only when the whole page is inline-editable as a unit — see `,_jsx(_components.a,{href:`#footer`,children:`Footer`}),`.`]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`what-fills-each-region`,children:`What fills each region`}),`\n`,_jsx(Heading,{level:`3`,id:`header-—-left`,children:`Header — Left`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`Title`}),` is the record’s own name or identifier — the actual campaign name, the actual phone\nnumber — never a generic label like “Campaign Detail.” A reader arriving from a link, a search\nresult, or the list’s own row action should see the same name they clicked.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`Breadcrumb`}),` points back to the collection this record belongs to — the list view it was most\nlikely reached from. `,_jsx(_components.code,{children:`Status`}),` appears only when the record itself has a state that changes what\ncan be done to it — draft, active, paused — following `,_jsx(_components.a,{href:`/invoca-design-system/views/overview#header-left`,children:`Views overview`}),`’s\nown rule that `,_jsx(_components.code,{children:`Status`}),` is for the page’s subject, never implied by which actions are enabled.`]}),`\n`,_jsx(Heading,{level:`3`,id:`header-—-right`,children:`Header — Right`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Page-level actions on this specific record go here`}),` — `,_jsx(_components.code,{children:`Left`}),` says what the record is, `,_jsx(_components.code,{children:`Right`}),`\nsays what can be done to it. This is the surface `,_jsx(_components.a,{href:`/invoca-design-system/patterns/crud/update`,children:`CRUD:\nUpdate`}),` and `,_jsx(_components.a,{href:`/invoca-design-system/patterns/destructive-confirmation`,children:`Destructive confirmation`}),`\nattach to:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`An `,_jsx(_components.strong,{children:`Edit`}),` action opens whatever surface `,_jsx(_components.a,{href:`/invoca-design-system/patterns/crud/update#choosing-a-surface-revisited`,children:`CRUD: Update`}),`\nselects for this record’s object type — a Drawer, a full page, or inline editing on individual\nfields. `,_jsx(_components.strong,{children:`Which surface that is is Update’s decision, not this archetype’s`}),` — the same\nrelationship `,_jsx(_components.a,{href:`/invoca-design-system/views/list-view#header-right`,children:`List view`}),` already\nestablishes between itself and `,_jsx(_components.a,{href:`/invoca-design-system/patterns/crud/create#choosing-a-surface`,children:`CRUD: Create`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`A `,_jsx(_components.strong,{children:`Delete`}),` action opens `,_jsx(_components.a,{href:`/invoca-design-system/patterns/destructive-confirmation`,children:`Destructive confirmation`}),`’s\ndialog, at whichever tier that page’s own decision tree selects for this record’s\nconsequences.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`At most one primary action. Collapse anything past three actions into a\n`,_jsx(_components.a,{href:`/invoca-design-system/components/actions/menu`,children:`Menu`}),`, per\n`,_jsx(_components.a,{href:`/invoca-design-system/views/overview#header-right`,children:`Views overview`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`header-—-tabs-versus-a-scrolling-page`,children:`Header — Tabs versus a scrolling page`}),`\n`,_jsxs(_components.p,{children:[`A detail view’s body is either a `,_jsx(_components.strong,{children:`single scrolling page`}),` or `,_jsx(_components.strong,{children:`tabbed sections`}),`, never both\nat once, per the header’s second-row exclusivity already stated in\n`,_jsx(_components.a,{href:`/invoca-design-system/views/overview#header-tab-bar`,children:`Views overview`}),`. This page cites that\nmodel rather than deriving a second one.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`The threshold: tab when the record’s sections are independently substantial enough that a\nreader wants to jump to one without scrolling past the others.`}),` A campaign with an overview,\na routing configuration, and a call history each deep enough to scroll on its own is tabbed. A\nrecord whose attributes fit in a screen or two of scrolling, with nothing a reader would want\nto jump past, stays a single `,_jsx(_components.code,{children:`Contents`}),` region with grouped sections and anchor headings.`]}),`\n`,_jsx(_components.p,{children:`There is no fixed count of attribute groups that forces tabs — it is whether scrolling past a\nsection costs the reader something. A record with four short groups and one long call history\noften reads better as one scrolling page with the long section last, not four tabs for one page’s\nworth of content.`}),`\n`,_jsxs(_components.p,{children:[`When tabbed, each tab is a section of `,_jsx(_components.em,{children:`this record’s own data`}),` — Overview, Routing, History —\nnever an action or a filter. Selecting a tab changes the URL, so a specific section of a\nspecific record is linkable and survives a reload.`]}),`\n`,_jsx(Heading,{level:`3`,id:`contents-—-attribute-groups-and-related-data`,children:`Contents — attribute groups and related data`}),`\n`,_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[`The whole record is one `,_jsx(_components.code,{children:`Contents`}),` region.`]}),` When the page is tabbed, each tab’s content is a\n`,_jsx(_components.code,{children:`TabPanel`}),` inside that same `,_jsx(_components.code,{children:`Contents`}),` — the tabs partition one region, they do not create\nadditional ones.`]}),`\n`,_jsx(_components.p,{children:`Inside it, two kinds of content recur:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Attribute groups`}),` — the record’s own fields, grouped by what they describe (identity,\nconfiguration, targeting) rather than listed flat. Grouping is a per-page decision; the\nsystem does not prescribe group names.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Related data`}),` — a collection attached to this record but not the record itself: a\ncampaign’s calls, a routing rule’s change history, a number’s assigned campaigns. This\nrenders as a compact `,_jsx(_components.a,{href:`/invoca-design-system/components/data-display/table`,children:`Table`}),` or\n`,_jsx(_components.a,{href:`/invoca-design-system/components/data-display/list`,children:`List`}),` embedded in a `,_jsx(_components.code,{children:`Contents`}),` section.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[`A related-data table here is not the same archetype as a full `,_jsx(_components.a,{href:`/invoca-design-system/views/list-view`,children:`List view`}),`\nfor that same collection.`]}),` `,_jsx(_components.a,{href:`/invoca-design-system/views/list-view`,children:`List view`}),`’s own `,_jsx(_components.a,{href:`/invoca-design-system/views/list-view#choose-something-else-when`,children:`Choose\nsomething else when`}),` table\nalready names this page as the destination for “show one record’s attributes and related data” —\nthis section is that destination. The embedded table is scoped to this one record (a campaign’s\ncalls, not all calls), is denser, and typically drops filtering and bulk actions that the\ncollection’s own list view would carry. A “View all” affordance on the embedded table can hand\noff to that collection’s full list view, pre-filtered to this record, when the reader needs the\nfull apparatus.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Slot`}),_jsx(_components.th,{children:`Use`}),_jsx(_components.th,{children:`Constraint`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Attribute groups`}),_jsx(_components.td,{children:`Plain content, grouped by subject`}),_jsx(_components.td,{children:`No fixed layout — a two-column key/value grid and a stacked list both occur.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Related data`}),_jsxs(_components.td,{children:[_jsx(_components.a,{href:`/invoca-design-system/components/data-display/table`,children:`Table`}),` or `,_jsx(_components.a,{href:`/invoca-design-system/components/data-display/list`,children:`List`})]}),_jsxs(_components.td,{children:[`Scoped to this record. Distinct from that collection’s own `,_jsx(_components.a,{href:`/invoca-design-system/views/list-view`,children:`List view`}),` — see above.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`No related data yet`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`/invoca-design-system/components/data-display/empty-state`,children:`EmptyState`})}),_jsxs(_components.td,{children:[`Per `,_jsx(_components.a,{href:`/invoca-design-system/patterns/empty-and-zero-states#when-this-applies`,children:`Empty \u0026 zero states`}),`’s “nothing here yet” case — a campaign with no calls yet is not an error.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Loading`}),_jsx(_components.td,{children:_jsx(_components.a,{href:`/invoca-design-system/components/feedback/skeleton`,children:`Skeleton`})}),_jsxs(_components.td,{children:[`Matching the shape of the attribute groups and any related-data table, per `,_jsx(_components.a,{href:`/invoca-design-system/patterns/loading-and-skeletons`,children:`Loading \u0026 skeletons`}),`.`]})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`footer`,children:`Footer`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Absent by default.`}),` Most attribute viewing has no single, whole-page commit — a reader looks\nat a record, they do not submit it, per the same reasoning `,_jsx(_components.a,{href:`/invoca-design-system/views/list-view#regions`,children:`List view`}),`\ngives for its own footer.`]}),`\n`,_jsxs(_components.p,{children:[`A `,_jsx(_components.strong,{children:`page-level`}),` footer applies only when the whole page is inline-editable as a unit — every\nfield open for editing at once, with one Save and one Cancel for the entire record. This is\nrare.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`When one container on the page is configurable and the rest is read-only, the footer belongs\nto that container, not to the page`}),` — a static footer at the foot of the panel that holds those\nfields, committing exactly them. The page carries none. That is the same rule as the page-level\ncase reaching a different answer, because the unit of commit sits inside the container rather\nthan spanning the view — see `,_jsx(_components.a,{href:`/invoca-design-system/patterns/footers`,children:`Footers`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`The far more common case, a single field the reader wants to change without leaving the page, is\n`,_jsx(_components.a,{href:`/invoca-design-system/patterns/inline-editing`,children:`Inline editing`}),`’s territory: it commits\nper-field, with no footer at all.`]}),`\n`,_jsx(Heading,{level:`2`,id:`responsive-and-density-behavior`,children:`Responsive and density behavior`}),`\n`,_jsxs(_components.p,{children:[`Titan is desktop-first — most surfaces live at `,_jsx(_components.code,{children:`lg`}),` and `,_jsx(_components.code,{children:`xl`}),`, and `,_jsx(_components.code,{children:`xs`}),`/`,_jsx(_components.code,{children:`sm`}),` are rarely\nexercised (see `,_jsx(_components.a,{href:`/invoca-design-system/foundations/layout-and-grid#breakpoints`,children:`Layout \u0026 grid`}),`).\nWhat follows is proposed with that in mind.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Breakpoint`}),_jsx(_components.th,{children:`Collapses`}),_jsx(_components.th,{children:`Stacks`}),_jsx(_components.th,{children:`Dropped`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`md`}),` and below`]}),_jsx(_components.td,{children:`A two-column attribute grid collapses to one column`}),_jsxs(_components.td,{children:[`The header’s `,_jsx(_components.code,{children:`Actions`}),` group may move into a `,_jsx(_components.a,{href:`/invoca-design-system/components/actions/menu`,children:`Menu`}),` if it no longer fits `,_jsx(_components.code,{children:`Right`})]}),_jsxs(_components.td,{children:[`Nothing — a collapsed related-data table’s lower-priority columns follow `,_jsx(_components.a,{href:`/invoca-design-system/views/list-view#responsive-and-density-behavior`,children:`List view`}),`’s own column-collapse logic; this page does not re-derive a second answer for the embedded table`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Compact density`}),_jsx(_components.td,{children:`Attribute group spacing tightens; related-data table row height only`}),_jsx(_components.td,{children:`—`}),_jsx(_components.td,{children:`—`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`accessibility`,children:`Accessibility`}),`\n`,_jsxs(_components.p,{children:[`The page-level decisions are the frame’s, and they apply unchanged — see\n`,_jsx(_components.a,{href:`/invoca-design-system/views/overview#accessibility`,children:`Views overview → Accessibility`}),`. One `,_jsx(_components.code,{children:`main`}),`,\none `,_jsx(_components.code,{children:`h1`}),` on `,_jsx(_components.code,{children:`Title`}),`, region order matching visual order.`]}),`\n`,_jsxs(_components.p,{children:[`What is `,_jsx(_components.strong,{children:`specific to this archetype`}),`:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsxs(_components.strong,{children:[`The `,_jsx(_components.code,{children:`Title`}),` is the record’s own identifying name`]}),`, so a screen-reader user landing on the\npage hears what record they’re on immediately, without needing `,_jsx(_components.code,{children:`Breadcrumb`}),` or `,_jsx(_components.code,{children:`Status`}),` read\nfirst.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Attribute groups get their own heading`}),`, descending from `,_jsx(_components.code,{children:`Title`}),`’s `,_jsx(_components.code,{children:`h1`}),` without skipping a\nlevel, so the page’s outline reflects its grouping the same way its visual layout does.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`A tabbed detail view follows the tab bar’s own accessibility requirements`}),` in\n`,_jsx(_components.a,{href:`/invoca-design-system/views/overview#accessibility`,children:`Views overview`}),` — a named `,_jsx(_components.code,{children:`Tabs`}),`\nregion, each tab’s `,_jsx(_components.code,{children:`id`}),`/`,_jsx(_components.code,{children:`aria-controls`}),` pointing at its panel, and the panel’s own heading\ninside it (a tab label is not a heading, per that section).`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`The related-data table’s accessible name identifies the relationship`}),`, not just the\ncollection — “Calls for this campaign,” not “Calls” — so a screen-reader user can tell it apart\nfrom that collection’s own full `,_jsx(_components.a,{href:`/invoca-design-system/views/list-view`,children:`List view`}),` if they’ve\nvisited both.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`constraints`,children:`Constraints`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`ID`}),_jsx(_components.th,{children:`Constraint`}),_jsx(_components.th,{children:`Rationale`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`TITAN-DTLVIEW-01`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`Title`}),` is the record’s own name or identifier, never a generic label for the page type.`]}),_jsx(_components.td,{children:`A reader arriving from a link, search result, or row action should see the identity they clicked, not a category label repeated on every record of that type.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`TITAN-DTLVIEW-02`})}),_jsxs(_components.td,{children:[`Page-level actions on the record — edit, delete — render in `,_jsx(_components.code,{children:`Header`}),` → `,_jsx(_components.code,{children:`Right`}),`, never beside `,_jsx(_components.code,{children:`Title`}),`.`]}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`Left`}),` says what the record is, `,_jsx(_components.code,{children:`Right`}),` says what can be done to it.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`TITAN-DTLVIEW-03`})}),_jsxs(_components.td,{children:[`The edit action opens whatever surface `,_jsx(_components.a,{href:`/invoca-design-system/patterns/crud/update#choosing-a-surface-revisited`,children:`CRUD: Update`}),` selects for this object type. This archetype does not choose the surface itself.`]}),_jsx(_components.td,{children:`Matches List view’s own relationship to Create — the surface decision belongs to the CRUD pattern, not the view that hosts the trigger.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`TITAN-DTLVIEW-04`})}),_jsxs(_components.td,{children:[`The delete action opens `,_jsx(_components.a,{href:`/invoca-design-system/patterns/destructive-confirmation`,children:`Destructive confirmation`}),`, never a bespoke confirmation.`]}),_jsxs(_components.td,{children:[`A second confirmation pattern invented per page defeats the friction-matching `,_jsx(_components.a,{href:`/invoca-design-system/patterns/destructive-confirmation#three-tiers-of-friction`,children:`Destructive confirmation`}),` already tunes across the whole product.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`TITAN-DTLVIEW-05`})}),_jsxs(_components.td,{children:[`The record’s attribute groups and related data share one `,_jsx(_components.code,{children:`Contents`}),` region. A tabbed body wraps each section in `,_jsx(_components.code,{children:`TabPanel`}),` inside that same region.`]}),_jsx(_components.td,{children:`Tabs partition one region, they do not create a second.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`TITAN-DTLVIEW-06`})}),_jsxs(_components.td,{children:[`A related-data table embedded in `,_jsx(_components.code,{children:`Contents`}),` is scoped to this record and is not a substitute for that collection’s own `,_jsx(_components.a,{href:`/invoca-design-system/views/list-view`,children:`List view`}),`.`]}),_jsxs(_components.td,{children:[`A reader who needs to filter, sort broadly, or bulk-act across the full collection has outgrown the embedded table’s scope — see `,_jsx(_components.a,{href:`#contents-attribute-groups-and-related-data`,children:`Contents — attribute groups and related data`}),`.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`TITAN-DTLVIEW-07`})}),_jsxs(_components.td,{children:[`A page-level footer appears only when the entire page commits as one unit. When a single container is configurable, the footer belongs to that container; a single field’s edit uses `,_jsx(_components.a,{href:`/invoca-design-system/patterns/inline-editing`,children:`Inline editing`}),` and no footer.`]}),_jsxs(_components.td,{children:[`The footer goes on the surface whose boundary matches what it saves, and most attribute viewing has no whole-page commit to hold one at all — see `,_jsx(_components.a,{href:`#footer`,children:`Footer`}),`.`]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`composed-example`,children:`Composed example`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`No live embed exists yet.`}),` Per this page’s own rule, a composed example should be a real\nscreen or a live embed rather than a static image — the diagram below is structural (region\nnames and what’s in them, no measurements or visual styling) for exactly that reason, the\nsame way every Structure diagram in `,_jsx(_components.a,{href:`/invoca-design-system/patterns/overview`,children:`Patterns`}),` is.\nReplace it with a live embed the first time this archetype is built.`]})}),`\n`,_jsx(CodeBlock,{numberOfLines:`22`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`22`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`┌─────────────────────────────────────────────────────┐`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`│ Campaigns / Q3 Paid Search Active │ ← Header: Left (Breadcrumb, Title, Status)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`│ [Edit] [Delete ▾] │ ← Header: Right (Actions)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`├─────────────────────────────────────────────────────┤`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`│ Overview Routing History │ ← Tabs, header's second row`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`├─────────────────────────────────────────────────────┤`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`│ Identity │ ← Contents: attribute group`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`│ Name Q3 Paid Search │`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`│ Created Jun 1, 2026 │`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`│ │`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`│ Configuration │ ← Contents: attribute group`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`│ Budget $12,000 / month │`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`│ Numbers 3 assigned │`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`│ │`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`│ Recent calls [View all →] │ ← Contents: related data (scoped table)`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`│ ┌───────────────────────────────────────────────┐ │`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`│ │ Call ID Time Duration Status │ │`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`│ │ CL-88213 2:14 PM 3:42 Completed│ │`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`│ │ CL-88209 1:57 PM 0:41 Missed │ │`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`│ └───────────────────────────────────────────────┘ │`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`└─────────────────────────────────────────────────────┘`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(Heading,{level:`2`,id:`related`,children:`Related`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/invoca-design-system/views/overview`,children:`Views overview`}),` — the frame this archetype fills`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/invoca-design-system/patterns/crud/read`,children:`CRUD: Read`}),` — decides when this view is the right destination`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/invoca-design-system/patterns/crud/update`,children:`CRUD: Update`}),` — decides what surface the edit action opens`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/invoca-design-system/patterns/destructive-confirmation`,children:`Destructive confirmation`}),` — the delete action’s destination`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/invoca-design-system/patterns/inline-editing`,children:`Inline editing`}),` — the more common answer for a single field’s change`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/invoca-design-system/views/list-view`,children:`List view`}),` — where a record’s reader most often arrives from`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/invoca-design-system/views/split-view`,children:`Split view`}),` — a narrower version of this content model, alongside the list it came from`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.a,{href:`/invoca-design-system/components/data-display/table`,children:`Table`}),` · `,_jsx(_components.a,{href:`/invoca-design-system/components/data-display/list`,children:`List`}),` — what fills a related-data section`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`why-it-works-this-way`,children:`Why it works this way`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`The record is the whole page, so its actions live in one place.`}),` A page that mixes the\nrecord’s own actions with actions on its related data — deleting a call from inside the\ncampaign’s detail view, say — asks the reader to track two different “what can I act on here”\nanswers on one screen. Keeping `,_jsx(_components.code,{children:`Header`}),` → `,_jsx(_components.code,{children:`Right`}),` reserved for actions on the page’s own\nsubject, and letting each related-data table carry its own scoped row actions if it needs any,\nkeeps that answer to one per region.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Tabs are a threshold decision, not a default.`}),` A detail view that reaches for tabs before a\nsection has earned independent scrolling produces a record split into three shallow screens\ninstead of one page a reader can skim in a single scroll. The cost of tabbing too early is not\nvisual — it’s that a reader who wants to check two facts in different sections now pays for two\nnavigations instead of one scroll.`]}),`\n`,_jsx(Heading,{level:`2`,id:`status`,children:`Status`}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Exemplar page — first pass, entirely proposal.`}),` No audited Invoca screen backs this\npage — Titan’s design library was not available while writing it. It is built from general\ninteraction-design practice and from the constraints `,_jsx(_components.a,{href:`/invoca-design-system/views/overview`,children:`Views overview`}),`,\n`,_jsx(_components.a,{href:`/invoca-design-system/patterns/crud/read`,children:`CRUD: Read`}),`, `,_jsx(_components.a,{href:`/invoca-design-system/patterns/crud/update`,children:`CRUD: Update`}),`,\nand `,_jsx(_components.a,{href:`/invoca-design-system/patterns/destructive-confirmation`,children:`Destructive confirmation`}),` already\nestablish. Treat every constraint below as a starting point to check against real product\nscreens, not as a rule already enforced.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Detail view","description":"One record, its attributes, and its related data.","icon":"file-text","tag":"Draft","keywords":["detail view","record","attributes","related data","single object","profile page"],"href":"/invoca-design-system/views/detail-view"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"What it is","slug":"what-it-is","depth":2,"children":[]},{"title":"Region vocabulary","slug":"region-vocabulary","depth":2,"children":[]},{"title":"Choose this view when","slug":"choose-this-view-when","depth":2,"children":[]},{"title":"Choose something else when","slug":"choose-something-else-when","depth":2,"children":[]},{"title":"Regions","slug":"regions","depth":2,"children":[]},{"title":"What fills each region","slug":"what-fills-each-region","depth":2,"children":[{"title":"Header — Left","slug":"header-—-left","depth":3,"children":[]},{"title":"Header — Right","slug":"header-—-right","depth":3,"children":[]},{"title":"Header — Tabs versus a scrolling page","slug":"header-—-tabs-versus-a-scrolling-page","depth":3,"children":[]},{"title":"Contents — attribute groups and related data","slug":"contents-—-attribute-groups-and-related-data","depth":3,"children":[]},{"title":"Footer","slug":"footer","depth":3,"children":[]}]},{"title":"Responsive and density behavior","slug":"responsive-and-density-behavior","depth":2,"children":[]},{"title":"Accessibility","slug":"accessibility","depth":2,"children":[]},{"title":"Constraints","slug":"constraints","depth":2,"children":[]},{"title":"Composed example","slug":"composed-example","depth":2,"children":[]},{"title":"Related","slug":"related","depth":2,"children":[]},{"title":"Why it works this way","slug":"why-it-works-this-way","depth":2,"children":[]},{"title":"Status","slug":"status","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"invoca-5bd45748","siteName":"Invoca","title":"Detail view - Invoca","relatedPagesConfig":{"enabled":true,"limit":5,"mode":"automatic"},"contextualStarterQuestions":[{"_id":"6ab71c0efc74c9b83ba93086","deploymentId":"6a10d9fbb2a094386ec2a44e","questionText":"How do I structure a detail page?","status":"active","generatedBy":"contextual","path":"invoca-design-system/views/detail-view","createdAt":"2026-09-26T01:12:46.158Z","updatedAt":"2026-09-26T01:12:46.158Z","__v":0},{"_id":"6ab71c0efc74c9b83ba93085","deploymentId":"6a10d9fbb2a094386ec2a44e","questionText":"What regions does detail view use?","status":"active","generatedBy":"contextual","path":"invoca-design-system/views/detail-view","createdAt":"2026-09-26T01:12:46.158Z","updatedAt":"2026-09-26T01:12:46.158Z","__v":0},{"_id":"6ab71c0efc74c9b83ba93084","deploymentId":"6a10d9fbb2a094386ec2a44e","questionText":"When should I use detail view?","status":"active","generatedBy":"contextual","path":"invoca-design-system/views/detail-view","createdAt":"2026-09-26T01:12:46.158Z","updatedAt":"2026-09-26T01:12:46.158Z","__v":0}],"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-17T18:53:35.630Z","gitLastModified":"2026-09-17T18:53:06.000Z","originalFileLocation":"invoca-design-system/views/detail-view.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"One record, its attributes, and its related data.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Invoca\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/invoca-5bd45748/Q9AjSeskElHvFPzD/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/invoca-5bd45748/Q9AjSeskElHvFPzD/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/invoca-5bd45748/Q9AjSeskElHvFPzD/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/invoca-5bd45748/Q9AjSeskElHvFPzD/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/invoca-5bd45748/Q9AjSeskElHvFPzD/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/invoca-5bd45748/Q9AjSeskElHvFPzD/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/invoca-5bd45748/Q9AjSeskElHvFPzD/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/invoca-5bd45748/Q9AjSeskElHvFPzD/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/invoca-5bd45748/Q9AjSeskElHvFPzD/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Detail view - Invoca\">\u003cmeta data-mint-head property=\"og:description\" content=\"One record, its attributes, and its related data.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Invoca\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.invoca.com/invoca-design-system/views/detail-view\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://invoca-5bd45748.mintlify.app/_mintlify/api/og/v2?division=Views\u0026amp;title=Detail+view\u0026amp;description=One+record%2C+its+attributes%2C+and+its+related+data.\u0026amp;theme=1c2016f9c5ca3323f39e5905\u0026amp;signature=80ab550b907226339034f0679222f59a1fc9fd7f68dd0e031c428ee1dfcfa854\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Detail view - Invoca\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"One record, its attributes, and its related data.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://invoca-5bd45748.mintlify.app/_mintlify/api/og/v2?division=Views\u0026amp;title=Detail+view\u0026amp;description=One+record%2C+its+attributes%2C+and+its+related+data.\u0026amp;theme=1c2016f9c5ca3323f39e5905\u0026amp;signature=80ab550b907226339034f0679222f59a1fc9fd7f68dd0e031c428ee1dfcfa854\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/invoca-5bd45748/Q9AjSeskElHvFPzD/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Invoca\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#00A87F\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.invoca.com/invoca-design-system/views/detail-view\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/invoca-design-system/views/detail-view.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.invoca.com/#organization\",\"name\":\"Invoca\",\"url\":\"https://docs.invoca.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/invoca-5bd45748/9Md68DqArcq3WD3L/logo/light.svg?fit=max\u0026auto=format\u0026n=9Md68DqArcq3WD3L\u0026q=85\u0026s=3ed629c5be28d08bd1a6580e72b6dbfa\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.invoca.com#website\",\"name\":\"Invoca\",\"url\":\"https://docs.invoca.com\",\"publisher\":{\"@id\":\"https://docs.invoca.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.invoca.com/invoca-design-system/views/detail-view#webpage\",\"url\":\"https://docs.invoca.com/invoca-design-system/views/detail-view\",\"name\":\"Detail view\",\"description\":\"One record, its attributes, and its related data.\",\"dateModified\":\"2026-09-17T18:53:06.000Z\",\"isPartOf\":{\"@id\":\"https://docs.invoca.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.invoca.com/invoca-design-system/views/detail-view#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.invoca.com/invoca-design-system/views/detail-view#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Views\",\"item\":\"https://docs.invoca.com/invoca-design-system/views/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Detail view\",\"item\":\"https://docs.invoca.com/invoca-design-system/views/detail-view\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.invoca.com/invoca-design-system/views/detail-view#article\",\"headline\":\"Detail view\",\"name\":\"Detail view\",\"description\":\"One record, its attributes, and its related data.\",\"url\":\"https://docs.invoca.com/invoca-design-system/views/detail-view\",\"mainEntityOfPage\":{\"@id\":\"https://docs.invoca.com/invoca-design-system/views/detail-view#webpage\"},\"dateModified\":\"2026-09-17T18:53:06.000Z\",\"keywords\":\"detail view, record, attributes, related data, single object, profile page\",\"publisher\":{\"@id\":\"https://docs.invoca.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.invoca.com#website\"}}]}\u003c/script>","siteName":"Invoca","nav":{"global":null,"products":[{"product":"Invoca Docs","pages":[{"title":"Invoca Docs","href":""}]},{"product":"Developer","pages":[{"title":"Developer","href":"/en/latest"}]},{"product":"Invoca Design System","icon":"palette","color":{"light":"#00b388","dark":"#00b388"},"description":"","tabs":[{"tab":"Get started","icon":"rocket","pages":[{"title":"Get started","href":"/invoca-design-system"}]},{"tab":"Foundations","icon":"palette","pages":[{"title":"Foundations","href":"/invoca-design-system/foundations/overview"}]},{"tab":"Content","icon":"font","pages":[{"title":"Content","href":"/invoca-design-system/content/voice-and-tone"}]},{"tab":"Components","icon":"shapes","pages":[{"title":"Components","href":"/invoca-design-system/components/overview"}]},{"tab":"Patterns","icon":"clipboard-list","pages":[{"title":"Patterns","href":"/invoca-design-system/patterns/overview"}]},{"tab":"Views","icon":"table-columns","groups":[{"group":"Views","root":{"title":"Views overview","icon":"layers","href":"/invoca-design-system/views/overview"},"directory":"card","pages":[{"title":"List view","description":"A page whose body is one table of objects of the same kind, scanned and acted on.","icon":"table","tag":"Draft","href":"/invoca-design-system/views/list-view"},{"title":"Detail view","icon":"file-text","tag":"Draft","href":"/invoca-design-system/views/detail-view"},{"title":"Settings view","description":"Configuration grouped into independent sections, on one scrollable page, committed as one unit from a fixed footer.","icon":"settings","tag":"Draft","href":"/invoca-design-system/views/settings-view"},{"title":"Wizard","icon":"list-ordered","tag":"Draft","href":"/invoca-design-system/views/wizard"},{"title":"Dashboard","icon":"layout-dashboard","tag":"Draft","href":"/invoca-design-system/views/dashboard"},{"title":"Split view","icon":"columns-2","tag":"Draft","href":"/invoca-design-system/views/split-view"},{"title":"Full page form","icon":"square-pen","tag":"Draft","href":"/invoca-design-system/views/full-page-form"}]}]},{"tab":"AI Experience","icon":"robot","pages":[{"title":"AI Experience","href":"/invoca-design-system/ai-experience/overview"}]},{"tab":"Contribute","icon":"code-pull-request","pages":[{"title":"Contribute","href":"/invoca-design-system/contribute/governance"}]},{"tab":"Open Issues","icon":"triangle-exclamation","pages":[{"title":"Open Issues","href":"/invoca-design-system/foundations/divergences"}]}]}]},"basePath":"","title":"Detail view - Invoca","buildId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","deploymentId":"dpl_36EDyZCDfRuoUD9af5CH4M1bqY2h","dynamics":[],"chunks":[]}