Conflicts and States
Conflict display
Section titled “Conflict display”Conflict customization is separate from general event rendering so products can apply a consistent warning/error treatment without replacing event content.
grid.eventScheduler = { view: 'resourceTimeline', weekStartDate: '2026-06-08', customization: { conflicts: { className: ({ severity }) => `booking-conflict booking-conflict--${severity}`, properties: ({ conflictTypes }) => ({ 'data-conflict-types': conflictTypes.join(' '), }), indicator: (h, { severity }) => h('span', { class: 'booking-conflict__badge' }, severity === 'error' ? 'Blocked' : 'Review'), tooltip: ({ label }) => `Planning issue: ${label}`, }, },};The scheduler still adds built-in conflict classes, data attributes, and severity attributes to event blocks. Custom conflict hooks run only for conflicted segments.
Empty, loading, and error states
Section titled “Empty, loading, and error states”Remote mode and local empty states can use product-specific wording and markup through labels, emptyStateText, and customization.emptyState.
grid.eventScheduler = { view: 'resourceTimeline', weekStartDate: '2026-06-08', emptyStateText: 'No resources match this view.', labels: { remoteLoading: 'Loading bookings...', remoteError: 'Bookings could not be loaded.', remoteEmpty: 'No bookings in this range.', }, customization: { emptyState: { template: ({ kind, label }) => kind === 'error' ? `Action needed: ${label}` : label, properties: ({ kind }) => ({ class: `booking-scheduler-state booking-scheduler-state--${kind}`, }), }, },};The template can return a string or a DOM node. Property hooks can add classes, style variables, ARIA attributes, and data attributes to the overlay element.