Skip to main content
Exemplar page — first pass. This is a proposal for review, not established policy — see CRUD overview. This page decides which surface an object’s creation belongs on. What Full-page form and Wizard contain once you’re there is that pair’s own decision, not this page’s — see those pages directly.

The problem

“Add a new one” covers everything from typing a label and hitting enter to configuring a multi-section object with relationships, validation, and its own reporting once it exists. A platform that answers “how do I create something” with one fixed surface is wrong at both ends: a full-page form for a tag is ceremony nobody asked for, and a two-field modal for a campaign starves an object that’s about to have a long life in the product of the room it needs. Invoca’s own product spans that whole range already — a Tag, a saved filter, a Campaign, an integration’s setup — and each one has creation needs shaped by what kind of object it is, not by whichever surface a given team reached for first. This page is the tree that decides the surface. Layout inside that surface is a separate, later decision.

Choosing a surface

Walk the same four axes CRUD overview defines, in order. Each is answered about the object being created, not the feature building it.
1

Permanence — does it outlive this moment?

A Tag is created, gets used, and never has a page of its own — it’s a supporting detail of whatever it’s attached to. A Campaign is created once and then lived in: it gets its own reporting, its own settings, its own URL, for months. That difference alone moves the floor from “modal” to “full page” before density is even asked.
2

Density — how much has to be true before it's valid?

A saved filter might need a name and the filter state that’s already selected — a handful of fields, even though it’s reasonably permanent. That’s the case for a Modal with an escape hatch: default to the fast path, and hand off to the full surface — never discarding what’s already been entered — the moment someone needs more than the modal offers. See TITAN-CREATE-04.
3

Continuity — does losing the parent cost more than the interruption saves?

Creating a Tag while filling out a Campaign form is the case for a Drawer or an inline control: covering the campaign form to go create a tag is a worse interruption than the tag creation itself. Titan’s own Dialog and Drawer pages already state this exact split — Dialog’s “choose something else when” table names Drawer for precisely this case, and Drawer’s own page states the same thing from the other side. This page is citing that answer, not deciding a new one.
4

Sequence — does order matter, and is there enough of it to show?

Setting up a new integration might require a connection step before a mapping step before a review step, each depending on the last. That’s Full page — Wizard, with a step indicator — see TITAN-GAP-26. A single-section object never reaches this branch at all.
“Modal” is this page’s word for what Titan’s design language calls Dialog. Two of the three names in play point at the same thing; the third is a trap. “Modal” (this page) and “Dialog” (the design term, and the docs page this page links to) both mean the styled, themed surface — imported from the package as Modal, per TITAN-DIALOG-01. The package also exports something literally named Dialog — a raw, unstyled primitive with none of Modal’s sizing presets, footer contract, or divider tokens. That export is not a fourth name for the same thing; it’s a different component that happens to share a word with the design term. See TITAN-DIV-27 for the full case. Every link on this page to “Dialog” goes to the design-language page, and every actual import belongs on Modal — never on the package’s raw Dialog export.

When this applies

  • A new object is being added to the product, by a person, as a deliberate action.
  • The object has at least one required field or choice — if there’s nothing to configure, there’s nothing to decide a surface for.

When it doesn’t

Structure

Behavior

Constraints

Content

Accessibility

  • Opening a Modal or Drawer moves focus to the surface’s first field; closing it — by commit, cancel, or Escape — returns focus to the trigger that opened it.
  • A full-page create’s navigation is announced the way any page navigation is; no additional live region is needed beyond what routing already provides.
  • The “More options” escape hatch is a real control with an accessible name stating what it does — “Show more options,” not an icon alone.
  • A Wizard’s step indicator states the current step and total count in text, not only through visual position — “Step 2 of 4,” read by assistive technology, not inferred from which dot is filled in.

Variations

Gaps

  • Bulk creation (import) is not covered by this page and has no proposal yet.
  • Whether a Drawer or a full page is the default for an object type that’s genuinely borderline on Permanence (a “saved view” that some teams treat as disposable and others treat as a first-class asset) is not resolved — this page names the axes but doesn’t adjudicate every real object type against them.

Anti-patterns

One fixed surface for every “create,” regardless of the object. The failure this whole page exists to prevent. A tag and a campaign are not the same kind of decision, and treating them as though they were produces either an over-built tag flow or an under-built campaign one. A Modal that discards entered data when the reader needs “more options.” Offering a shortcut and then punishing the reader for outgrowing it is worse than never offering the shortcut — see TITAN-CREATE-04. A Wizard for sections that don’t actually depend on each other. Forcing linear steps on independent content is friction with no organizing benefit — the reader can’t skip ahead to the one section they came to fill in. CRUD overview, for the shared axes and the compact version of this tree. Update, for what changes once the object already has data. Form validation and Destructive confirmation, cited above rather than restated. Dialog and Drawer, whose own pages already state the continuity split this page relies on.

Why it works this way

The axes are ordered because they’re not equally decisive. Permanence alone rules out or requires a full page before density is even asked — a first-class object doesn’t get demoted to a modal just because it happens to have few fields on day one, and a supporting detail doesn’t get promoted to a full page just because it happens to have several. Asking Density first would produce a modal for a sparse campaign and a full page for a tag with unusually many attributes, which gets the platform’s information architecture backwards. The escape hatch exists because the two ends of the tree aren’t actually separate features. A quick-create Modal and a full creation page for the same object type are one decision expressed at two densities, not two independent flows that happen to create the same kind of thing. Carrying data forward instead of restarting is what keeps that true in practice and not just in principle.
Last modified on September 3, 2026