| UI or UX | UI + UX - Workflow for arranging time, attendees, availability, recurrence, and reminders | UI + UX - Date and time grid for scheduled events, availability, and conflicts | UI + UX - Single-date text field with attached calendar menu | UI + UX - Time input with filtered slot list, period selector, and timezone selector | UI + UX - Two date fields with attached range calendar and apply controls | UI + UX - Durable user-opened notification history and action drawer | UI + UX - Competing-version resolution state |
| UI guidance | Render scheduling as a coordinated time-planning workflow with title, calendar, attendees, required and optional people, rooms or resources, location or conference link, date, start and end time, timezone, recurrence, availability, reminders, and save or send outcome. | Render a calendar view around a visible date range, mode switcher, today marker, weekday or time-axis labels, timezone, selected date, and event blocks with start, end, title, status, and all-day or timed placement. | Render a labelled date text field with a persistent format hint and a calendar button that opens a month grid aligned to the field. | Render a labelled time field with persistent hint text, filtered time suggestions, clear selected state, AM/PM control when using 12-hour display, and timezone control when interpretation depends on location. | Render separate labelled start and end date fields with persistent format hints, a calendar trigger, and a shared calendar menu that shows both endpoints and the days between them. | Provide a persistent notification entry point, usually a bell or inbox control, with a count that represents new unseen notifications rather than every unread item forever. | Show both competing versions near the affected object, field, paragraph, file, row, or branch with source labels such as Your edit, Server version, Mina's edit, Target branch, and Current published value. |
| UX guidance | Use scheduling when users arrange a meeting, event, availability rule, or recurring time plan that must account for people, calendars, rooms, buffers, time zones, recurrence, reminders, invitations, or conflicts. | Use calendar view when users need to understand or manage scheduled items by their position in time: date, weekday, duration, overlap, availability, recurrence, or resource assignment. | Use a date picker when choosing a date requires calendar context such as weekday, nearby availability, booking windows, deadlines, or recent/future scheduling. | Use a time picker when users are scheduling or choosing a specific clock time from predictable increments such as 15-minute or 30-minute appointments. | Use a date range picker when users need to select or inspect a continuous period such as a report window, trip, event, booking, campaign, or eligibility span. | Use a notification center when users receive enough asynchronous system or collaboration updates that they need a durable place to review, triage, and act later. | Use conflict state when multiple valid changes overlap and the system needs a human, rule, or review workflow to decide what survives without losing work silently. |
| Good UI | A meeting scheduler shows required attendees, free/busy bars, suggested times, selected timezone, room availability, video link, recurrence, reminders, and a Send invitation button. | A clinic schedule shows June 2026 week view, today marker, timezone, business hours, all-day staff training, timed appointments, room labels, overlap warning, and a More link for crowded days. | An appointment booking field shows Appointment date, hint mm/dd/yyyy, a calendar button, July 2026 grid, disabled weekends, today marker, and selected July 14 date. | An appointment time field shows a label, hint that typing filters 30-minute slots, a 9:30 AM selected option, AM/PM selector, Eastern timezone selector, and canonical value 09:30:00. | An analytics report control shows Since and Until text fields, quick choices for Today and Last 7 days, a two-week calendar grid, selected August 3 start, selected August 14 end, and a filled band for days inside the range. | A bell opens a drawer with Unread and All filters, showing comment mentions, approval requests, export results, and background-job failures in newest-first order. | A field report says Conflict on supervisor comment, shows Your offline edit from 11:06 beside Server edit by Mina at 11:07, and offers Keep mine, Keep server, and Merge comment. |
| Bad UI | A form asks for date and time only, then sends invitations without checking attendee or room conflicts. | A decorative month grid contains colored dots with no event titles, no timezone, no overflow count, and no selected-day detail. | A date of birth field opens today with no text fallback and forces users to page backward month by month through decades. | A single field labelled Time accepts 930 and silently stores it without AM/PM, timezone, or validation message. | A report filter has one field labelled Date and silently stores two dates separated by a dash with no start or end labels. | A red badge says 42 forever because opening the drawer, reading items, and viewing related work never update the count. | A save banner says Something went wrong and only offers Retry after another user changed the same field. |
| Good UX | A team lead adds three required attendees, sees one conflict at 10:00, chooses an 11:30 suggested time, adds a room and video link, sends invitations, and sees pending responses. | A dispatcher switches from month to week, opens Wednesday, sees three overlapping room bookings, chooses an available slot, and receives conflict-aware feedback before saving. | A user opens the calendar, sees weekends unavailable, moves to August, chooses Tuesday 11 August 2026, and reviews stored value 2026-08-11. | A user types 9, filters the list to 9:00 AM and 9:30 AM, chooses 9:30 AM, selects Eastern time, and submits canonical value 09:30:00 America/New_York. | A user chooses Last 7 days, sees 2026-08-08 through 2026-08-14 filled in the calendar, reviews both inputs, then applies the range. | Opening the notification drawer clears the new-notification badge while unread items remain available for later triage. | A user tries to sync an offline field report, reviews only the two changed fields, merges one comment, keeps the server contact number, and commits a resolved version. |
| Bad UX | A scheduler sees an empty-looking time grid because hidden calendars are not included, books a meeting, and later discovers the host is already busy. | A user taps +3 more in a crowded date cell but the calendar navigates away instead of showing the hidden events for that day. | A user selects a disabled Saturday because it was only dimmed, then loses their previous month when the error appears. | A user chooses 2:00 from a list and the service books 2:00 AM because no period selector or timezone context was shown. | A dashboard refreshes on every hovered day while the user is still deciding the end date. | A payment failure that blocks the current checkout is only stored in the notification center and never appears in the task. | The app silently keeps the newest server value and deletes the user's local note. |
| Best fit | Users coordinate time across people, resources, calendars, availability, or recurrence. | Users need to scan or manage scheduled events across dates, days, weeks, months, or resources. | Users are scheduling, booking, planning, or selecting a recent or future date. | Users choose appointment, meeting, delivery, pickup, reminder, or service times. | Users need to select a reporting, analytics, booking, scheduling, campaign, or eligibility period. | Users receive multiple asynchronous updates across objects, jobs, collaborators, approvals, or reminders. | Concurrent users, devices, branches, or background jobs changed the same object or location. |
| Avoid when | The user only needs one remembered date or time field. | Users only need to select one date for a form field. | Users already know the exact date and do not need calendar context. | The answer is approximate, relative, unknown, or naturally expressed in words. | The task asks for only one exact date. | The product has only occasional current-action feedback that a toast or inline status can handle. | Only one operation failed and there is no competing valid version. |
| Required state | Draft event state | Default calendar state with visible range, view mode, timezone, today marker, selected date, and event count. | Closed labelled text field with visible date-format hint and calendar button. | Empty labelled time field with persistent hint and optional timezone default. | Empty start and end fields with visible labels, date-format hints, and a calendar trigger. | Closed entry-point state with zero, new-unseen, and unread-but-seen counts. | No conflict state after automatic safe merge. |
| Accessibility burden | Use labelled fields for title, attendees, required/optional role, date, start time, end time, timezone, recurrence, location, conferencing, reminders, and calendar selection. | Expose date navigation, mode switch, visible range, selected date, today, timezone, and event count as text. | Use a visible label and persistent hint for the text field; do not rely only on text inside the field. | Use a visible label and persistent hint that explain filtering, increments, and time range. | Label start and end fields separately and associate each hint and error with the correct field. | Give the entry-point control an accessible name that includes new or unread count without relying only on a red dot. | Use headings and text labels to name each side of the conflict; do not rely only on red/green diff colors. |
| Common misuse | Treating scheduling as only a date field and a time field. | Using calendar view as a decorative month card for unscheduled content. | Using a calendar picker for a date of birth or other remembered historic date. | Using a minute-by-minute dropdown for a schedule that only accepts 30-minute increments. | Using two unrelated single-date pickers that do not validate order or show included days. | Treating the badge count, unread count, and total notification count as one number. | Treating a conflict as a simple retryable save error. |