A product-style form that keeps validation, dirty state, derived summaries, and async save flow in observables.
The visible UI is reactive, but the state remains simple.
Dirty fields
changes since the last save
Validation errors
blocking save right now
Estimated monthly
derived from plan, seats, and add-ons
Completion
required fields in good shape
Save state
Account
Primary identity and contact details.
Organization
Shown on invoices and the internal summary cards.
The person responsible for the draft.
Contact
Used for save confirmations and review notes.
Separate from the primary contact if needed.
Project
Timeline, scope, and delivery pressure.
Timeline
Used as the main label in the summary.
Raises the derived monthly estimate when urgent.
Scope
Feeds the derived pricing summary.
Affects the per-seat estimate.
Notes
Freeform context for reviewers and implementers.
Optional, but useful when the form becomes a real intake flow.